@pixldocs/canvas-renderer 0.5.210 → 0.5.211

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.
@@ -4071,6 +4071,11 @@ async function loadImageAsync(element, placeholder, fc, fabricRef, syncLockedRef
4071
4071
  setObjectData(cropGroup, element.id);
4072
4072
  cropGroup.__imageSrc = imageUrl;
4073
4073
  cropGroup.__svgColorMap = nextSvgColorMap;
4074
+ cropGroup.set({
4075
+ flipX: element.flipX ?? false,
4076
+ flipY: element.flipY ?? false
4077
+ });
4078
+ cropGroup.setCoords();
4074
4079
  finalObject = cropGroup;
4075
4080
  } else {
4076
4081
  setObjectData(img, element.id);
@@ -18965,9 +18970,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
18965
18970
  }
18966
18971
  return svgString;
18967
18972
  }
18968
- const resolvedPackageVersion = "0.5.210";
18973
+ const resolvedPackageVersion = "0.5.211";
18969
18974
  const PACKAGE_VERSION = resolvedPackageVersion;
18970
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.210";
18975
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.211";
18971
18976
  const roundParityValue = (value) => {
18972
18977
  if (typeof value !== "number") return value;
18973
18978
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -19027,7 +19032,7 @@ function detectSafariOrIos() {
19027
19032
  return false;
19028
19033
  }
19029
19034
  }
19030
- async function downscaleConfigRasterImages(config, maxEdgePx, maxDataUrlBytes = 2e6) {
19035
+ async function downscaleConfigRasterImages(config, maxEdgePx, maxDataUrlBytes = 2e6, jpegQuality = 0.85) {
19031
19036
  if (!maxEdgePx || maxEdgePx <= 0) return 0;
19032
19037
  if (typeof document === "undefined") return 0;
19033
19038
  const targets = [];
@@ -19091,7 +19096,7 @@ async function downscaleConfigRasterImages(config, maxEdgePx, maxDataUrlBytes =
19091
19096
  return null;
19092
19097
  }
19093
19098
  let scale = tooLargeByEdge ? maxEdgePx / longest : 1;
19094
- let quality = 0.85;
19099
+ let quality = Math.max(0.4, Math.min(1, jpegQuality));
19095
19100
  let best = null;
19096
19101
  for (let attempt = 0; attempt < 4; attempt++) {
19097
19102
  const tw = Math.max(1, Math.round(w * scale));
@@ -19115,7 +19120,7 @@ async function downscaleConfigRasterImages(config, maxEdgePx, maxDataUrlBytes =
19115
19120
  }
19116
19121
  const byteScale = Math.sqrt(maxDataUrlBytes / Math.max(1, outBytes)) * 0.92;
19117
19122
  scale = Math.max(0.1, scale * Math.min(0.95, byteScale));
19118
- quality = Math.max(0.68, quality - 0.06);
19123
+ quality = Math.max(0.4, quality - 0.06);
19119
19124
  }
19120
19125
  if (blobUrl) URL.revokeObjectURL(blobUrl);
19121
19126
  return best;
@@ -19490,7 +19495,9 @@ class PixldocsRenderer {
19490
19495
  title: options == null ? void 0 : options.title,
19491
19496
  textMode: options == null ? void 0 : options.textMode,
19492
19497
  forcePerElementPdf: options == null ? void 0 : options.forcePerElementPdf,
19493
- maxImageEdgePx: options == null ? void 0 : options.maxImageEdgePx
19498
+ maxImageEdgePx: options == null ? void 0 : options.maxImageEdgePx,
19499
+ compressImages: options == null ? void 0 : options.compressImages,
19500
+ compressionQuality: options == null ? void 0 : options.compressionQuality
19494
19501
  });
19495
19502
  }
19496
19503
  /**
@@ -19498,7 +19505,7 @@ class PixldocsRenderer {
19498
19505
  * This is the primary PDF export API — mirrors renderFromForm() but returns a PDF.
19499
19506
  */
