@pixldocs/canvas-renderer 0.5.211 → 0.5.212

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.
@@ -6902,8 +6902,10 @@ function buildTextShadow(element) {
6902
6902
  if (!color || color === "transparent") return null;
6903
6903
  const type = element.textShadowType;
6904
6904
  if (type && type !== "drop") return null;
6905
+ const { perPassAlpha } = resolveShadowStrength(element);
6906
+ const finalColor = applyAlphaMultiplier(String(color), perPassAlpha);
6905
6907
  return new fabric__namespace.Shadow({
6906
- color: String(color),
6908
+ color: finalColor,
6907
6909
  blur: blur || 0,
6908
6910
  offsetX: ox || 0,
6909
6911
  offsetY: oy || 0,
@@ -6911,6 +6913,65 @@ function buildTextShadow(element) {
6911
6913
  nonScaling: false
6912
6914
  });
6913
6915
  }
6916
+ function resolveShadowStrength(element) {
6917
+ const raw = element.textShadowStrength;
6918
+ const s = typeof raw === "number" && Number.isFinite(raw) ? Math.max(0, Math.min(100, raw)) : 25;
6919
+ if (s <= 0) return { perPassAlpha: 0, passes: 0 };
6920
+ if (s <= 25) return { perPassAlpha: s / 25, passes: 1 };
6921
+ const passes = Math.min(4, Math.ceil(s / 25));
6922
+ return { perPassAlpha: 1, passes };
6923
+ }
6924
+ function applyTextShadow(textbox, element) {
6925
+ const shadow = buildTextShadow(element);
6926
+ const { passes } = resolveShadowStrength(element);
6927
+ const obj = textbox;
6928
+ if (!obj.__pdShadowOrigRender) {
6929
+ obj.__pdShadowOrigRender = obj.render.bind(obj);
6930
+ obj.render = function(ctx) {
6931
+ const n = Math.max(1, Number(obj.__pdShadowPasses || 1));
6932
+ for (let i = 0; i < n; i++) obj.__pdShadowOrigRender(ctx);
6933
+ };
6934
+ }
6935
+ obj.__pdShadowPasses = shadow ? Math.max(1, passes) : 1;
6936
+ textbox.set("shadow", shadow ?? null);
6937
+ }
6938
+ function applyAlphaMultiplier(c, mult) {
6939
+ const m = Math.max(0, Math.min(1, mult));
6940
+ const s = String(c).trim();
6941
+ const rgba = s.match(/^rgba?\s*\(([^)]+)\)$/i);
6942
+ if (rgba) {
6943
+ const parts = rgba[1].split(",").map((p) => p.trim());
6944
+ const [r, g, b] = parts;
6945
+ const baseA = parts.length >= 4 ? Math.max(0, Math.min(1, parseFloat(parts[3]) || 0)) : 1;
6946
+ return `rgba(${r}, ${g}, ${b}, ${Math.round(baseA * m * 1e3) / 1e3})`;
6947
+ }
6948
+ const hex8 = s.match(/^#([0-9a-f]{8})$/i);
6949
+ if (hex8) {
6950
+ const h = hex8[1];
6951
+ const r = parseInt(h.slice(0, 2), 16);
6952
+ const g = parseInt(h.slice(2, 4), 16);
6953
+ const b = parseInt(h.slice(4, 6), 16);
6954
+ const baseA = parseInt(h.slice(6, 8), 16) / 255;
6955
+ return `rgba(${r}, ${g}, ${b}, ${Math.round(baseA * m * 1e3) / 1e3})`;
6956
+ }
6957
+ const hex6 = s.match(/^#([0-9a-f]{6})$/i);
6958
+ if (hex6) {
6959
+ const h = hex6[1];
6960
+ const r = parseInt(h.slice(0, 2), 16);
6961
+ const g = parseInt(h.slice(2, 4), 16);
6962
+ const b = parseInt(h.slice(4, 6), 16);
6963
+ return `rgba(${r}, ${g}, ${b}, ${Math.round(m * 1e3) / 1e3})`;
6964
+ }
6965
+ const hex3 = s.match(/^#([0-9a-f]{3})$/i);
6966
+ if (hex3) {
6967
+ const h = hex3[1];
6968
+ const r = parseInt(h[0] + h[0], 16);
6969
+ const g = parseInt(h[1] + h[1], 16);
6970
+ const b = parseInt(h[2] + h[2], 16);
6971
+ return `rgba(${r}, ${g}, ${b}, ${Math.round(m * 1e3) / 1e3})`;
6972
+ }
6973
+ return `rgba(0, 0, 0, ${Math.round(m * 1e3) / 1e3})`;
6974
+ }
6914
6975
  function buildRoundedRectPath2D(ctx, x, y, w, h, rTL, rTR, rBR, rBL) {
6915
6976
  const maxR = Math.min(w, h) / 2;
6916
6977
  const tl = Math.min(Math.max(0, rTL), maxR);
@@ -8475,8 +8536,7 @@ function createText(element) {
8475
8536
  }));
8476
8537
  }
8477
8538
  applyTextBackground(textbox, extractTextBgConfig(element));
8478
- const shadow = buildTextShadow(element);
8479
- if (shadow) textbox.set("shadow", shadow);
8539
+ applyTextShadow(textbox, element);
8480
8540
  return textbox;
8481
8541
  }
