@pixldocs/canvas-renderer 0.5.410 → 0.5.411

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.
@@ -4704,11 +4704,19 @@ const svgMaskApply = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.define
4704
4704
  syncSvgMaskClipPath
4705
4705
  }, Symbol.toStringTag, { value: "Module" }));
4706
4706
  const SELECTION_BORDER_SCALE$1 = 2;
4707
- const ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX = "[Pixldocs][rotated-group-image-resize]";
4708
- const ROTATED_GROUP_IMAGE_RESIZE_DEBUG_MAX_ENTRIES = 400;
4707
+ const ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX$1 = "[Pixldocs][rotated-group-image-resize]";
4708
+ const ROTATED_GROUP_IMAGE_RESIZE_DEBUG_MAX_ENTRIES$1 = 400;
4709
4709
  function isInsideRotatedActiveSelection(obj) {
4710
- const parent = obj.group;
4711
- if (!(parent instanceof fabric.ActiveSelection)) return false;
4710
+ var _a2;
4711
+ const debugObj = obj;
4712
+ const ownAngle = Math.abs(((obj.angle ?? 0) % 360 + 360) % 360);
4713
+ if ((debugObj.__cropData || debugObj.__cropGroup || ((_a2 = debugObj._ct) == null ? void 0 : _a2.isCropGroup)) && Math.min(ownAngle, 360 - ownAngle) > 0.5) return true;
4714
+ const logicalParentAngle = Math.abs(((debugObj.__pixldocsParentGroupAngle ?? 0) % 360 + 360) % 360);
4715
+ if (debugObj.__pixldocsParentGroupId && Math.min(logicalParentAngle, 360 - logicalParentAngle) > 0.5) return true;
4716
+ const parent = debugObj.group;
4717
+ if (!parent) return false;
4718
+ const pType = parent.type;
4719
+ if (pType !== "activeSelection" && pType !== "group") return false;
4712
4720
  const angle = Math.abs(((parent.angle ?? 0) % 360 + 360) % 360);
4713
4721
  return Math.min(angle, 360 - angle) > 0.5;
4714
4722
  }
@@ -4782,10 +4790,15 @@ function logRotatedGroupImageResize(phase, target, payload = {}) {
4782
4790
  signX: start.signX,
4783
4791
  signY: start.signY
4784
4792
  } : void 0;
