@pixldocs/canvas-renderer 0.5.460 → 0.5.462

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.
@@ -4431,8 +4431,12 @@ async function loadImageAsync(element, placeholder, fc, fabricRef, syncLockedRef
4431
4431
  const elementHeight2 = Number(element.height) * (element.scaleY ?? 1);
4432
4432
  const scaledImageWidth = imgNaturalWidth * baseScaleX;
4433
4433
  const scaledImageHeight = imgNaturalHeight * baseScaleY;
4434
- const imageLeft = (elementWidth2 - scaledImageWidth) / 2;
4435
- const imageTop = (elementHeight2 - scaledImageHeight) / 2;
4434
+ const alignH = element.imageAlignH ?? "center";
4435
+ const alignV = element.imageAlignV ?? "middle";
4436
+ const slackX = elementWidth2 - scaledImageWidth;
4437
+ const slackY = elementHeight2 - scaledImageHeight;
4438
+ const imageLeft = imageFit2 === "contain" ? alignH === "left" ? 0 : alignH === "right" ? slackX : slackX / 2 : slackX / 2;
4439
+ const imageTop = imageFit2 === "contain" ? alignV === "top" ? 0 : alignV === "bottom" ? slackY : slackY / 2 : slackY / 2;
4436
4440
  img.set({
4437
4441
  originX: "left",
4438
4442
  originY: "top",
@@ -5231,8 +5235,19 @@ function updateCoverLayout(g) {
5231
5235
  const overflowY = Math.max(0, dispH - frameH);
5232
5236
  const panX = clamp$1(img._ct.panX ?? 0.5, 0, 1);
5233
5237
  const panY = clamp$1(img._ct.panY ?? 0.5, 0, 1);
5234
- const offsetX = fitContain ? 0 : overflowX > 0 ? -overflowX * (panX - 0.5) : 0;
5235
- const offsetY = fitContain ? 0 : overflowY > 0 ? -overflowY * (panY - 0.5) : 0;
5238
+ let offsetX = 0;
5239
+ let offsetY = 0;
5240
+ if (fitContain) {
5241
+ const alignH = ct.alignH ?? "center";
5242
+ const alignV = ct.alignV ?? "middle";
5243
+ const slackX = Math.max(0, frameW - dispW);
5244
+ const slackY = Math.max(0, frameH - dispH);
5245
+ offsetX = alignH === "left" ? -slackX / 2 : alignH === "right" ? slackX / 2 : 0;
5246
+ offsetY = alignV === "top" ? -slackY / 2 : alignV === "bottom" ? slackY / 2 : 0;
5247
+ } else {
5248
+ offsetX = overflowX > 0 ? -overflowX * (panX - 0.5) : 0;
5249
+ offsetY = overflowY > 0 ? -overflowY * (panY - 0.5) : 0;
5250
+ }
5236
5251
  img.set({ left: offsetX, top: offsetY });
5237
5252
  g.dirty = true;
5238
5253
  img.dirty = true;
@@ -5605,7 +5620,10 @@ async function createMaskedImageElement({
5605
5620
  visible = true,
5606
5621
  panX = 0.5,
5607
5622
  panY = 0.5,
5608
- zoom = 1
5623
+ zoom = 1,
5624
+ fit = "cover",
5625
+ alignH = "center",
5626
+ alignV = "middle"
5609
5627
  }) {
5610
5628
  const img = image || (url ? await fabric__namespace.FabricImage.fromURL(getProxiedImageUrl(url), { crossOrigin: "anonymous" }) : null);
5611
5629
  if (!img) {
@@ -5724,8 +5742,12 @@ async function createMaskedImageElement({
5724
5742
  rx,
5725
5743
  frameW,
5726
5744
  frameH,
5727
- fit: "cover",
5728
- // clip image to frame; use 'contain' only when simple-scale mode is set
5745
+ // Honor the element's authored imageFit. When 'contain', the image is
5746
+ // scaled to fit fully inside the frame (no clipping) and alignH/alignV
5747
+ // control where the letterboxed image sits.
5748
+ fit,
5749
+ alignH,
5750
+ alignV,
5729
5751
  _img: img,
5730
5752
  _border: border
5731
5753
  };
@@ -17114,13 +17136,15 @@ const PageCanvas = react.forwardRef(
17114
17136
  }
17115
17137
  updateElement(elementId, {
17116
17138
  text: newText,
17117
- ...typeof nextHeight === "number" && nextHeight > 0 && { height: nextHeight }
17139
+ ...typeof nextHeight === "number" && nextHeight > 0 && { height: nextHeight },
17140
+ ...target.styles && Object.keys(target.styles).length > 0 ? { styles: JSON.parse(JSON.stringify(target.styles)) } : {}
17118
17141
  });
17119
17142
  } else {
17120
17143
  updateElement(elementId, {
17121
17144
  text: newText,
17122
17145
  ...fabricHeight > 0 && { height: fabricHeight },
17123
- ...fabricWidth > 0 && { width: fabricWidth }
17146
+ ...fabricWidth > 0 && { width: fabricWidth },
17147
+ ...target.styles && Object.keys(target.styles).length > 0 ? { styles: JSON.parse(JSON.stringify(target.styles)) } : {}
17124
17148
  });
17125
17149
  }
17126
17150
  commitHistory2();
@@ -19632,7 +19656,13 @@ const PageCanvas = react.forwardRef(
19632
19656
  visible: !isHidden,
19633
19657
  panX,
19634
19658
  panY,
19635
- zoom: zoom2
19659
+ zoom: zoom2,
19660
+ // Honor authored Object Fit + alignment so contain logos render
19661
+ // fully inside the frame, with letterbox aligned to the chosen
19662
+ // edge (instead of being silently cover-cropped).
19663
+ fit: imageFitFinal === "contain" ? "contain" : "cover",
19664
+ alignH: element.imageAlignH ?? "center",
19665
+ alignV: element.imageAlignV ?? "middle"
19636
19666
  });
19637
19667
  cropGroup.__maintainResolution = element.maintainResolution !== false;
19638
19668
  cropGroup.set({
@@ -26239,9 +26269,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
26239
26269
  }
26240
26270
  return svgString;
26241
26271
  }
26242
- const resolvedPackageVersion = "0.5.460";
26272
+ const resolvedPackageVersion = "0.5.462";
26243
26273
  const PACKAGE_VERSION = resolvedPackageVersion;
26244
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.460";
26274
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.462";
26245
26275
  const roundParityValue = (value) => {
26246
26276
  if (typeof value !== "number") return value;
26247
26277
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -27055,7 +27085,7 @@ class PixldocsRenderer {
27055
27085
  await this.waitForCanvasScene(container, cloned, i);
27056
27086
  }
27057
27087
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
27058
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-B5Xxp9RH.cjs"));
27088
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-IjuMSK-o.cjs"));
27059
27089
  const prepared = preparePagesForExport(
27060
27090
  cloned.pages,
27061
27091
  canvasWidth,
@@ -29375,7 +29405,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
29375
29405
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
29376
29406
  sanitizeSvgTreeForPdf(svgToDraw);
29377
29407
  try {
29378
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-B5Xxp9RH.cjs"));
29408
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-IjuMSK-o.cjs"));
29379
29409
  try {
29380
29410
  await logTextMeasurementDiagnostic(svgToDraw);
29381
29411
  } catch {
@@ -29689,4 +29719,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
29689
29719
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
29690
29720
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
29691
29721
  exports.warmTemplateFromForm = warmTemplateFromForm;
29692
- //# sourceMappingURL=index-CtJvkbzV.cjs.map
29722
+ //# sourceMappingURL=index-DjoKgogq.cjs.map