@pixldocs/canvas-renderer 0.5.461 → 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.
@@ -4413,8 +4413,12 @@ async function loadImageAsync(element, placeholder, fc, fabricRef, syncLockedRef
4413
4413
  const elementHeight2 = Number(element.height) * (element.scaleY ?? 1);
4414
4414
  const scaledImageWidth = imgNaturalWidth * baseScaleX;
4415
4415
  const scaledImageHeight = imgNaturalHeight * baseScaleY;
4416
- const imageLeft = (elementWidth2 - scaledImageWidth) / 2;
4417
- const imageTop = (elementHeight2 - scaledImageHeight) / 2;
4416
+ const alignH = element.imageAlignH ?? "center";
4417
+ const alignV = element.imageAlignV ?? "middle";
4418
+ const slackX = elementWidth2 - scaledImageWidth;
4419
+ const slackY = elementHeight2 - scaledImageHeight;
4420
+ const imageLeft = imageFit2 === "contain" ? alignH === "left" ? 0 : alignH === "right" ? slackX : slackX / 2 : slackX / 2;
4421
+ const imageTop = imageFit2 === "contain" ? alignV === "top" ? 0 : alignV === "bottom" ? slackY : slackY / 2 : slackY / 2;
4418
4422
  img.set({
4419
4423
  originX: "left",
4420
4424
  originY: "top",
@@ -5213,8 +5217,19 @@ function updateCoverLayout(g) {
5213
5217
  const overflowY = Math.max(0, dispH - frameH);
5214
5218
  const panX = clamp$1(img._ct.panX ?? 0.5, 0, 1);
5215
5219
  const panY = clamp$1(img._ct.panY ?? 0.5, 0, 1);
5216
- const offsetX = fitContain ? 0 : overflowX > 0 ? -overflowX * (panX - 0.5) : 0;
5217
- const offsetY = fitContain ? 0 : overflowY > 0 ? -overflowY * (panY - 0.5) : 0;
5220
+ let offsetX = 0;
5221
+ let offsetY = 0;
5222
+ if (fitContain) {
5223
+ const alignH = ct.alignH ?? "center";
5224
+ const alignV = ct.alignV ?? "middle";
5225
+ const slackX = Math.max(0, frameW - dispW);
5226
+ const slackY = Math.max(0, frameH - dispH);
5227
+ offsetX = alignH === "left" ? -slackX / 2 : alignH === "right" ? slackX / 2 : 0;
5228
+ offsetY = alignV === "top" ? -slackY / 2 : alignV === "bottom" ? slackY / 2 : 0;
5229
+ } else {
5230
+ offsetX = overflowX > 0 ? -overflowX * (panX - 0.5) : 0;
5231
+ offsetY = overflowY > 0 ? -overflowY * (panY - 0.5) : 0;
5232
+ }
5218
5233
  img.set({ left: offsetX, top: offsetY });
5219
5234
  g.dirty = true;
5220
5235
  img.dirty = true;
@@ -5587,7 +5602,10 @@ async function createMaskedImageElement({
5587
5602
  visible = true,
5588
5603
  panX = 0.5,
5589
5604
  panY = 0.5,
5590
- zoom = 1
5605
+ zoom = 1,
5606
+ fit = "cover",
5607
+ alignH = "center",
5608
+ alignV = "middle"
5591
5609
  }) {
5592
5610
  const img = image || (url ? await fabric.FabricImage.fromURL(getProxiedImageUrl(url), { crossOrigin: "anonymous" }) : null);
5593
5611
  if (!img) {
@@ -5706,8 +5724,12 @@ async function createMaskedImageElement({
5706
5724
  rx,
5707
5725
  frameW,
5708
5726
  frameH,
5709
- fit: "cover",
5710
- // clip image to frame; use 'contain' only when simple-scale mode is set
5727
+ // Honor the element's authored imageFit. When 'contain', the image is
5728
+ // scaled to fit fully inside the frame (no clipping) and alignH/alignV
5729
+ // control where the letterboxed image sits.
5730
+ fit,
5731
+ alignH,
5732
+ alignV,
5711
5733
  _img: img,
5712
5734
  _border: border
5713
5735
  };
@@ -19616,7 +19638,13 @@ const PageCanvas = forwardRef(
19616
19638
  visible: !isHidden,
19617
19639
  panX,
19618
19640
  panY,
19619
- zoom: zoom2
19641
+ zoom: zoom2,
19642
+ // Honor authored Object Fit + alignment so contain logos render
19643
+ // fully inside the frame, with letterbox aligned to the chosen
19644
+ // edge (instead of being silently cover-cropped).
19645
+ fit: imageFitFinal === "contain" ? "contain" : "cover",
19646
+ alignH: element.imageAlignH ?? "center",
19647
+ alignV: element.imageAlignV ?? "middle"
19620
19648
  });
19621
19649
  cropGroup.__maintainResolution = element.maintainResolution !== false;
19622
19650
  cropGroup.set({
@@ -26223,9 +26251,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
26223
26251
  }
26224
26252
  return svgString;
26225
26253
  }
26226
- const resolvedPackageVersion = "0.5.461";
26254
+ const resolvedPackageVersion = "0.5.462";
26227
26255
  const PACKAGE_VERSION = resolvedPackageVersion;
26228
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.461";
26256
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.462";
26229
26257
  const roundParityValue = (value) => {
26230
26258
  if (typeof value !== "number") return value;
26231
26259
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -27039,7 +27067,7 @@ class PixldocsRenderer {
27039
27067
  await this.waitForCanvasScene(container, cloned, i);
27040
27068
  }
27041
27069
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
27042
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-Bn1wgD8Q.js");
27070
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-CFxK100y.js");
27043
27071
  const prepared = preparePagesForExport(
27044
27072
  cloned.pages,
27045
27073
  canvasWidth,
@@ -29359,7 +29387,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
29359
29387
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
29360
29388
  sanitizeSvgTreeForPdf(svgToDraw);
29361
29389
  try {
29362
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-Bn1wgD8Q.js");
29390
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-CFxK100y.js");
29363
29391
  try {
29364
29392
  await logTextMeasurementDiagnostic(svgToDraw);
29365
29393
  } catch {
@@ -29676,4 +29704,4 @@ export {
29676
29704
  buildTeaserBlurFlatKeys as y,
29677
29705
  collectFontDescriptorsFromConfig as z
29678
29706
  };
29679
- //# sourceMappingURL=index-COG7WTYO.js.map
29707
+ //# sourceMappingURL=index-DzpYcUNd.js.map