@pixldocs/canvas-renderer 0.5.186 → 0.5.187

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.
@@ -16133,6 +16133,44 @@ async function getTemplateForm(options) {
16133
16133
  initialSectionState
16134
16134
  };
16135
16135
  }
16136
+ function stripFieldPrefix(s) {
16137
+ return s.startsWith("field_") ? s.slice("field_".length) : s;
16138
+ }
16139
+ function addAll(val, out) {
16140
+ if (!val) return false;
16141
+ if (Array.isArray(val)) {
16142
+ for (const v of val) out.add(v);
16143
+ return val.length > 0;
16144
+ }
16145
+ out.add(val);
16146
+ return true;
16147
+ }
16148
+ function resolveBlurElementExactIdsFromFlatFormKeys(config, flatFormKeys, options) {
16149
+ const cloneIdMap = (config == null ? void 0 : config.__cloneIdMap) || {};
16150
+ if (!cloneIdMap || typeof cloneIdMap !== "object") return [];
16151
+ const bindings = (options == null ? void 0 : options.bindings) ?? "value";
16152
+ const out = /* @__PURE__ */ new Set();
16153
+ for (const rawId of flatFormKeys) {
16154
+ if (typeof rawId !== "string" || !rawId) continue;
16155
+ if (bindings === "value" && !rawId.endsWith("_value")) continue;
16156
+ const candidates = [rawId];
16157
+ if (rawId.startsWith("field_")) {
16158
+ const topStripped = stripFieldPrefix(rawId);
16159
+ candidates.push(topStripped);
16160
+ const nestedIdx = topStripped.indexOf("_field_");
16161
+ if (nestedIdx >= 0) {
16162
+ const nestedStripped = topStripped.slice(0, nestedIdx + 1) + topStripped.slice(nestedIdx + 1 + "field_".length);
16163
+ candidates.push(nestedStripped);
16164
+ }
16165
+ }
16166
+ for (const k of candidates) {
16167
+ if (k in cloneIdMap) {
16168
+ if (addAll(cloneIdMap[k], out)) break;
16169
+ }
16170
+ }
16171
+ }
16172
+ return Array.from(out);
16173
+ }
16136
16174
  const PREVIEW_DEBUG_PREFIX = "[canvas-renderer][preview-debug]";