19500
19507
  async renderPdfFromForm(options) {
19501
- const { templateId, formSchemaId, sectionState, themeId, watermark, watermarkOptions, prefetched, title, fontBaseUrl, textMode, forcePerElementPdf, maxImageEdgePx } = options;
19508
+ const { templateId, formSchemaId, sectionState, themeId, watermark, watermarkOptions, prefetched, title, fontBaseUrl, textMode, forcePerElementPdf, maxImageEdgePx, compressImages, compressionQuality } = options;
19502
19509
  const resolved = await resolveFromForm({
19503
19510
  templateId,
19504
19511
  formSchemaId,
@@ -19521,7 +19528,9 @@ class PixldocsRenderer {
19521
19528
  watermark: shouldWatermark,
19522
19529
  textMode,
19523
19530
  forcePerElementPdf,
19524
- maxImageEdgePx
19531
+ maxImageEdgePx,
19532
+ compressImages,
19533
+ compressionQuality
19525
19534
  });
19526
19535
  }
19527
19536
  async renderById(templateId, formData, options) {
@@ -19568,13 +19577,20 @@ class PixldocsRenderer {
19568
19577
  const hasUserDataImage = configHasUserDataImage(cloned);
19569
19578
  const isSafariLike = detectSafariOrIos();
19570
19579
  const shouldForcePerElement = forceMode === true ? true : forceMode === false ? false : false;
19580
+ const compressImagesOpt = options.compressImages ?? true;
19571
19581
  const maxEdgeOpt = options.maxImageEdgePx ?? this.config.maxImageEdgePx;
19572
- const effectiveMaxEdge = typeof maxEdgeOpt === "number" ? Math.max(0, maxEdgeOpt | 0) : hasUserDataImage ? 2048 : 0;
19582
+ const effectiveMaxEdge = typeof maxEdgeOpt === "number" ? Math.max(0, maxEdgeOpt | 0) : compressImagesOpt ? hasUserDataImage ? 2048 : 0 : 0;
19583
+ const downscaleQuality = compressImagesOpt ? typeof options.compressionQuality === "number" ? Math.max(0.4, Math.min(1, options.compressionQuality)) : 0.85 : 0.95;
19573
19584
  if (effectiveMaxEdge > 0) {
19574
19585
  try {
19575
- const downscaled = await downscaleConfigRasterImages(cloned, effectiveMaxEdge);
19586
+ const downscaled = await downscaleConfigRasterImages(
19587
+ cloned,
19588
+ effectiveMaxEdge,
19589
+ void 0,
19590
+ downscaleQuality
19591
+ );
19576
19592
  if (downscaled > 0) {
19577
- console.log(`[canvas-renderer][pdf-unified] downscaled ${downscaled} raster image(s) to <=${effectiveMaxEdge}px edge`);
19593
+ console.log(`[canvas-renderer][pdf-unified] downscaled ${downscaled} raster image(s) to <=${effectiveMaxEdge}px edge @ q=${downscaleQuality}`);
19578
19594
  }
19579
19595
  } catch (e) {
19580
19596
  console.warn("[canvas-renderer][pdf-unified] image downscale pass failed (continuing with originals):", e);
@@ -19585,7 +19601,9 @@ class PixldocsRenderer {
19585
19601
  hasUserDataImage,
19586
19602
  isSafariLike,
19587
19603
  shouldForcePerElement,
19588
- effectiveMaxEdge
19604
+ effectiveMaxEdge,
19605
+ compressImages: compressImagesOpt,
19606
+ downscaleQuality
19589
19607
  });
19590
19608
  const stampPrefix = `__pixldocs_pdf_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
19591
19609
  const pageIds = cloned.pages.map((p, i) => {
@@ -19646,7 +19664,7 @@ class PixldocsRenderer {
19646
19664
  await this.waitForCanvasScene(container, cloned, i);
19647
19665
  }
19648
19666
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
19649
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-BSK-Z1p4.cjs"));
19667
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-QzySzFJJ.cjs"));
19650
19668
  const prepared = preparePagesForExport(
19651
19669
  cloned.pages,
19652
19670
  canvasWidth,
@@ -19663,7 +19681,9 @@ class PixldocsRenderer {
19663
19681
  // path and use the live Fabric object PDF path instead, preserving live
19664
19682
  // matrices/order so we do not regress into stale config-space layout.
19665
19683
  skipLiveCanvasSvgFastPath: forceMode === true,
19666
- useLiveCanvasObjectPdfPath: shouldForcePerElement && forceMode !== true
19684
+ useLiveCanvasObjectPdfPath: shouldForcePerElement && forceMode !== true,
19685
+ compressImages: options.compressImages ?? true,
19686
+ compressionQuality: options.compressionQuality
19667
19687
  });
19668
19688
  if (!result || typeof result === "undefined") {
19669
19689
  throw new Error("exportMultiPagePdf returned no blob (returnBlob path failed)");
@@ -21830,7 +21850,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
21830
21850
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
21831
21851
  sanitizeSvgTreeForPdf(svgToDraw);
21832
21852
  try {
21833
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-BSK-Z1p4.cjs"));
21853
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-QzySzFJJ.cjs"));
21834
21854
  try {
21835
21855
  await logTextMeasurementDiagnostic(svgToDraw);
21836
21856
  } catch {
@@ -22227,4 +22247,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
22227
22247
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
22228
22248
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
22229
22249
  exports.warmTemplateFromForm = warmTemplateFromForm;
22230
- //# sourceMappingURL=index-54CXM_hR.cjs.map
22250
+ //# sourceMappingURL=index-d8U2oDzI.cjs.map