8482
8542
  function createLine(element) {
@@ -12283,8 +12343,7 @@ const PageCanvas = react.forwardRef(
12283
12343
  obj.dirty = true;
12284
12344
  try {
12285
12345
  applyTextBackground(obj, extractTextBgConfig(element));
12286
- const shadow = buildTextShadow(element);
12287
- obj.set("shadow", shadow ?? null);
12346
+ applyTextShadow(obj, element);
12288
12347
  try {
12289
12348
  obj._cacheCanvas = null;
12290
12349
  obj._cacheContext = null;
@@ -12312,7 +12371,8 @@ const PageCanvas = react.forwardRef(
12312
12371
  sy: element.textShadowOffsetY ?? 0,
12313
12372
  st: element.textShadowAffectsText !== false,
12314
12373
  sa: element.textShadowAffectsBg !== false,
12315
- sty: element.textShadowType ?? null
12374
+ sty: element.textShadowType ?? null,
12375
+ ss: element.textShadowStrength ?? null
12316
12376
  });
12317
12377
  obj.dirty = true;
12318
12378
  } catch (err) {
@@ -18970,9 +19030,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
18970
19030
  }
18971
19031
  return svgString;
18972
19032
  }
18973
- const resolvedPackageVersion = "0.5.211";
19033
+ const resolvedPackageVersion = "0.5.212";
18974
19034
  const PACKAGE_VERSION = resolvedPackageVersion;
18975
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.211";
19035
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.212";
18976
19036
  const roundParityValue = (value) => {
18977
19037
  if (typeof value !== "number") return value;
18978
19038
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -19664,7 +19724,7 @@ class PixldocsRenderer {
19664
19724
  await this.waitForCanvasScene(container, cloned, i);
19665
19725
  }
19666
19726
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
19667
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-QzySzFJJ.cjs"));
19727
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-zGrrm-iT.cjs"));
19668
19728
  const prepared = preparePagesForExport(
19669
19729
  cloned.pages,
19670
19730
  canvasWidth,
@@ -21850,7 +21910,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
21850
21910
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
21851
21911
  sanitizeSvgTreeForPdf(svgToDraw);
21852
21912
  try {
21853
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-QzySzFJJ.cjs"));
21913
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-zGrrm-iT.cjs"));
21854
21914
  try {
21855
21915
  await logTextMeasurementDiagnostic(svgToDraw);
21856
21916
  } catch {
@@ -22247,4 +22307,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
22247
22307
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
22248
22308
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
22249
22309
  exports.warmTemplateFromForm = warmTemplateFromForm;
22250
- //# sourceMappingURL=index-d8U2oDzI.cjs.map
22310
+ //# sourceMappingURL=index-DB8j0PV0.cjs.map