16137
16175
  function computeFontSignature(config) {
16138
16176
  var _a;
@@ -16226,7 +16264,9 @@ function PixldocsPreview(props) {
16226
16264
  frostedBlur = true,
16227
16265
  frostedBlurOptions,
16228
16266
  blurFieldIds,
16229
- blurElementExactIds
16267
+ blurElementExactIds,
16268
+ blurFlatFormKeys,
16269
+ blurFlatFormKeyOptions
16230
16270
  } = props;
16231
16271
  react.useEffect(() => {
16232
16272
  setPackageApiUrl(imageProxyUrl);
@@ -16347,8 +16387,26 @@ function PixldocsPreview(props) {
16347
16387
  [blurFieldIds ? blurFieldIds.join("|") : ""]
16348
16388
  );
16349
16389
  const blurExactSet = react.useMemo(
16350
- () => blurElementExactIds && blurElementExactIds.length ? new Set(blurElementExactIds) : void 0,
16351
- [blurElementExactIds ? blurElementExactIds.join("|") : ""]
16390
+ () => {
16391
+ const merged = /* @__PURE__ */ new Set();
16392
+ if (blurElementExactIds) for (const id of blurElementExactIds) merged.add(id);
16393
+ if (config && blurFlatFormKeys && blurFlatFormKeys.length) {
16394
+ for (const id of resolveBlurElementExactIdsFromFlatFormKeys(
16395
+ config,
16396
+ blurFlatFormKeys,
16397
+ blurFlatFormKeyOptions
16398
+ )) {
16399
+ merged.add(id);
16400
+ }
16401
+ }
16402
+ return merged.size > 0 ? merged : void 0;
16403
+ },
16404
+ [
16405
+ blurElementExactIds ? blurElementExactIds.join("|") : "",
16406
+ blurFlatFormKeys ? blurFlatFormKeys.join("|") : "",
16407
+ blurFlatFormKeyOptions == null ? void 0 : blurFlatFormKeyOptions.bindings,
16408
+ config
16409
+ ]
16352
16410
  );
16353
16411
  const frostedBounds = react.useMemo(
16354
16412
  () => frostedBlur ? computeFrostedBoundsForPage(config, pageIndex, blurBaseSet, blurExactSet) : [],
@@ -16593,9 +16651,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
16593
16651
  }
16594
16652
  return svgString;
16595
16653
  }
16596
- const resolvedPackageVersion = "0.5.186";
16654
+ const resolvedPackageVersion = "0.5.187";
16597
16655
  const PACKAGE_VERSION = resolvedPackageVersion;
16598
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.186";
16656
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.187";
16599
16657
  const roundParityValue = (value) => {
16600
16658
  if (typeof value !== "number") return value;
16601
16659
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -16894,8 +16952,8 @@ class PixldocsRenderer {
16894
16952
  if (shouldWatermark) {
16895
16953
  const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-B0ab38Ok.cjs"));
16896
16954
  configToRender = injectWatermark(configToRender, watermarkOptions);
16897
- const { injectPreviewBlur } = await Promise.resolve().then(() => require("./previewBlur-D2aWUrre.cjs"));
16898
- configToRender = injectPreviewBlur(configToRender);
16955
+ const { injectPreviewBlur: injectPreviewBlur2 } = await Promise.resolve().then(() => previewBlur);
16956
+ configToRender = injectPreviewBlur2(configToRender);
16899
16957
  }
16900
16958
  return this.renderAllPages(configToRender, renderOpts);
16901
16959
  }
@@ -16953,8 +17011,8 @@ class PixldocsRenderer {
16953
17011
  if (shouldWatermark) {
16954
17012
  const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-B0ab38Ok.cjs"));
16955
17013
  configToRender = injectWatermark(configToRender, watermarkOptions);
16956
- const { injectPreviewBlur } = await Promise.resolve().then(() => require("./previewBlur-D2aWUrre.cjs"));
16957
- configToRender = injectPreviewBlur(configToRender);
17014
+ const { injectPreviewBlur: injectPreviewBlur2 } = await Promise.resolve().then(() => previewBlur);
17015
+ configToRender = injectPreviewBlur2(configToRender);
16958
17016
  }
16959
17017
  return this.renderAllPageSvgs(configToRender);
16960
17018
  }
@@ -16997,8 +17055,8 @@ class PixldocsRenderer {
16997
17055
  if (shouldWatermark) {
16998
17056
  const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-B0ab38Ok.cjs"));
16999
17057
  configToRender = injectWatermark(configToRender, watermarkOptions);
17000
- const { injectPreviewBlur } = await Promise.resolve().then(() => require("./previewBlur-D2aWUrre.cjs"));
17001
- configToRender = injectPreviewBlur(configToRender);
17058
+ const { injectPreviewBlur: injectPreviewBlur2 } = await Promise.resolve().then(() => previewBlur);
17059
+ configToRender = injectPreviewBlur2(configToRender);
17002
17060
  }
17003
17061
  return this.renderPdfViaClientExport(configToRender, {
17004
17062
  title: title ?? resolved.config.name,
@@ -17103,7 +17161,7 @@ class PixldocsRenderer {
17103
17161
  await this.waitForCanvasScene(container, cloned, i);
17104
17162
  }
17105
17163
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
17106
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-Dh3el4F0.cjs"));
17164
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-BknzMTNP.cjs"));
17107
17165
  const prepared = preparePagesForExport(
17108
17166
  cloned.pages,
17109
17167
  canvasWidth,
@@ -17945,7 +18003,7 @@ function collectFontSpecsFromMarkup(markup) {
17945
18003
  }
17946
18004
  return Array.from(specs);
17947
18005
  }
17948
- function parseColor(color) {
18006
+ function parseColor$1(color) {
17949
18007
  if (!color) return null;
17950
18008
  const raw = color.trim().toLowerCase();
17951
18009
  if (!raw || raw === "transparent" || raw === "none") return null;
@@ -18498,7 +18556,7 @@ function stripSuspiciousFullPageOverlayNodes(svg) {
18498
18556
  if (!(pageWidth > 0 && pageHeight > 0)) return;
18499
18557
  const isNear = (a, b, tolerance = 0.75) => Math.abs(a - b) <= tolerance;
18500
18558
  const isDarkPaint = (value) => {
18501
- const rgb = value ? parseColor(value) : null;
18559
+ const rgb = value ? parseColor$1(value) : null;
18502
18560
  return rgb ? rgb.r <= 32 && rgb.g <= 32 && rgb.b <= 32 : false;
18503
18561
  };
18504
18562
  const removeIfSuspicious = (el) => {
@@ -18611,13 +18669,13 @@ function inlineComputedStyles(svg) {
18611
18669
  const fill = cs.fill;
18612
18670
  const stroke = cs.stroke;
18613
18671
  if (fill && fill !== "none" && fill !== "rgba(0, 0, 0, 0)") {
18614
- const parsed = parseColor(fill);
18672
+ const parsed = parseColor$1(fill);
18615
18673
  if (parsed) el.setAttribute("fill", rgbToHex(parsed.r, parsed.g, parsed.b));
18616
18674
  } else if (fill === "rgba(0, 0, 0, 0)" || fill === "transparent") {
18617
18675
  el.setAttribute("fill", "none");
18618
18676
  }
18619
18677
  if (stroke && stroke !== "none" && stroke !== "rgba(0, 0, 0, 0)") {
18620
- const parsed = parseColor(stroke);
18678
+ const parsed = parseColor$1(stroke);
18621
18679
  if (parsed) el.setAttribute("stroke", rgbToHex(parsed.r, parsed.g, parsed.b));
18622
18680
  }
18623
18681
  }
@@ -18765,7 +18823,7 @@ function setPdfColorFromSvg(pdf, svg, _elementId) {
18765
18823
  const { fill, stroke } = getFirstExplicitColorFromSvg(svg);
18766
18824
  const setColor = (hex, setter) => {
18767
18825
  if (!hex) return;
18768
- const c = parseColor(hex);
18826
+ const c = parseColor$1(hex);
18769
18827
  if (c) pdf[setter](c.r, c.g, c.b);
18770
18828
  };
18771
18829
  setColor(fill, "setFillColor");
@@ -19248,7 +19306,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
19248
19306
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
19249
19307
  sanitizeSvgTreeForPdf(svgToDraw);
19250
19308
  try {
19251
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-Dh3el4F0.cjs"));
19309
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-BknzMTNP.cjs"));
19252
19310
  try {
19253
19311
  await logTextMeasurementDiagnostic(svgToDraw);
19254
19312
  } catch {
@@ -19268,7 +19326,7 @@ function drawPageBackground(pdf, pageIndex, pageWidth, pageHeight, backgroundCol
19268
19326
  if (backgroundGradient && ((_a = backgroundGradient.stops) == null ? void 0 : _a.length) >= 2) {
19269
19327
  const grad = backgroundGradient;
19270
19328
  const colorStops = grad.stops.map((s) => {
19271
- const c = parseColor(s.color);
19329
+ const c = parseColor$1(s.color);
19272
19330
  return {
19273
19331
  offset: Math.max(0, Math.min(1, Number(s.offset))),
19274
19332
  color: c ? [c.r, c.g, c.b] : [0, 0, 0]
@@ -19324,7 +19382,7 @@ function drawPageBackground(pdf, pageIndex, pageWidth, pageHeight, backgroundCol
19324
19382
  pdf.rect(0, 0, pageWidth, pageHeight, "F");
19325
19383
  }
19326
19384
  } else {
19327
- const bgColor = parseColor(backgroundColor && backgroundColor !== "transparent" ? backgroundColor : "#ffffff");
19385
+ const bgColor = parseColor$1(backgroundColor && backgroundColor !== "transparent" ? backgroundColor : "#ffffff");
19328
19386
  if (bgColor) {
19329
19387
  pdf.setFillColor(bgColor.r, bgColor.g, bgColor.b);
19330
19388
  pdf.rect(0, 0, pageWidth, pageHeight, "F");
@@ -19447,6 +19505,123 @@ async function assemblePdfFromSvgs(svgResults, options = {}) {
19447
19505
  pages: svgResults.map((p) => ({ width: p.width, height: p.height }))
19448
19506
  };
19449
19507
  }
19508
+ const OVERLAY_ID_PREFIX = "__pb_";
19509
+ function getNumber(v, fallback = 0) {
19510
+ return typeof v === "number" && Number.isFinite(v) ? v : fallback;
19511
+ }
19512
+ function resolveSize(node, key) {
19513
+ const v = node == null ? void 0 : node[key];
19514
+ if (typeof v === "number" && Number.isFinite(v)) return v;
19515
+ return 0;
19516
+ }
19517
+ function collectOverlays(node, parentLeft, parentTop, inheritedBlur, extraBaseIds, extraExactIds, out) {
19518
+ if (!node || typeof node !== "object") return;
19519
+ const matchesBase = !!(extraBaseIds && typeof node.id === "string" && extraBaseIds.has(baseId(node.id)));
19520
+ const matchesExact = !!(extraExactIds && typeof node.id === "string" && extraExactIds.has(node.id));
19521
+ const isBlurred = inheritedBlur || node.previewBlur === true || matchesBase || matchesExact;
19522
+ const absLeft = parentLeft + getNumber(node.left, 0);
19523
+ const absTop = parentTop + getNumber(node.top, 0);
19524
+ if (node.type === "group") {
19525
+ const children = node.children || node.elements;
19526
+ if (Array.isArray(children)) {
19527
+ for (const child of children) {
19528
+ collectOverlays(child, absLeft, absTop, isBlurred, extraBaseIds, extraExactIds, out);
19529
+ }
19530
+ }
19531
+ return;
19532
+ }
19533
+ if (!isBlurred) return;
19534
+ const scaleX = getNumber(node.scaleX, 1) || 1;
19535
+ const scaleY = getNumber(node.scaleY, 1) || 1;
19536
+ const w = Math.max(4, resolveSize(node, "width") * scaleX);
19537
+ const h = Math.max(4, resolveSize(node, "height") * scaleY);
19538
+ out.push({
19539
+ left: absLeft,
19540
+ top: absTop,
19541
+ width: w,
19542
+ height: h,
19543
+ hintFill: typeof node.fill === "string" ? node.fill : void 0
19544
+ });
19545
+ }
19546
+ function parseColor(c) {
19547
+ if (!c) return null;
19548
+ const s = c.trim();
19549
+ const hex = s.match(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i);
19550
+ if (hex) {
19551
+ let h = hex[1];
19552
+ if (h.length === 3) h = h.split("").map((x) => x + x).join("");
19553
+ return {
19554
+ r: parseInt(h.slice(0, 2), 16),
19555
+ g: parseInt(h.slice(2, 4), 16),
19556
+ b: parseInt(h.slice(4, 6), 16)
19557
+ };
19558
+ }
19559
+ const rgb = s.match(/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/i);
19560
+ if (rgb) return { r: +rgb[1], g: +rgb[2], b: +rgb[3] };
19561
+ return null;
19562
+ }
19563
+ function buildOverlay(b, idx) {
19564
+ const c = parseColor(b.hintFill);
19565
+ const lum = c ? (0.299 * c.r + 0.587 * c.g + 0.114 * c.b) / 255 : 0.2;
19566
+ const isLightGlass = lum < 0.5;
19567
+ const baseFill = isLightGlass ? "rgba(245,245,245,0.68)" : "rgba(30,30,30,0.62)";
19568
+ return {
19569
+ id: `${OVERLAY_ID_PREFIX}${idx}`,
19570
+ type: "shape",
19571
+ shapeType: "rounded-rect",
19572
+ left: b.left,
19573
+ top: b.top,
19574
+ width: b.width,
19575
+ height: b.height,
19576
+ cornerRadius: 0,
19577
+ fill: baseFill,
19578
+ stroke: "transparent",
19579
+ strokeWidth: 0,
19580
+ opacity: 1,
19581
+ selectable: false,
19582
+ locked: true,
19583
+ visible: true,
19584
+ scaleX: 1,
19585
+ scaleY: 1
19586
+ };
19587
+ }
19588
+ function injectPreviewBlur(config, options) {
19589
+ const cloned = typeof structuredClone === "function" ? structuredClone(config) : JSON.parse(JSON.stringify(config));
19590
+ const extraBase = (options == null ? void 0 : options.extraElementBaseIds) && options.extraElementBaseIds.size > 0 ? options.extraElementBaseIds : void 0;
19591
+ const extraExact = (options == null ? void 0 : options.extraElementExactIds) && options.extraElementExactIds.size > 0 ? options.extraElementExactIds : void 0;
19592
+ let idx = 0;
19593
+ for (const page of cloned.pages || []) {
19594
+ const children = page.children || page.elements;
19595
+ if (!Array.isArray(children)) continue;
19596
+ const overlays = [];
19597
+ for (const child of children) {
19598
+ collectOverlays(child, 0, 0, false, extraBase, extraExact, overlays);
19599
+ }
19600
+ if (overlays.length === 0) continue;
19601
+ for (const b of overlays) {
19602
+ children.push(buildOverlay(b, idx++));
19603
+ }
19604
+ }
19605
+ return cloned;
19606
+ }
19607
+ function hasAnyPreviewBlur(config) {
19608
+ function walk(node) {
19609
+ if (!node || typeof node !== "object") return false;
19610
+ if (node.previewBlur === true) return true;
19611
+ const children = node.children || node.elements;
19612
+ if (Array.isArray(children)) {
19613
+ for (const c of children) if (walk(c)) return true;
19614
+ }
19615
+ return false;
19616
+ }
19617
+ for (const page of config.pages || []) if (walk(page)) return true;
19618
+ return false;
19619
+ }
19620
+ const previewBlur = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
19621
+ __proto__: null,
19622
+ hasAnyPreviewBlur,
19623
+ injectPreviewBlur
19624
+ }, Symbol.toStringTag, { value: "Module" }));
19450
19625
  const SELECT_COLUMNS = "id,name,description,category,thumbnail_url,preview_images,price,download_count,workspace_id,sort_order,created_at,updated_at";
19451
19626
  async function listPublishedTemplates(options) {
19452
19627
  const { workspaceId, supabaseUrl, supabaseAnonKey, category, limit = 200, offset = 0 } = options;
@@ -19598,7 +19773,6 @@ exports.applyThemeToConfig = applyThemeToConfig;
19598
19773
  exports.assemblePdfFromSvgs = assemblePdfFromSvgs;
19599
19774
  exports.awaitFontsForConfig = awaitFontsForConfig;
19600
19775
  exports.bakeEdgeFade = bakeEdgeFade;
19601
- exports.baseId = baseId;
19602
19776
  exports.buildRoundedTrianglePath = buildRoundedTrianglePath;
19603
19777
  exports.canvasImageLoader = canvasImageLoader;
19604
19778
  exports.captureFabricCanvasSvgForPdf = captureFabricCanvasSvgForPdf;
@@ -19622,7 +19796,9 @@ exports.getPublishedTemplate = getPublishedTemplate;
19622
19796
  exports.getRoundedRectRadii = getRoundedRectRadii;
19623
19797
  exports.getTemplateForm = getTemplateForm;
19624
19798
  exports.getTrianglePoints = getTrianglePoints;
19799
+ exports.hasAnyPreviewBlur = hasAnyPreviewBlur;
19625
19800
  exports.hasEdgeFade = hasEdgeFade;
19801
+ exports.injectPreviewBlur = injectPreviewBlur;
19626
19802
  exports.isBundledAssetUrl = isBundledAssetUrl;
19627
19803
  exports.isElement = isElement;
19628
19804
  exports.isFontAvailable = isFontAvailable;
@@ -19634,6 +19810,7 @@ exports.normalizeFontFamily = normalizeFontFamily;
19634
19810
  exports.normalizeShapeType = normalizeShapeType;
19635
19811
  exports.parseTextMarkdown = parseTextMarkdown;
19636
19812
  exports.renderSmartElementToSvg = renderSmartElementToSvg;
19813
+ exports.resolveBlurElementExactIdsFromFlatFormKeys = resolveBlurElementExactIdsFromFlatFormKeys;
19637
19814
  exports.resolveFontWeight = resolveFontWeight;
19638
19815
  exports.resolveFromForm = resolveFromForm;
19639
19816
  exports.resolveTemplateData = resolveTemplateData;
@@ -19642,4 +19819,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
19642
19819
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
19643
19820
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
19644
19821
  exports.warmTemplateFromForm = warmTemplateFromForm;
19645
- //# sourceMappingURL=index-_ogxqALr.cjs.map
19822
+ //# sourceMappingURL=index-DgMi1JSR.cjs.map