@pixldocs/canvas-renderer 0.5.305 → 0.5.307

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.
@@ -11259,10 +11259,31 @@ const PageCanvas = react.forwardRef(
11259
11259
  const [ready, setReady] = react.useState(false);
11260
11260
  const [unlockRequestId, setUnlockRequestId] = react.useState(0);
11261
11261
  const applyLogicalGroupSelectionVisualState = react.useCallback((selection, groupId) => {
11262
- var _a2;
11262
+ var _a2, _b2;
11263
11263
  selection.__pixldocsGroupSelection = groupId;
11264
11264
  delete selection.__pixldocsLogicalGroupIds;
11265
11265
  selection.hasBorders = true;
11266
+ try {
11267
+ const state = useEditorStore.getState();
11268
+ const pages = ((_a2 = state.canvas) == null ? void 0 : _a2.pages) ?? [];
11269
+ let groupNode = null;
11270
+ for (const page of pages) {
11271
+ const found = findNodeById(page.children ?? [], groupId);
11272
+ if (found && isGroup(found)) {
11273
+ groupNode = found;
11274
+ break;
11275
+ }
11276
+ }
11277
+ if (groupNode && !isStackLayoutMode(groupNode.layoutMode) && typeof groupNode.angle === "number" && Math.abs(groupNode.angle) > 0.01) {
11278
+ const currentAngle = ((selection.angle ?? 0) % 360 + 360) % 360;
11279
+ const targetAngle = ((groupNode.angle ?? 0) % 360 + 360) % 360;
11280
+ if (Math.abs(currentAngle - targetAngle) > 0.01) {
11281
+ selection.rotate(targetAngle);
11282
+ selection.setCoords();
11283
+ }
11284
+ }
11285
+ } catch {
11286
+ }
11266
11287
  const members = selection.getObjects();
11267
11288
  for (const prev of suppressGroupMemberBordersRef.current) {
11268
11289
  if (members.includes(prev)) continue;
@@ -11286,7 +11307,7 @@ const PageCanvas = react.forwardRef(
11286
11307
  if (m.__pixldocsOrigHasControls === void 0) m.__pixldocsOrigHasControls = m.hasControls;
11287
11308
  m.hasBorders = false;
11288
11309
  m.hasControls = false;
11289
- if (m.__cropGroup || ((_a2 = m._ct) == null ? void 0 : _a2.isCropGroup)) {
11310
+ if (m.__cropGroup || ((_b2 = m._ct) == null ? void 0 : _b2.isCropGroup)) {
11290
11311
  if (m.__pixldocsOrigLockScalingX === void 0) {
11291
11312
  m.__pixldocsOrigLockScalingX = m.lockScalingX;
11292
11313
  m.__pixldocsOrigLockScalingY = m.lockScalingY;
@@ -13869,6 +13890,12 @@ const PageCanvas = react.forwardRef(
13869
13890
  if (didShift) didReflowTextChild = true;
13870
13891
  }
13871
13892
  if (isXSide && didReflowTextChild && typeof obj.triggerLayout === "function") {
13893
+ obj.setCoords();
13894
+ const cornersBefore = obj.aCoords;
13895
+ let fixedMidBefore = null;
13896
+ if (cornersBefore) {
13897
+ fixedMidBefore = corner === "ml" ? { x: (cornersBefore.tr.x + cornersBefore.br.x) / 2, y: (cornersBefore.tr.y + cornersBefore.br.y) / 2 } : { x: (cornersBefore.tl.x + cornersBefore.bl.x) / 2, y: (cornersBefore.tl.y + cornersBefore.bl.y) / 2 };
13898
+ }
13872
13899
  try {
13873
13900
  obj.triggerLayout();
13874
13901
  } catch {
@@ -13877,11 +13904,22 @@ const PageCanvas = react.forwardRef(
13877
13904
  obj._set("scaleX", asSx0);
13878
13905
  obj._set("scaleY", asSy0);
13879
13906
  obj.setCoords();
13880
- const afterRect = obj.getBoundingRect();
13881
- const fixedLeft = asRect0.left;
13882
- const fixedRight = asRect0.left + asRect0.width;
13883
- const nextLeft = corner === "ml" ? (obj.left ?? 0) + (fixedRight - (afterRect.left + afterRect.width)) : (obj.left ?? 0) + (fixedLeft - afterRect.left);
13884
- obj._set("left", nextLeft);
13907
+ const cornersAfter = obj.aCoords;
13908
+ if (fixedMidBefore && cornersAfter) {
13909
+ const fixedMidAfter = corner === "ml" ? { x: (cornersAfter.tr.x + cornersAfter.br.x) / 2, y: (cornersAfter.tr.y + cornersAfter.br.y) / 2 } : { x: (cornersAfter.tl.x + cornersAfter.bl.x) / 2, y: (cornersAfter.tl.y + cornersAfter.bl.y) / 2 };
13910
+ const dx = fixedMidBefore.x - fixedMidAfter.x;
13911
+ const dy = fixedMidBefore.y - fixedMidAfter.y;
13912
+ if (Math.abs(dx) > 0.01 || Math.abs(dy) > 0.01) {
13913
+ obj._set("left", (obj.left ?? 0) + dx);
13914
+ obj._set("top", (obj.top ?? 0) + dy);
13915
+ }
13916
+ } else {
13917
+ const afterRect = obj.getBoundingRect();
13918
+ const fixedLeft = asRect0.left;
13919
+ const fixedRight = asRect0.left + asRect0.width;
13920
+ const nextLeft = corner === "ml" ? (obj.left ?? 0) + (fixedRight - (afterRect.left + afterRect.width)) : (obj.left ?? 0) + (fixedLeft - afterRect.left);
13921
+ obj._set("left", nextLeft);
13922
+ }
13885
13923
  } else {
13886
13924
  obj._set("height", asH0);
13887
13925
  obj._set("left", asLeft0);
@@ -14626,6 +14664,47 @@ const PageCanvas = react.forwardRef(
14626
14664
  unlockEditsSoon();
14627
14665
  return;
14628
14666
  }
14667
+ if (hadRotation && !hadScale && isActiveSelection && activeObj instanceof fabric__namespace.ActiveSelection && !isStackLayoutMode(groupToMove.layoutMode)) {
14668
+ const groupSelectionId = activeObj.__pixldocsGroupSelection ?? groupToMove.id;
14669
+ const newAngle = ((activeObj.angle ?? 0) % 360 + 360) % 360;
14670
+ const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14671
+ const rotPatch = { angle: newAngle === 0 ? void 0 : newAngle };
14672
+ if (Math.abs(deltaX) > 0.1) rotPatch.left = (groupToMove.left ?? 0) + deltaX;
14673
+ if (Math.abs(deltaY) > 0.1) rotPatch.top = (groupToMove.top ?? 0) + deltaY;
14674
+ updateNodeStore(groupToMove.id, rotPatch, { recordHistory: false, skipLayoutRecalc: true });
14675
+ commitHistoryStore();
14676
+ pendingGroupDrillInRef.current = null;
14677
+ fabricCanvas.__activeEditingGroupId = null;
14678
+ setDrilledGroupBounds(null);
14679
+ drilledGroupIdRef.current = null;
14680
+ if (groupSelectionId) {
14681
+ restoreGroupSelectionVisualState(activeObj, groupSelectionId);
14682
+ fabricCanvas.setActiveObject(activeObj);
14683
+ activeObj.setCoords();
14684
+ }
14685
+ selectElements([groupSelectionId], false, false);
14686
+ fabricCanvas.requestRenderAll();
14687
+ elementsRef.current = getCurrentElements();
14688
+ const rotTargets = activeObj.getObjects();
14689
+ for (const o of rotTargets) {
14690
+ const oid = getObjectId(o);
14691
+ if (oid && oid !== "__background__") {
14692
+ justModifiedIdsRef.current.add(oid);
14693
+ modifiedIdsThisRound.add(oid);
14694
+ }
14695
+ }
14696
+ setTimeout(() => modifiedIdsThisRound.forEach((id) => justModifiedIdsRef.current.delete(id)), 150);
14697
+ groupSelectionTransformStartRef.current = null;
14698
+ const rotSnapshot = {
14699
+ memberIds: rotTargets.map((o) => getObjectId(o)).filter((id) => !!id && id !== "__background__"),
14700
+ groupSelectionId,
14701
+ expiresAt: Date.now() + 1200
14702
+ };
14703
+ recentGroupSelectionRestoreRef.current = rotSnapshot;
14704
+ restorePreservedGroupSelectionSoon(rotSnapshot);
14705
+ unlockEditsSoon();
14706
+ return;
14707
+ }
14629
14708
  }
14630
14709
  }
14631
14710
  const pendingCropGroupFrameBakes = [];
@@ -14901,6 +14980,40 @@ const PageCanvas = react.forwardRef(
14901
14980
  bakedTextScaleUpdates.minBoxHeight = Math.max(0, nextMinH);
14902
14981
  obj.minBoxHeight = bakedTextScaleUpdates.minBoxHeight;
14903
14982
  }
14983
+ const effectScale = isCornerHandle ? fontScale : Math.max(1e-3, Math.sqrt(sx * sy));
14984
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "strokeWidth", effectScale);
14985
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textShadowBlur", effectScale);
14986
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textShadowDistance", effectScale);
14987
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textShadowOffsetX", sx);
14988
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textShadowOffsetY", sy);
14989
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgPaddingTop", sy);
14990
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgPaddingBottom", sy);
14991
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgPaddingLeft", sx);
14992
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgPaddingRight", sx);
14993
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgPadding", effectScale);
14994
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgRxTL", effectScale);
14995
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgRxTR", effectScale);
14996
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgRxBR", effectScale);
14997
+ scaleUpdateNumber(bakedTextScaleUpdates, sourceElement ?? void 0, "textBgRxBL", effectScale);
14998
+ const tpSource = obj.textPath ?? (sourceElement == null ? void 0 : sourceElement.textPath);
14999
+ if (tpSource) {
15000
+ bakedTextScaleUpdates.textPath = scaleTextPathConfig(tpSource, sx, sy, effectScale);
15001
+ obj.textPath = bakedTextScaleUpdates.textPath;
15002
+ }
15003
+ if (bakedTextScaleUpdates.strokeWidth !== void 0) {
15004
+ obj.set({ strokeWidth: bakedTextScaleUpdates.strokeWidth });
15005
+ }
15006
+ const shadow = obj.shadow;
15007
+ if (shadow) {
15008
+ if (bakedTextScaleUpdates.textShadowBlur !== void 0) shadow.blur = bakedTextScaleUpdates.textShadowBlur;
15009
+ if (bakedTextScaleUpdates.textShadowOffsetX !== void 0) shadow.offsetX = bakedTextScaleUpdates.textShadowOffsetX;
15010
+ if (bakedTextScaleUpdates.textShadowOffsetY !== void 0) shadow.offsetY = bakedTextScaleUpdates.textShadowOffsetY;
15011
+ }
15012
+ if ((sourceElement == null ? void 0 : sourceElement.type) === "text") {
15013
+ const bakedElement = { ...sourceElement, ...bakedTextScaleUpdates };
15014
+ applyTextBackground(obj, extractTextBgConfig(bakedElement));
15015
+ applyTextShadow(obj, bakedElement);
15016
+ }
14904
15017
  const prevObjCaching = obj.objectCaching;
14905
15018
  obj.set({ width: bakedWidth, scaleX: 1, scaleY: 1, objectCaching: false });
14906
15019
  obj.initDimensions();
@@ -24177,9 +24290,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24177
24290
  }
24178
24291
  return svgString;
24179
24292
  }
24180
- const resolvedPackageVersion = "0.5.305";
24293
+ const resolvedPackageVersion = "0.5.307";
24181
24294
  const PACKAGE_VERSION = resolvedPackageVersion;
24182
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.305";
24295
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.307";
24183
24296
  const roundParityValue = (value) => {
24184
24297
  if (typeof value !== "number") return value;
24185
24298
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -24993,7 +25106,7 @@ class PixldocsRenderer {
24993
25106
  await this.waitForCanvasScene(container, cloned, i);
24994
25107
  }
24995
25108
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
24996
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-fYp0UsD2.cjs"));
25109
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-BLbk8p1V.cjs"));
24997
25110
  const prepared = preparePagesForExport(
24998
25111
  cloned.pages,
24999
25112
  canvasWidth,
@@ -27313,7 +27426,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27313
27426
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27314
27427
  sanitizeSvgTreeForPdf(svgToDraw);
27315
27428
  try {
27316
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-fYp0UsD2.cjs"));
27429
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-BLbk8p1V.cjs"));
27317
27430
  try {
27318
27431
  await logTextMeasurementDiagnostic(svgToDraw);
27319
27432
  } catch {
@@ -27710,4 +27823,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
27710
27823
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
27711
27824
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
27712
27825
  exports.warmTemplateFromForm = warmTemplateFromForm;
27713
- //# sourceMappingURL=index-C8ZNStHz.cjs.map
27826
+ //# sourceMappingURL=index-DDubE6xA.cjs.map