@pixldocs/canvas-renderer 0.5.359 → 0.5.361

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.
@@ -11087,6 +11087,136 @@ const logGroupTextResizeDebug = (phase, payload) => {
11087
11087
  console.log(GROUP_TEXT_RESIZE_DEBUG_PREFIX, phase, payload);
11088
11088
  }
11089
11089
  };
11090
+ const ROT_GROUP_IMAGE_DRIFT_DEBUG_PREFIX = "[Pixldocs][rot-group-image-drift]";
11091
+ const ROT_GROUP_IMAGE_DRIFT_DEBUG_MAX_ENTRIES = 500;
11092
+ const roundRotDriftNumber = (value) => {
11093
+ if (typeof value !== "number") return value;
11094
+ return Number.isFinite(value) ? Math.round(value * 1e3) / 1e3 : String(value);
11095
+ };
11096
+ const normalizeRotDriftPayload = (value) => {
11097
+ const seen = /* @__PURE__ */ new WeakSet();
11098
+ const normalize = (entry) => {
11099
+ if (entry == null) return entry;
11100
+ const valueType = typeof entry;
11101
+ if (valueType === "number") return roundRotDriftNumber(entry);
11102
+ if (valueType === "string" || valueType === "boolean") return entry;
11103
+ if (Array.isArray(entry)) return entry.map((item) => normalize(item));
11104
+ if (valueType === "object") {
11105
+ if (seen.has(entry)) return "[Circular]";
11106
+ seen.add(entry);
11107
+ if (entry instanceof fabric.FabricObject) return normalize(summarizeRotDriftObject(entry));
11108
+ const output = {};
11109
+ Object.entries(entry).forEach(([key, item]) => {
11110
+ output[key] = normalize(item);
11111
+ });
11112
+ return output;
11113
+ }
11114
+ return String(entry);
11115
+ };
11116
+ return normalize(value);
11117
+ };
11118
+ const matrixForRotDriftLog = (matrix) => {
11119
+ if (!matrix) return void 0;
11120
+ return matrix.map((entry) => roundRotDriftNumber(entry));
11121
+ };
11122
+ const summarizeRotDriftObject = (obj, worldMatrix) => {
11123
+ var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
11124
+ if (!obj) return null;
11125
+ const anyObj = obj;
11126
+ try {
11127
+ const ownMatrix = (_a2 = obj.calcOwnMatrix) == null ? void 0 : _a2.call(obj);
11128
+ const calcWorld = worldMatrix ?? ((_b2 = obj.calcTransformMatrix) == null ? void 0 : _b2.call(obj));
11129
+ const decomposed = calcWorld ? fabric.util.qrDecompose(calcWorld) : null;
11130
+ const center = (_c = obj.getCenterPoint) == null ? void 0 : _c.call(obj);
11131
+ const rect = (_d = obj.getBoundingRect) == null ? void 0 : _d.call(obj);
11132
+ return {
11133
+ id: getObjectId(obj),
11134
+ type: anyObj.type ?? ((_e = obj.constructor) == null ? void 0 : _e.name),
11135
+ isAS: obj instanceof fabric.ActiveSelection,
11136
+ isGroup: obj instanceof fabric.Group,
11137
+ isImage: obj instanceof fabric.FabricImage,
11138
+ isCropGroup: Boolean(anyObj.__cropGroup || ((_f = anyObj._ct) == null ? void 0 : _f.isCropGroup)),
11139
+ hasLayoutManager: Boolean(anyObj.layoutManager),
11140
+ left: obj.left,
11141
+ top: obj.top,
11142
+ angle: obj.angle,
11143
+ scaleX: obj.scaleX,
11144
+ scaleY: obj.scaleY,
11145
+ width: obj.width,
11146
+ height: obj.height,
11147
+ originX: obj.originX,
11148
+ originY: obj.originY,
11149
+ centerX: center == null ? void 0 : center.x,
11150
+ centerY: center == null ? void 0 : center.y,
11151
+ brLeft: rect == null ? void 0 : rect.left,
11152
+ brTop: rect == null ? void 0 : rect.top,
11153
+ brWidth: rect == null ? void 0 : rect.width,
11154
+ brHeight: rect == null ? void 0 : rect.height,
11155
+ worldTx: decomposed == null ? void 0 : decomposed.translateX,
11156
+ worldTy: decomposed == null ? void 0 : decomposed.translateY,
11157
+ worldAngle: decomposed == null ? void 0 : decomposed.angle,
11158
+ worldScaleX: decomposed == null ? void 0 : decomposed.scaleX,
11159
+ worldScaleY: decomposed == null ? void 0 : decomposed.scaleY,
11160
+ ownMatrix: matrixForRotDriftLog(ownMatrix ?? null),
11161
+ worldMatrix: matrixForRotDriftLog(calcWorld ?? null),
11162
+ cropFrameW: (_g = anyObj.__cropData) == null ? void 0 : _g.frameW,
11163
+ cropFrameH: (_h = anyObj.__cropData) == null ? void 0 : _h.frameH,
11164
+ cropPanX: (_k = (_j = (_i = anyObj.__cropData) == null ? void 0 : _i._img) == null ? void 0 : _j._ct) == null ? void 0 : _k.panX,
11165
+ cropPanY: (_n = (_m = (_l = anyObj.__cropData) == null ? void 0 : _l._img) == null ? void 0 : _m._ct) == null ? void 0 : _n.panY,
11166
+ cropZoom: (_q = (_p = (_o = anyObj.__cropData) == null ? void 0 : _o._img) == null ? void 0 : _p._ct) == null ? void 0 : _q.zoom
11167
+ };
11168
+ } catch (error) {
11169
+ return { id: getObjectId(obj), type: anyObj.type, error: String(error) };
11170
+ }
11171
+ };
11172
+ const logRotGroupImageDrift = (phase, payload) => {
11173
+ if (typeof console === "undefined") return;
11174
+ try {
11175
+ const line = `${ROT_GROUP_IMAGE_DRIFT_DEBUG_PREFIX} ${phase} ${JSON.stringify(normalizeRotDriftPayload(payload))}`;
11176
+ if (typeof window !== "undefined") {
11177
+ const debugWindow = window;
11178
+ debugWindow.__pixldocsRotGroupImageDriftLogs = Array.isArray(debugWindow.__pixldocsRotGroupImageDriftLogs) ? debugWindow.__pixldocsRotGroupImageDriftLogs.slice(-ROT_GROUP_IMAGE_DRIFT_DEBUG_MAX_ENTRIES + 1) : [];
11179
+ debugWindow.__pixldocsRotGroupImageDriftLogs.push(line);
11180
+ }
11181
+ console.log(line);
11182
+ } catch {
11183
+ console.log(ROT_GROUP_IMAGE_DRIFT_DEBUG_PREFIX, phase, payload);
11184
+ }
11185
+ };
11186
+ const shouldLogRotDriftLiveTick = (target, phase) => {
11187
+ if (!target) return false;
11188
+ const anyTarget = target;
11189
+ const key = `__pixldocsRotDrift_${phase}_count`;
11190
+ const count = (anyTarget[key] ?? 0) + 1;
11191
+ anyTarget[key] = count;
11192
+ return count <= 3 || count % 8 === 0;
11193
+ };
11194
+ const logRotDriftSelectionSnapshot = (phase, target, extra = {}) => {
11195
+ if (!target) return;
11196
+ const anyTarget = target;
11197
+ const kids = typeof anyTarget.getObjects === "function" ? anyTarget.getObjects() : [];
11198
+ const selectionMatrix = target instanceof fabric.ActiveSelection ? target.calcTransformMatrix() : null;
11199
+ logRotGroupImageDrift(phase, {
11200
+ ...extra,
11201
+ target: summarizeRotDriftObject(target),
11202
+ childCount: kids.length,
11203
+ groupSelectionId: anyTarget.__pixldocsGroupSelection,
11204
+ alignedAngle: anyTarget.__pixldocsAlignedAngle
11205
+ });
11206
+ kids.forEach((kid, childIndex) => {
11207
+ var _a2, _b2;
11208
+ const childWorldMatrix = selectionMatrix ? fabric.util.multiplyTransformMatrices(
11209
+ selectionMatrix,
11210
+ kid.calcOwnMatrix()
11211
+ ) : (_a2 = kid.calcTransformMatrix) == null ? void 0 : _a2.call(kid);
11212
+ logRotGroupImageDrift(`${phase}-child`, {
11213
+ ...extra,
11214
+ childIndex,
11215
+ parentType: anyTarget.type ?? ((_b2 = target.constructor) == null ? void 0 : _b2.name),
11216
+ child: summarizeRotDriftObject(kid, childWorldMatrix ?? null)
11217
+ });
11218
+ });
11219
+ };
11090
11220
  const bakeTextboxScaleIntoTypography = (obj, sourceElement) => {
11091
11221
  const sx = Math.abs(obj.scaleX ?? 1) || 1;
11092
11222
  const sy = Math.abs(obj.scaleY ?? 1) || 1;
@@ -11196,6 +11326,7 @@ function applyWarpAwareSelectionBorders(selection) {
11196
11326
  selection.calcTransformMatrix()
11197
11327
  );
11198
11328
  kids.forEach((k, index) => {
11329
+ const beforeRestore = summarizeRotDriftObject(k);
11199
11330
  const localMatrix = fabric.util.multiplyTransformMatrices(
11200
11331
  invSelection,
11201
11332
  worldMatrices[index]
@@ -11214,8 +11345,19 @@ function applyWarpAwareSelectionBorders(selection) {
11214
11345
  }
11215
11346
  k.setCoords();
11216
11347
  k.dirty = true;
11348
+ logRotGroupImageDrift("aligned-restore-child", {
11349
+ targetAngle,
11350
+ childIndex: index,
11351
+ before: beforeRestore,
11352
+ expectedLocal: fabric.util.qrDecompose(localMatrix),
11353
+ after: summarizeRotDriftObject(k)
11354
+ });
11217
11355
  });
11218
11356
  };
11357
+ logRotDriftSelectionSnapshot("aligned-before", selection, {
11358
+ targetAngle,
11359
+ worldAngles
11360
+ });
11219
11361
  selection.set({ angle: targetAngle, scaleX: 1, scaleY: 1, skewX: 0, skewY: 0 });
11220
11362
  restoreKidsFromWorld();
11221
11363
  try {
@@ -11226,6 +11368,10 @@ function applyWarpAwareSelectionBorders(selection) {
11226
11368
  selection.setCoords();
11227
11369
  selection.dirty = true;
11228
11370
  selection.__pixldocsAlignedAngle = targetAngle;
11371
+ logRotDriftSelectionSnapshot("aligned-after", selection, {
11372
+ targetAngle,
11373
+ worldAngles
11374
+ });
11229
11375
  }
11230
11376
  }
11231
11377
  }