4785
- const line = `${ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX} ${phase} ${JSON.stringify(normalize({
4793
+ const line = `${ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX$1} ${phase} ${JSON.stringify(normalize({
4786
4794
  ...payload,
4787
4795
  target: summarizeResizeObject(target),
4788
4796
  parent: summarizeResizeObject(parent),
4797
+ logicalParent: debugTarget.__pixldocsParentGroupId ? {
4798
+ id: debugTarget.__pixldocsParentGroupId,
4799
+ type: debugTarget.__pixldocsParentGroupType,
4800
+ angle: debugTarget.__pixldocsParentGroupAngle
4801
+ } : void 0,
4789
4802
  frameW: ct == null ? void 0 : ct.frameW,
4790
4803
  frameH: ct == null ? void 0 : ct.frameH,
4791
4804
  img: summarizeResizeObject(ct == null ? void 0 : ct._img),
@@ -4794,12 +4807,12 @@ function logRotatedGroupImageResize(phase, target, payload = {}) {
4794
4807
  }))}`;
4795
4808
  if (typeof window !== "undefined") {
4796
4809
  const debugWindow = window;
4797
- debugWindow.__pixldocsRotatedGroupImageResizeLogs = Array.isArray(debugWindow.__pixldocsRotatedGroupImageResizeLogs) ? debugWindow.__pixldocsRotatedGroupImageResizeLogs.slice(-ROTATED_GROUP_IMAGE_RESIZE_DEBUG_MAX_ENTRIES + 1) : [];
4810
+ debugWindow.__pixldocsRotatedGroupImageResizeLogs = Array.isArray(debugWindow.__pixldocsRotatedGroupImageResizeLogs) ? debugWindow.__pixldocsRotatedGroupImageResizeLogs.slice(-ROTATED_GROUP_IMAGE_RESIZE_DEBUG_MAX_ENTRIES$1 + 1) : [];
4798
4811
  debugWindow.__pixldocsRotatedGroupImageResizeLogs.push(line);
4799
4812
  }
4800
4813
  console.log(line);
4801
4814
  } catch {
4802
- console.log(ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX, phase, payload);
4815
+ console.log(ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX$1, phase, payload);
4803
4816
  }
4804
4817
  }
4805
4818
  function clamp$1(v, min, max) {
@@ -5282,6 +5295,12 @@ function installCanvaMaskControls(g) {
5282
5295
  logRotatedGroupImageResize("snap-skipped-active-selection-child", target, { corner });
5283
5296
  return;
5284
5297
  }
5298
+ const ownAngle = Math.abs(((target.angle ?? 0) % 360 + 360) % 360);
5299
+ const parentAngle = Math.abs(((target.__pixldocsParentGroupAngle ?? 0) % 360 + 360) % 360);
5300
+ if (Math.min(ownAngle, 360 - ownAngle) > 0.5 || Math.min(parentAngle, 360 - parentAngle) > 0.5) {
5301
+ logRotatedGroupImageResize("snap-skipped-rotated-image", target, { corner, ownAngle, parentAngle });
5302
+ return;
5303
+ }
5285
5304
  const handler = target.__resizeSnapHandler;
5286
5305
  if (typeof handler === "function") {
5287
5306
  logRotatedGroupImageResize("snap-before", target, { corner });
@@ -11382,10 +11401,34 @@ const summarizeFabricObjectForResizeDebug = (obj) => {
11382
11401
  const logGroupTextResizeDebug = (phase, payload) => {
11383
11402
  return;
11384
11403
  };
11404
+ const ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX = "[Pixldocs][rotated-group-image-resize]";
11405
+ const ROTATED_GROUP_IMAGE_RESIZE_DEBUG_MAX_ENTRIES = 400;
11385
11406
  const roundRotDriftNumber = (value) => {
11386
11407
  if (typeof value !== "number") return value;
11387
11408
  return Number.isFinite(value) ? Math.round(value * 1e3) / 1e3 : String(value);
11388
11409
  };
11410
+ const normalizeRotDriftPayload = (value) => {
11411
+ const seen = /* @__PURE__ */ new WeakSet();
11412
+ const normalize = (entry) => {
11413
+ if (entry == null) return entry;
11414
+ const valueType = typeof entry;
11415
+ if (valueType === "number") return roundRotDriftNumber(entry);
11416
+ if (valueType === "string" || valueType === "boolean") return entry;
11417
+ if (Array.isArray(entry)) return entry.map((item) => normalize(item));
11418
+ if (valueType === "object") {
11419
+ if (seen.has(entry)) return "[Circular]";
11420
+ seen.add(entry);
11421
+ if (entry instanceof fabric.FabricObject) return normalize(summarizeRotDriftObject(entry));
11422
+ const output = {};
11423
+ Object.entries(entry).forEach(([key, item]) => {
11424
+ output[key] = normalize(item);
11425
+ });
11426
+ return output;
11427
+ }
11428
+ return String(entry);
11429
+ };
11430
+ return normalize(value);
11431
+ };
11389
11432
  const matrixForRotDriftLog = (matrix) => {
11390
11433
  if (!matrix) return void 0;
11391
11434
  return matrix.map((entry) => roundRotDriftNumber(entry));
@@ -11443,6 +11486,20 @@ const summarizeRotDriftObject = (obj, worldMatrix) => {
11443
11486
  const logRotGroupImageDrift = (phase, payload) => {
11444
11487
  return;
11445
11488
  };
11489
+ const logRotatedGroupImageResizeDebug = (phase, payload) => {
11490
+ if (typeof console === "undefined") return;
11491
+ try {
11492
+ const line = `${ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX} ${phase} ${JSON.stringify(normalizeRotDriftPayload(payload))}`;
11493
+ if (typeof window !== "undefined") {
11494
+ const debugWindow = window;
11495
+ debugWindow.__pixldocsRotatedGroupImageResizeLogs = Array.isArray(debugWindow.__pixldocsRotatedGroupImageResizeLogs) ? debugWindow.__pixldocsRotatedGroupImageResizeLogs.slice(-ROTATED_GROUP_IMAGE_RESIZE_DEBUG_MAX_ENTRIES + 1) : [];
11496
+ debugWindow.__pixldocsRotatedGroupImageResizeLogs.push(line);
11497
+ }
11498
+ console.log(line);
11499
+ } catch {
11500
+ console.log(ROTATED_GROUP_IMAGE_RESIZE_DEBUG_PREFIX, phase, payload);
11501
+ }
11502
+ };
11446
11503
  const shouldLogRotDriftLiveTick = (target, phase) => {
11447
11504
  return false;
11448
11505
  };
@@ -12248,6 +12305,22 @@ const PageCanvas = forwardRef(
12248
12305
  [canvasWidth, canvasHeight, getLogicalGroupSnapBoundsCallback, getResizeExcludeIdsCallback]
12249
12306
  );
12250
12307
  const installImageResizeControlsWithSnap = useCallback((group) => {
12308
+ var _a2;
12309
+ try {
12310
+ const groupId = getObjectId(group);
12311
+ const pageChildrenNow = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
12312
+ const parent = groupId ? findParentGroup(pageChildrenNow, groupId) : null;
12313
+ if (parent) {
12314
+ group.__pixldocsParentGroupId = parent.id;
12315
+ group.__pixldocsParentGroupAngle = parent.angle ?? 0;
12316
+ group.__pixldocsParentGroupType = "logical-group";
12317
+ } else {
12318
+ delete group.__pixldocsParentGroupId;
12319
+ delete group.__pixldocsParentGroupAngle;
12320
+ delete group.__pixldocsParentGroupType;
12321
+ }
12322
+ } catch {
12323
+ }
12251
12324
  group.__resizeSnapHandler = (target, corner) => {
12252
12325
  const fc = fabricRef.current ?? target.canvas;
12253
12326
  if (!fc || !isActiveRef.current || !corner) return;
@@ -14281,7 +14354,7 @@ const PageCanvas = forwardRef(
14281
14354
  fabricCanvas.on("selection:cleared", () => {
14282
14355
  });
14283
14356
  fabricCanvas.on("object:scaling", (e) => {
14284
- var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j;
14357
+ var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
14285
14358
  if (!isActiveRef.current) return;
14286
14359
  const t = e.target;
14287
14360
  if (t) lastResizeScaleTargetRef.current = t;
@@ -14452,12 +14525,61 @@ const PageCanvas = forwardRef(
14452
14525
  const corner = (transform == null ? void 0 : transform.corner) || "";
14453
14526
  if (obj instanceof fabric.ActiveSelection && corner) {
14454
14527
  activeSelectionResizeHandleRef.current = corner;
14528
+ const imageChildrenForResizeDebug = obj.getObjects().filter(
14529
+ (child) => {
14530
+ var _a3;
14531
+ return child instanceof fabric.FabricImage || child instanceof fabric.Group && (child.__cropGroup || ((_a3 = child._ct) == null ? void 0 : _a3.isCropGroup));
14532
+ }
14533
+ );
14534
+ const normalizedSelectionAngle = ((obj.angle ?? 0) % 360 + 360) % 360;
14535
+ const activeLogicalGroupId = obj.__pixldocsGroupSelection;
14536
+ const transformStartForDebug = activeLogicalGroupId && ((_c2 = groupSelectionTransformStartRef.current) == null ? void 0 : _c2.groupId) === activeLogicalGroupId ? groupSelectionTransformStartRef.current : null;
14537
+ const logicalGroupAngle = (transformStartForDebug == null ? void 0 : transformStartForDebug.groupAngle) ?? obj.__pixldocsFrozenGroupAngle ?? 0;
14538
+ const normalizedLogicalGroupAngle = (logicalGroupAngle % 360 + 360) % 360;
14539
+ const isRotatedImageSelection = imageChildrenForResizeDebug.length > 0 && (Math.min(normalizedSelectionAngle, 360 - normalizedSelectionAngle) > 0.5 || Math.min(normalizedLogicalGroupAngle, 360 - normalizedLogicalGroupAngle) > 0.5);
14540
+ if (isRotatedImageSelection) {
14541
+ const countKey = "__pixldocsRotatedImageResizeScaleTickCount";
14542
+ const count = (obj[countKey] ?? 0) + 1;
14543
+ obj[countKey] = count;
14544
+ if (count <= 5 || count % 8 === 0) {
14545
+ logRotatedGroupImageResizeDebug("active-selection-scaling", {
14546
+ time: Math.round(performance.now()),
14547
+ tick: count,
14548
+ handle: corner,
14549
+ groupSelectionId: activeLogicalGroupId,
14550
+ selectedStoreIds: useEditorStore.getState().canvas.selectedIds,
14551
+ route: typeof window !== "undefined" ? window.location.pathname : void 0,
14552
+ transformAction: (_d = fabricCanvas._currentTransform) == null ? void 0 : _d.action,
14553
+ transformCorner: (_e = fabricCanvas._currentTransform) == null ? void 0 : _e.corner,
14554
+ transformOriginal: (() => {
14555
+ var _a3;
14556
+ const original = (_a3 = fabricCanvas._currentTransform) == null ? void 0 : _a3.original;
14557
+ return original ? {
14558
+ left: original.left,
14559
+ top: original.top,
14560
+ width: original.width,
14561
+ height: original.height,
14562
+ scaleX: original.scaleX,
14563
+ scaleY: original.scaleY,
14564
+ angle: original.angle
14565
+ } : null;
14566
+ })(),
14567
+ transformStart: transformStartForDebug,
14568
+ selection: summarizeRotDriftObject(obj),
14569
+ imageChildren: imageChildrenForResizeDebug.map((child, childIndex) => ({
14570
+ childIndex,
14571
+ id: getObjectId(child),
14572
+ object: summarizeRotDriftObject(child)
14573
+ }))
14574
+ });
14575
+ }
14576
+ }
14455
14577
  if (isCornerResizeHandle(corner) && obj.getObjects().some((child) => child instanceof fabric.Textbox)) {
14456
14578
  obj.__pixldocsLastGroupTextScaleDebug = {
14457
14579
  time: Math.round(performance.now()),
14458
14580
  corner,
14459
14581
  groupSelectionId: obj.__pixldocsGroupSelection,
14460
- currentTransformAction: (_c2 = fabricCanvas._currentTransform) == null ? void 0 : _c2.action,
14582
+ currentTransformAction: (_f = fabricCanvas._currentTransform) == null ? void 0 : _f.action,
14461
14583
  selection: summarizeFabricObjectForResizeDebug(obj),
14462
14584
  textChildren: obj.getObjects().filter((child) => child instanceof fabric.Textbox).map((child) => summarizeFabricObjectForResizeDebug(child))
14463
14585
  };
@@ -14466,17 +14588,17 @@ const PageCanvas = forwardRef(
14466
14588
  if (obj instanceof fabric.ActiveSelection && (corner === "ml" || corner === "mr" || corner === "mt" || corner === "mb")) {
14467
14589
  const isXSide = corner === "ml" || corner === "mr";
14468
14590
  const _cur = fabricCanvas._currentTransform;
14469
- const startSx = Math.abs(Number(((_d = _cur == null ? void 0 : _cur.original) == null ? void 0 : _d.scaleX) ?? 1)) || 1;
14470
- const startSy = Math.abs(Number(((_e = _cur == null ? void 0 : _cur.original) == null ? void 0 : _e.scaleY) ?? 1)) || 1;
14591
+ const startSx = Math.abs(Number(((_g = _cur == null ? void 0 : _cur.original) == null ? void 0 : _g.scaleX) ?? 1)) || 1;
14592
+ const startSy = Math.abs(Number(((_h = _cur == null ? void 0 : _cur.original) == null ? void 0 : _h.scaleY) ?? 1)) || 1;
14471
14593
  const sAxis = isXSide ? Math.abs((obj.scaleX ?? 1) / startSx) : Math.abs((obj.scaleY ?? 1) / startSy);
14472
14594
  if (sAxis > 1e-3) {
14473
- if (isXSide && ((_f = groupShiftReflowSnapshotRef.current) == null ? void 0 : _f.selection) !== obj) {
14595
+ if (isXSide && ((_i = groupShiftReflowSnapshotRef.current) == null ? void 0 : _i.selection) !== obj) {
14474
14596
  groupShiftReflowSnapshotRef.current = null;
14475
14597
  const logicalGroupId = obj.__pixldocsGroupSelection;
14476
14598
  if (logicalGroupId) {
14477
14599
  try {
14478
14600
  const state = useEditorStore.getState();
14479
- const pageChildren2 = ((_g = state.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _g.children) ?? [];
14601
+ const pageChildren2 = ((_j = state.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
14480
14602
  const groupNode = findNodeById(pageChildren2, logicalGroupId);
14481
14603
  if (groupNode && isGroup(groupNode) && !isStackLayoutMode(groupNode.layoutMode)) {
14482
14604
  const entries = obj.getObjects().map((c) => ({
@@ -14514,7 +14636,7 @@ const PageCanvas = forwardRef(
14514
14636
  }
14515
14637
  continue;
14516
14638
  }
14517
- if (child instanceof fabric.Group && (child.__cropGroup || ((_h = child._ct) == null ? void 0 : _h.isCropGroup))) {
14639
+ if (child instanceof fabric.Group && (child.__cropGroup || ((_k = child._ct) == null ? void 0 : _k.isCropGroup))) {
14518
14640
  const ct = child.__cropData;
14519
14641
  if (!ct) continue;
14520
14642
  if (child.__asLiveOrigAngle == null) {
@@ -14681,7 +14803,7 @@ const PageCanvas = forwardRef(
14681
14803
  child.dirty = true;
14682
14804
  didReflowTextChild = true;
14683
14805
  }
14684
- if (isXSide && ((_i = groupShiftReflowSnapshotRef.current) == null ? void 0 : _i.selection) === obj) {
14806
+ if (isXSide && ((_l = groupShiftReflowSnapshotRef.current) == null ? void 0 : _l.selection) === obj) {
14685
14807
  const snap = groupShiftReflowSnapshotRef.current;
14686
14808
  const anchorEntry = snap.children[0];
14687
14809
  const anchorTopLive = anchorEntry.obj.top ?? 0;
@@ -14842,7 +14964,7 @@ const PageCanvas = forwardRef(
14842
14964
  setGuides(gridGuidesForScale.length ? [...scaleGuides, ...gridGuidesForScale] : scaleGuides);
14843
14965
  if (drilledGroupIdRef.current) {
14844
14966
  try {
14845
- (_j = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _j.call(fabricCanvas);
14967
+ (_m = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _m.call(fabricCanvas);
14846
14968
  } catch {
14847
14969
  }
14848
14970
  }
@@ -25251,9 +25373,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
25251
25373
  }
25252
25374
  return svgString;
25253
25375
  }
25254
- const resolvedPackageVersion = "0.5.410";
25376
+ const resolvedPackageVersion = "0.5.411";
25255
25377
  const PACKAGE_VERSION = resolvedPackageVersion;
25256
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.410";
25378
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.411";
25257
25379
  const roundParityValue = (value) => {
25258
25380
  if (typeof value !== "number") return value;
25259
25381
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -26067,7 +26189,7 @@ class PixldocsRenderer {
26067
26189
  await this.waitForCanvasScene(container, cloned, i);
26068
26190
  }
26069
26191
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
26070
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-DE2UhH5g.js");
26192
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-DgFZfNsT.js");
26071
26193
  const prepared = preparePagesForExport(
26072
26194
  cloned.pages,
26073
26195
  canvasWidth,
@@ -28387,7 +28509,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
28387
28509
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
28388
28510
  sanitizeSvgTreeForPdf(svgToDraw);
28389
28511
  try {
28390
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-DE2UhH5g.js");
28512
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-DgFZfNsT.js");
28391
28513
  try {
28392
28514
  await logTextMeasurementDiagnostic(svgToDraw);
28393
28515
  } catch {
@@ -28787,4 +28909,4 @@ export {
28787
28909
  buildTeaserBlurFlatKeys as y,
28788
28910
  collectFontDescriptorsFromConfig as z
28789
28911
  };
28790
- //# sourceMappingURL=index-CS_cFpCL.js.map
28912
+ //# sourceMappingURL=index-DIx3vAjy.js.map