@@ -12273,6 +12419,10 @@ const PageCanvas = forwardRef(
12273
12419
  selectionLeft: rect.left,
12274
12420
  selectionTop: rect.top
12275
12421
  };
12422
+ logRotDriftSelectionSnapshot("mouse-down-active-selection", active, {
12423
+ time: Math.round(performance.now()),
12424
+ selectedStoreIds: useEditorStore.getState().canvas.selectedIds
12425
+ });
12276
12426
  }
12277
12427
  if (fabricCanvas._currentTransform) {
12278
12428
  fabricCanvas.__isUserTransforming = true;
@@ -12885,6 +13035,14 @@ const PageCanvas = forwardRef(
12885
13035
  groupTop: groupAbs.top,
12886
13036
  selectionAngle: ((active.angle ?? 0) % 360 + 360) % 360
12887
13037
  };
13038
+ logRotDriftSelectionSnapshot("transform-start", active, {
13039
+ time: Math.round(performance.now()),
13040
+ groupId,
13041
+ groupAbs,
13042
+ selectionRect: rect,
13043
+ transformStart: groupSelectionTransformStartRef.current,
13044
+ selectedStoreIds: useEditorStore.getState().canvas.selectedIds
13045
+ });
12888
13046
  };
12889
13047
  const restoreGroupSelectionVisualState = (selection, groupId) => {
12890
13048
  applyLogicalGroupSelectionVisualState(selection, groupId);
@@ -13671,13 +13829,22 @@ const PageCanvas = forwardRef(
13671
13829
  fabricCanvas.on("selection:cleared", () => {
13672
13830
  });
13673
13831
  fabricCanvas.on("object:scaling", (e) => {
13674
- var _a2, _b2, _c, _d, _e, _f;
13832
+ var _a2, _b2, _c, _d, _e, _f, _g, _h;
13675
13833
  if (!isActiveRef.current) return;
13676
13834
  const t = e.target;
13677
13835
  if (t) lastResizeScaleTargetRef.current = t;
13678
13836
  prepareGroupSelectionTransformStart(t);
13679
13837
  markTransforming(t);
13680
13838
  didTransformRef.current = true;
13839
+ if (shouldLogRotDriftLiveTick(t, "scaling")) {
13840
+ logRotDriftSelectionSnapshot("scaling", t, {
13841
+ time: Math.round(performance.now()),
13842
+ corner: t == null ? void 0 : t.__corner,
13843
+ transformAction: (_a2 = fabricCanvas._currentTransform) == null ? void 0 : _a2.action,
13844
+ transformCorner: (_b2 = fabricCanvas._currentTransform) == null ? void 0 : _b2.corner,
13845
+ transformStart: groupSelectionTransformStartRef.current
13846
+ });
13847
+ }
13681
13848
  const transformTargetId = t ? getObjectId(t) : null;
13682
13849
  if (transformTargetId && transformTargetId !== "__background__") {
13683
13850
  preserveSelectionAfterTransformIdRef.current = transformTargetId;
@@ -13838,7 +14005,7 @@ const PageCanvas = forwardRef(
13838
14005
  time: Math.round(performance.now()),
13839
14006
  corner,
13840
14007
  groupSelectionId: obj.__pixldocsGroupSelection,
13841
- currentTransformAction: (_a2 = fabricCanvas._currentTransform) == null ? void 0 : _a2.action,
14008
+ currentTransformAction: (_c = fabricCanvas._currentTransform) == null ? void 0 : _c.action,
13842
14009
  selection: summarizeFabricObjectForResizeDebug(obj),
13843
14010
  textChildren: obj.getObjects().filter((child) => child instanceof fabric.Textbox).map((child) => summarizeFabricObjectForResizeDebug(child))
13844
14011
  };
@@ -13848,13 +14015,13 @@ const PageCanvas = forwardRef(
13848
14015
  const isXSide = corner === "ml" || corner === "mr";
13849
14016
  const sAxis = isXSide ? Math.abs(obj.scaleX ?? 1) : Math.abs(obj.scaleY ?? 1);
13850
14017
  if (sAxis > 1e-3) {
13851
- if (isXSide && ((_b2 = groupShiftReflowSnapshotRef.current) == null ? void 0 : _b2.selection) !== obj) {
14018
+ if (isXSide && ((_d = groupShiftReflowSnapshotRef.current) == null ? void 0 : _d.selection) !== obj) {
13852
14019
  groupShiftReflowSnapshotRef.current = null;
13853
14020
  const logicalGroupId = obj.__pixldocsGroupSelection;
13854
14021
  if (logicalGroupId) {
13855
14022
  try {
13856
14023
  const state = useEditorStore.getState();
13857
- const pageChildren2 = ((_c = state.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c.children) ?? [];
14024
+ const pageChildren2 = ((_e = state.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
13858
14025
  const groupNode = findNodeById(pageChildren2, logicalGroupId);
13859
14026
  if (groupNode && isGroup(groupNode) && !isStackLayoutMode(groupNode.layoutMode)) {
13860
14027
  const entries = obj.getObjects().map((c) => ({
@@ -13884,7 +14051,7 @@ const PageCanvas = forwardRef(
13884
14051
  const asRect0 = obj.getBoundingRect();
13885
14052
  let didReflowTextChild = false;
13886
14053
  for (const child of obj.getObjects()) {
13887
- if (child instanceof fabric.Group && (child.__cropGroup || ((_d = child._ct) == null ? void 0 : _d.isCropGroup))) {
14054
+ if (child instanceof fabric.Group && (child.__cropGroup || ((_f = child._ct) == null ? void 0 : _f.isCropGroup))) {
13888
14055
  const ct = child.__cropData;
13889
14056
  if (!ct) continue;
13890
14057
  if (isXSide) {
@@ -13989,7 +14156,7 @@ const PageCanvas = forwardRef(
13989
14156
  didReflowTextChild = true;
13990
14157
  }
13991
14158
  }
13992
- if (isXSide && ((_e = groupShiftReflowSnapshotRef.current) == null ? void 0 : _e.selection) === obj) {
14159
+ if (isXSide && ((_g = groupShiftReflowSnapshotRef.current) == null ? void 0 : _g.selection) === obj) {
13993
14160
  const snap = groupShiftReflowSnapshotRef.current;
13994
14161
  const anchorEntry = snap.children[0];
13995
14162
  const anchorTopLive = anchorEntry.obj.top ?? 0;
@@ -14145,7 +14312,7 @@ const PageCanvas = forwardRef(
14145
14312
  setGuides(gridGuidesForScale.length ? [...scaleGuides, ...gridGuidesForScale] : scaleGuides);
14146
14313
  if (drilledGroupIdRef.current) {
14147
14314
  try {
14148
- (_f = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _f.call(fabricCanvas);
14315
+ (_h = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _h.call(fabricCanvas);
14149
14316
  } catch {
14150
14317
  }
14151
14318
  }
@@ -14236,9 +14403,18 @@ const PageCanvas = forwardRef(
14236
14403
  }
14237
14404
  });
14238
14405
  fabricCanvas.on("object:rotating", (e) => {
14406
+ var _a2, _b2;
14239
14407
  markSimpleTransform(e);
14240
14408
  didTransformRef.current = true;
14241
14409
  const tr = e.target;
14410
+ if (shouldLogRotDriftLiveTick(tr, "rotating")) {
14411
+ logRotDriftSelectionSnapshot("rotating", tr, {
14412
+ time: Math.round(performance.now()),
14413
+ transformAction: (_a2 = fabricCanvas._currentTransform) == null ? void 0 : _a2.action,
14414
+ transformCorner: (_b2 = fabricCanvas._currentTransform) == null ? void 0 : _b2.corner,
14415
+ transformStart: groupSelectionTransformStartRef.current
14416
+ });
14417
+ }
14242
14418
  try {
14243
14419
  const getCursor = fabricCanvas.__pixldocsGetRotateCursor;
14244
14420
  const upper = fabricCanvas.upperCanvasEl;
@@ -14267,10 +14443,19 @@ const PageCanvas = forwardRef(
14267
14443
  didTransformRef.current = true;
14268
14444
  });
14269
14445
  fabricCanvas.on("object:moving", (e) => {
14446
+ var _a2, _b2;
14270
14447
  if (!isActiveRef.current) return;
14271
14448
  prepareGroupSelectionTransformStart(e.target);
14272
14449
  markTransforming(e.target);
14273
14450
  didTransformRef.current = true;
14451
+ if (shouldLogRotDriftLiveTick(e.target, "moving")) {
14452
+ logRotDriftSelectionSnapshot("moving", e.target, {
14453
+ time: Math.round(performance.now()),
14454
+ transformAction: (_a2 = fabricCanvas._currentTransform) == null ? void 0 : _a2.action,
14455
+ transformCorner: (_b2 = fabricCanvas._currentTransform) == null ? void 0 : _b2.corner,
14456
+ transformStart: groupSelectionTransformStartRef.current
14457
+ });
14458
+ }
14274
14459
  const activeDuringMove = fabricCanvas.getActiveObject();
14275
14460
  const movingLogicalGroupId = activeDuringMove instanceof fabric.ActiveSelection ? activeDuringMove.__pixldocsGroupSelection : void 0;
14276
14461
  const pendingMoveDrill = pendingGroupDrillInRef.current;
@@ -14607,6 +14792,15 @@ const PageCanvas = forwardRef(
14607
14792
  activeObjects = activeObjects[0].getObjects();
14608
14793
  }
14609
14794
  const isActiveSelection = activeObj instanceof fabric.ActiveSelection || activeObjects.length > 1;
14795
+ if (activeObj instanceof fabric.ActiveSelection) {
14796
+ logRotDriftSelectionSnapshot("modified-start-active-selection", activeObj, {
14797
+ time: Math.round(performance.now()),
14798
+ modifiedTarget: summarizeRotDriftObject(modifiedTarget),
14799
+ activeObjectIds: activeObjects.map((candidate) => getObjectId(candidate)),
14800
+ selectedStoreIds: useEditorStore.getState().canvas.selectedIds,
14801
+ transformStart: groupSelectionTransformStartRef.current
14802
+ });
14803
+ }
14610
14804
  const activeSelectionResizeHandle = isActiveSelection ? activeSelectionResizeHandleRef.current : null;
14611
14805
  const debugGroupTextCornerResize = activeObj instanceof fabric.ActiveSelection && isCornerResizeHandle(activeSelectionResizeHandle) && activeObjects.some((candidate) => candidate instanceof fabric.Textbox);
14612
14806
  if (debugGroupTextCornerResize) {
@@ -14884,9 +15078,8 @@ const PageCanvas = forwardRef(
14884
15078
  finalScaleX = 1;
14885
15079
  finalScaleY = 1;
14886
15080
  if (isActiveSelection && activeObj instanceof fabric.ActiveSelection) {
14887
- const frameBounds = getObjectFrameBoundsInSelection(activeObj, obj, sourceFrameW, sourceFrameH);
14888
- absoluteLeft = frameBounds.left;
14889
- absoluteTop = frameBounds.top;
15081
+ absoluteLeft = (decomposed.translateX ?? absoluteLeft) - finalWidth / 2;
15082
+ absoluteTop = (decomposed.translateY ?? absoluteTop) - finalHeight / 2;
14890
15083
  } else {
14891
15084
  absoluteLeft = (decomposed.translateX ?? absoluteLeft) - finalWidth / 2;
14892
15085
  absoluteTop = (decomposed.translateY ?? absoluteTop) - finalHeight / 2;
@@ -15256,6 +15449,32 @@ const PageCanvas = forwardRef(
15256
15449
  objectBeforeStoreWrite: summarizeFabricObjectForResizeDebug(obj)
15257
15450
  });
15258
15451
  }
15452
+ if (isActiveSelection) {
15453
+ logRotGroupImageDrift("store-update-child", {
15454
+ time: Math.round(performance.now()),
15455
+ objId,
15456
+ sourceElement: sourceElement ? {
15457
+ id: sourceElement.id,
15458
+ type: sourceElement.type,
15459
+ left: sourceElement.left,
15460
+ top: sourceElement.top,
15461
+ width: sourceElement.width,
15462
+ height: sourceElement.height,
15463
+ angle: sourceElement.angle,
15464
+ scaleX: sourceElement.scaleX,
15465
+ scaleY: sourceElement.scaleY
15466
+ } : null,
15467
+ objectBeforeStoreWrite: summarizeRotDriftObject(obj, finalAbsoluteMatrix),
15468
+ activeSelection: summarizeRotDriftObject(activeObj),
15469
+ absoluteMatrix,
15470
+ finalAbsoluteMatrix,
15471
+ decomposed,
15472
+ absoluteLeft,
15473
+ absoluteTop,
15474
+ storePos,
15475
+ elementUpdate
15476
+ });
15477
+ }
15259
15478
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15260
15479
  obj.setCoords();
15261
15480
  }
@@ -15286,6 +15505,19 @@ const PageCanvas = forwardRef(
15286
15505
  renderOnAddRemove: fabricCanvas.renderOnAddRemove
15287
15506
  });
15288
15507
  }
15508
+ logRotDriftSelectionSnapshot("before-reselect", activeObj, {
15509
+ time: Math.round(performance.now()),
15510
+ wasGroupSel,
15511
+ memberIds: membersToReselect.map((member) => getObjectId(member)),
15512
+ pendingCropBakes: pendingCropGroupFrameBakes.map((bake) => ({
15513
+ id: getObjectId(bake.obj),
15514
+ width: bake.width,
15515
+ height: bake.height,
15516
+ left: bake.left,
15517
+ top: bake.top,
15518
+ angle: bake.angle
15519
+ }))
15520
+ });
15289
15521
  const prevRenderOnAddRemove = fabricCanvas.renderOnAddRemove;
15290
15522
  fabricCanvas.renderOnAddRemove = false;
15291
15523
  skipSelectionClearOnDiscardRef.current = true;
@@ -15319,6 +15551,11 @@ const PageCanvas = forwardRef(
15319
15551
  if (wasGroupSel) restoreGroupSelectionVisualState(newSel, wasGroupSel);
15320
15552
  fabricCanvas.setActiveObject(newSel);
15321
15553
  newSel.setCoords();
15554
+ logRotDriftSelectionSnapshot("after-reselect", newSel, {
15555
+ time: Math.round(performance.now()),
15556
+ wasGroupSel,
15557
+ memberIds: membersToReselect.map((member) => getObjectId(member))
15558
+ });
15322
15559
  if (debugGroupTextCornerResize) {
15323
15560
  logGroupTextResizeDebug("after-reselect", {
15324
15561
  time: Math.round(performance.now()),
@@ -24377,9 +24614,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24377
24614
  }
24378
24615
  return svgString;
24379
24616
  }
24380
- const resolvedPackageVersion = "0.5.359";
24617
+ const resolvedPackageVersion = "0.5.361";
24381
24618
  const PACKAGE_VERSION = resolvedPackageVersion;
24382
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.359";
24619
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.361";
24383
24620
  const roundParityValue = (value) => {
24384
24621
  if (typeof value !== "number") return value;
24385
24622
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25193,7 +25430,7 @@ class PixldocsRenderer {
25193
25430
  await this.waitForCanvasScene(container, cloned, i);
25194
25431
  }
25195
25432
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25196
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-CaEmOpLs.js");
25433
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-BvYAPUvD.js");
25197
25434
  const prepared = preparePagesForExport(
25198
25435
  cloned.pages,
25199
25436
  canvasWidth,
@@ -27513,7 +27750,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27513
27750
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27514
27751
  sanitizeSvgTreeForPdf(svgToDraw);
27515
27752
  try {
27516
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-CaEmOpLs.js");
27753
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-BvYAPUvD.js");
27517
27754
  try {
27518
27755
  await logTextMeasurementDiagnostic(svgToDraw);
27519
27756
  } catch {
@@ -27913,4 +28150,4 @@ export {
27913
28150
  buildTeaserBlurFlatKeys as y,
27914
28151
  collectFontDescriptorsFromConfig as z
27915
28152
  };
27916
- //# sourceMappingURL=index-lU7E8PIC.js.map
28153
+ //# sourceMappingURL=index-BaiH8RTh.js.map