@pixldocs/canvas-renderer 0.5.40 → 0.5.42

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.
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const WATERMARK_ID_PREFIX = "__wm_";
4
+ const DEFAULT_WATERMARK_OPACITY = 0.14;
5
+ const DEFAULT_WATERMARK_FONT_SIZE = 18;
6
+ const DEFAULT_WATERMARK_ANGLE = -30;
4
7
  function getWatermarkText() {
5
8
  try {
6
9
  const host = window.location.hostname;
@@ -54,11 +57,12 @@ function getPageBgColor(page, canvasBg) {
54
57
  }
55
58
  return canvasBg;
56
59
  }
57
- function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
60
+ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor, options = {}) {
58
61
  const elements = [];
59
- const text = getWatermarkText();
60
- const fontSize = 18;
61
- const angle = -30;
62
+ const text = options.text ?? getWatermarkText();
63
+ const fontSize = options.fontSize ?? DEFAULT_WATERMARK_FONT_SIZE;
64
+ const angle = options.angle ?? DEFAULT_WATERMARK_ANGLE;
65
+ const opacity = options.opacity ?? DEFAULT_WATERMARK_OPACITY;
62
66
  const estimatedTextWidth = text.length * fontSize * 0.55;
63
67
  const spacingX = Math.max(160, estimatedTextWidth + 30);
64
68
  const spacingY = 90;
@@ -85,7 +89,7 @@ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
85
89
  selectable: false,
86
90
  locked: true,
87
91
  visible: true,
88
- opacity: 0.14,
92
+ opacity,
89
93
  scaleX: 1,
90
94
  scaleY: 1,
91
95
  letterSpacing: 4
@@ -94,7 +98,7 @@ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
94
98
  }
95
99
  return elements;
96
100
  }
97
- function injectWatermark(config) {
101
+ function injectWatermark(config, options = {}) {
98
102
  var _a, _b, _c;
99
103
  const canvasWidth = ((_a = config.canvas) == null ? void 0 : _a.width) || 612;
100
104
  const canvasHeight = ((_b = config.canvas) == null ? void 0 : _b.height) || 792;
@@ -104,7 +108,7 @@ function injectWatermark(config) {
104
108
  pages: config.pages.map((page) => {
105
109
  const pageBg = getPageBgColor(page, canvasBg);
106
110
  const wmColor = getWatermarkColor(pageBg);
107
- const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor);
111
+ const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor, options);
108
112
  return {
109
113
  ...page,
110
114
  children: [
@@ -116,4 +120,4 @@ function injectWatermark(config) {
116
120
  };
117
121
  }
118
122
  exports.injectWatermark = injectWatermark;
119
- //# sourceMappingURL=canvasWatermark-DAZIQ_IR.cjs.map
123
+ //# sourceMappingURL=canvasWatermark-B0ab38Ok.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasWatermark-B0ab38Ok.cjs","sources":["../../../src/lib/canvasWatermark.ts"],"sourcesContent":["/**\n * Injects diagonal \"PixlDocs\" watermark text elements into a TemplateConfig's pages.\n * The watermark elements are rendered as actual canvas text objects,\n * making them impossible to remove via browser inspect.\n */\n\nimport type { TemplateConfig, CanvasElement } from '@/types/editor';\n\nconst WATERMARK_ID_PREFIX = '__wm_';\n\n/** Optional overrides for watermark appearance. */\nexport interface WatermarkOptions {\n /** Override the watermark text. Defaults to domain-based ('pixldocs.com' / 'biomaker.app'). */\n text?: string;\n /** Opacity 0–1. Default: 0.14 */\n opacity?: number;\n /** Font size in px. Default: 18 */\n fontSize?: number;\n /** Rotation angle in degrees. Default: -30 */\n angle?: number;\n}\n\nconst DEFAULT_WATERMARK_OPACITY = 0.14;\nconst DEFAULT_WATERMARK_FONT_SIZE = 18;\nconst DEFAULT_WATERMARK_ANGLE = -30;\n\n/** Determine watermark text based on current domain */\nfunction getWatermarkText(): string {\n try {\n const host = window.location.hostname;\n if (host.includes('biomaker')) return 'biomaker.app';\n } catch {}\n return 'pixldocs.com';\n}\n\n/** Parse a hex/rgb color to luminance (0=black, 1=white) */\nfunction getLuminance(color: string | undefined): number {\n if (!color || color === 'transparent' || color === 'none') return 1; // assume light\n let r = 255, g = 255, b = 255;\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n const full = hex.length === 3 ? hex.split('').map(c => c + c).join('') : hex;\n const n = parseInt(full, 16);\n r = (n >> 16) & 255;\n g = (n >> 8) & 255;\n b = n & 255;\n } else {\n const m = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (m) { r = +m[1]; g = +m[2]; b = +m[3]; }\n }\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\n/** Pick watermark color that contrasts with page background */\nfunction getWatermarkColor(bgColor: string | undefined): string {\n const lum = getLuminance(bgColor);\n // Dark bg → light watermark, Light bg → dark watermark\n return lum < 0.45 ? '#cccccc' : '#808080';\n}\n\n/** Find the dominant background color of a page */\nfunction getPageBgColor(page: { children?: any[]; settings?: { backgroundColor?: string } }, canvasBg?: string): string | undefined {\n // 1. Check page-level settings (theme-applied bg lives here)\n const settingsBg = page.settings?.backgroundColor;\n if (settingsBg && settingsBg !== 'transparent' && settingsBg !== 'none') {\n return settingsBg;\n }\n // 2. Check first background shape fill\n const children = page.children || [];\n for (const child of children) {\n if (child.type === 'shape' && child.fill && child.fill !== 'transparent' && child.fill !== 'none') {\n return child.fill;\n }\n // Check inside groups (background groups)\n if (child.children?.length) {\n for (const gc of child.children) {\n if (gc.type === 'shape' && gc.fill && gc.fill !== 'transparent' && gc.fill !== 'none') {\n return gc.fill;\n }\n }\n }\n }\n return canvasBg;\n}\n\n/** Generate watermark text elements for a given canvas size */\nfunction generateWatermarkElements(\n canvasWidth: number,\n canvasHeight: number,\n wmColor: string,\n options: WatermarkOptions = {},\n): CanvasElement[] {\n const elements: CanvasElement[] = [];\n const text = options.text ?? getWatermarkText();\n const fontSize = options.fontSize ?? DEFAULT_WATERMARK_FONT_SIZE;\n const angle = options.angle ?? DEFAULT_WATERMARK_ANGLE;\n const opacity = options.opacity ?? DEFAULT_WATERMARK_OPACITY;\n // Adjust spacing based on text length to prevent overlap\n const estimatedTextWidth = text.length * fontSize * 0.55;\n const spacingX = Math.max(160, estimatedTextWidth + 30);\n const spacingY = 90;\n\n const startX = -canvasWidth * 0.3;\n const startY = -canvasHeight * 0.3;\n const endX = canvasWidth * 1.5;\n const endY = canvasHeight * 1.5;\n\n let idx = 0;\n for (let y = startY; y < endY; y += spacingY) {\n for (let x = startX; x < endX; x += spacingX) {\n elements.push({\n id: `${WATERMARK_ID_PREFIX}${idx++}`,\n type: 'text',\n left: x,\n top: y,\n width: 200,\n height: 40,\n text,\n fontFamily: 'Montserrat',\n fontSize,\n fontWeight: '600',\n fill: wmColor,\n angle,\n selectable: false,\n locked: true,\n visible: true,\n opacity,\n scaleX: 1,\n scaleY: 1,\n letterSpacing: 4,\n } as CanvasElement);\n }\n }\n return elements;\n}\n\n/**\n * Returns a new config with watermark elements injected into every page.\n * The original config is NOT mutated.\n */\nexport function injectWatermark(\n config: TemplateConfig,\n options: WatermarkOptions = {},\n): TemplateConfig {\n const canvasWidth = config.canvas?.width || 612;\n const canvasHeight = config.canvas?.height || 792;\n const canvasBg = (config.canvas as any)?.backgroundColor;\n\n return {\n ...config,\n pages: config.pages.map((page) => {\n const pageBg = getPageBgColor(page as any, canvasBg);\n const wmColor = getWatermarkColor(pageBg);\n const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor, options);\n return {\n ...page,\n children: [\n ...(page.children || []),\n ...watermarkElements,\n ],\n };\n }),\n };\n}\n\n/** Check if an element ID is a watermark element */\nexport function isWatermarkElement(id: string): boolean {\n return id.startsWith(WATERMARK_ID_PREFIX);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  const WATERMARK_ID_PREFIX = "__wm_";
2
+ const DEFAULT_WATERMARK_OPACITY = 0.14;
3
+ const DEFAULT_WATERMARK_FONT_SIZE = 18;
4
+ const DEFAULT_WATERMARK_ANGLE = -30;
2
5
  function getWatermarkText() {
3
6
  try {
4
7
  const host = window.location.hostname;
@@ -52,11 +55,12 @@ function getPageBgColor(page, canvasBg) {
52
55
  }
53
56
  return canvasBg;
54
57
  }
55
- function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
58
+ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor, options = {}) {
56
59
  const elements = [];
57
- const text = getWatermarkText();
58
- const fontSize = 18;
59
- const angle = -30;
60
+ const text = options.text ?? getWatermarkText();
61
+ const fontSize = options.fontSize ?? DEFAULT_WATERMARK_FONT_SIZE;
62
+ const angle = options.angle ?? DEFAULT_WATERMARK_ANGLE;
63
+ const opacity = options.opacity ?? DEFAULT_WATERMARK_OPACITY;
60
64
  const estimatedTextWidth = text.length * fontSize * 0.55;
61
65
  const spacingX = Math.max(160, estimatedTextWidth + 30);
62
66
  const spacingY = 90;
@@ -83,7 +87,7 @@ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
83
87
  selectable: false,
84
88
  locked: true,
85
89
  visible: true,
86
- opacity: 0.14,
90
+ opacity,
87
91
  scaleX: 1,
88
92
  scaleY: 1,
89
93
  letterSpacing: 4
@@ -92,7 +96,7 @@ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
92
96
  }
93
97
  return elements;
94
98
  }
95
- function injectWatermark(config) {
99
+ function injectWatermark(config, options = {}) {
96
100
  var _a, _b, _c;
97
101
  const canvasWidth = ((_a = config.canvas) == null ? void 0 : _a.width) || 612;
98
102
  const canvasHeight = ((_b = config.canvas) == null ? void 0 : _b.height) || 792;
@@ -102,7 +106,7 @@ function injectWatermark(config) {
102
106
  pages: config.pages.map((page) => {
103
107
  const pageBg = getPageBgColor(page, canvasBg);
104
108
  const wmColor = getWatermarkColor(pageBg);
105
- const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor);
109
+ const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor, options);
106
110
  return {
107
111
  ...page,
108
112
  children: [
@@ -116,4 +120,4 @@ function injectWatermark(config) {
116
120
  export {
117
121
  injectWatermark
118
122
  };
119
- //# sourceMappingURL=canvasWatermark-CM85x4k7.js.map
123
+ //# sourceMappingURL=canvasWatermark-pkhacGge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasWatermark-pkhacGge.js","sources":["../../../src/lib/canvasWatermark.ts"],"sourcesContent":["/**\n * Injects diagonal \"PixlDocs\" watermark text elements into a TemplateConfig's pages.\n * The watermark elements are rendered as actual canvas text objects,\n * making them impossible to remove via browser inspect.\n */\n\nimport type { TemplateConfig, CanvasElement } from '@/types/editor';\n\nconst WATERMARK_ID_PREFIX = '__wm_';\n\n/** Optional overrides for watermark appearance. */\nexport interface WatermarkOptions {\n /** Override the watermark text. Defaults to domain-based ('pixldocs.com' / 'biomaker.app'). */\n text?: string;\n /** Opacity 0–1. Default: 0.14 */\n opacity?: number;\n /** Font size in px. Default: 18 */\n fontSize?: number;\n /** Rotation angle in degrees. Default: -30 */\n angle?: number;\n}\n\nconst DEFAULT_WATERMARK_OPACITY = 0.14;\nconst DEFAULT_WATERMARK_FONT_SIZE = 18;\nconst DEFAULT_WATERMARK_ANGLE = -30;\n\n/** Determine watermark text based on current domain */\nfunction getWatermarkText(): string {\n try {\n const host = window.location.hostname;\n if (host.includes('biomaker')) return 'biomaker.app';\n } catch {}\n return 'pixldocs.com';\n}\n\n/** Parse a hex/rgb color to luminance (0=black, 1=white) */\nfunction getLuminance(color: string | undefined): number {\n if (!color || color === 'transparent' || color === 'none') return 1; // assume light\n let r = 255, g = 255, b = 255;\n if (color.startsWith('#')) {\n const hex = color.slice(1);\n const full = hex.length === 3 ? hex.split('').map(c => c + c).join('') : hex;\n const n = parseInt(full, 16);\n r = (n >> 16) & 255;\n g = (n >> 8) & 255;\n b = n & 255;\n } else {\n const m = color.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (m) { r = +m[1]; g = +m[2]; b = +m[3]; }\n }\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n}\n\n/** Pick watermark color that contrasts with page background */\nfunction getWatermarkColor(bgColor: string | undefined): string {\n const lum = getLuminance(bgColor);\n // Dark bg → light watermark, Light bg → dark watermark\n return lum < 0.45 ? '#cccccc' : '#808080';\n}\n\n/** Find the dominant background color of a page */\nfunction getPageBgColor(page: { children?: any[]; settings?: { backgroundColor?: string } }, canvasBg?: string): string | undefined {\n // 1. Check page-level settings (theme-applied bg lives here)\n const settingsBg = page.settings?.backgroundColor;\n if (settingsBg && settingsBg !== 'transparent' && settingsBg !== 'none') {\n return settingsBg;\n }\n // 2. Check first background shape fill\n const children = page.children || [];\n for (const child of children) {\n if (child.type === 'shape' && child.fill && child.fill !== 'transparent' && child.fill !== 'none') {\n return child.fill;\n }\n // Check inside groups (background groups)\n if (child.children?.length) {\n for (const gc of child.children) {\n if (gc.type === 'shape' && gc.fill && gc.fill !== 'transparent' && gc.fill !== 'none') {\n return gc.fill;\n }\n }\n }\n }\n return canvasBg;\n}\n\n/** Generate watermark text elements for a given canvas size */\nfunction generateWatermarkElements(\n canvasWidth: number,\n canvasHeight: number,\n wmColor: string,\n options: WatermarkOptions = {},\n): CanvasElement[] {\n const elements: CanvasElement[] = [];\n const text = options.text ?? getWatermarkText();\n const fontSize = options.fontSize ?? DEFAULT_WATERMARK_FONT_SIZE;\n const angle = options.angle ?? DEFAULT_WATERMARK_ANGLE;\n const opacity = options.opacity ?? DEFAULT_WATERMARK_OPACITY;\n // Adjust spacing based on text length to prevent overlap\n const estimatedTextWidth = text.length * fontSize * 0.55;\n const spacingX = Math.max(160, estimatedTextWidth + 30);\n const spacingY = 90;\n\n const startX = -canvasWidth * 0.3;\n const startY = -canvasHeight * 0.3;\n const endX = canvasWidth * 1.5;\n const endY = canvasHeight * 1.5;\n\n let idx = 0;\n for (let y = startY; y < endY; y += spacingY) {\n for (let x = startX; x < endX; x += spacingX) {\n elements.push({\n id: `${WATERMARK_ID_PREFIX}${idx++}`,\n type: 'text',\n left: x,\n top: y,\n width: 200,\n height: 40,\n text,\n fontFamily: 'Montserrat',\n fontSize,\n fontWeight: '600',\n fill: wmColor,\n angle,\n selectable: false,\n locked: true,\n visible: true,\n opacity,\n scaleX: 1,\n scaleY: 1,\n letterSpacing: 4,\n } as CanvasElement);\n }\n }\n return elements;\n}\n\n/**\n * Returns a new config with watermark elements injected into every page.\n * The original config is NOT mutated.\n */\nexport function injectWatermark(\n config: TemplateConfig,\n options: WatermarkOptions = {},\n): TemplateConfig {\n const canvasWidth = config.canvas?.width || 612;\n const canvasHeight = config.canvas?.height || 792;\n const canvasBg = (config.canvas as any)?.backgroundColor;\n\n return {\n ...config,\n pages: config.pages.map((page) => {\n const pageBg = getPageBgColor(page as any, canvasBg);\n const wmColor = getWatermarkColor(pageBg);\n const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor, options);\n return {\n ...page,\n children: [\n ...(page.children || []),\n ...watermarkElements,\n ],\n };\n }),\n };\n}\n\n/** Check if an element ID is a watermark element */\nexport function isWatermarkElement(id: string): boolean {\n return id.startsWith(WATERMARK_ID_PREFIX);\n}\n"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -4801,6 +4801,157 @@ function calculateScaleSnapGuides(scalingObj, corner, canvas, canvasWidth, canva
4801
4801
  return true;
4802
4802
  });
4803
4803
  }
4804
+ const PD_BG_KEY = "__pdBg";
4805
+ const PATCHED_KEY = "__pdBgPatched";
4806
+ function extractTextBgConfig(element) {
4807
+ return {
4808
+ color: element.textBgColor,
4809
+ padding: Math.max(0, Number(element.textBgPadding ?? 0)) || 0,
4810
+ rxTL: Math.max(0, Number(element.textBgRxTL ?? 0)) || 0,
4811
+ rxTR: Math.max(0, Number(element.textBgRxTR ?? 0)) || 0,
4812
+ rxBR: Math.max(0, Number(element.textBgRxBR ?? 0)) || 0,
4813
+ rxBL: Math.max(0, Number(element.textBgRxBL ?? 0)) || 0
4814
+ };
4815
+ }
4816
+ function hasTextBackground(cfg) {
4817
+ if (!cfg) return false;
4818
+ const c = (cfg.color || "").toString().trim().toLowerCase();
4819
+ return !!c && c !== "transparent" && c !== "none" && c !== "rgba(0,0,0,0)";
4820
+ }
4821
+ function buildTextShadow(element) {
4822
+ const color = element.textShadowColor;
4823
+ const blur = Number(element.textShadowBlur ?? 0);
4824
+ const ox = Number(element.textShadowOffsetX ?? 0);
4825
+ const oy = Number(element.textShadowOffsetY ?? 0);
4826
+ if (!color || color === "transparent") return null;
4827
+ if (blur === 0 && ox === 0 && oy === 0) return null;
4828
+ return new fabric__namespace.Shadow({
4829
+ color,
4830
+ blur: blur || 0,
4831
+ offsetX: ox || 0,
4832
+ offsetY: oy || 0,
4833
+ affectStroke: false,
4834
+ nonScaling: false
4835
+ });
4836
+ }
4837
+ function buildRoundedRectPath2D(ctx, x, y, w, h, rTL, rTR, rBR, rBL) {
4838
+ const maxR = Math.min(w, h) / 2;
4839
+ const tl = Math.min(Math.max(0, rTL), maxR);
4840
+ const tr = Math.min(Math.max(0, rTR), maxR);
4841
+ const br = Math.min(Math.max(0, rBR), maxR);
4842
+ const bl = Math.min(Math.max(0, rBL), maxR);
4843
+ ctx.beginPath();
4844
+ ctx.moveTo(x + tl, y);
4845
+ ctx.lineTo(x + w - tr, y);
4846
+ if (tr > 0) ctx.quadraticCurveTo(x + w, y, x + w, y + tr);
4847
+ ctx.lineTo(x + w, y + h - br);
4848
+ if (br > 0) ctx.quadraticCurveTo(x + w, y + h, x + w - br, y + h);
4849
+ ctx.lineTo(x + bl, y + h);
4850
+ if (bl > 0) ctx.quadraticCurveTo(x, y + h, x, y + h - bl);
4851
+ ctx.lineTo(x, y + tl);
4852
+ if (tl > 0) ctx.quadraticCurveTo(x, y, x + tl, y);
4853
+ ctx.closePath();
4854
+ }
4855
+ function applyTextBackground(obj, cfg) {
4856
+ var _a;
4857
+ obj[PD_BG_KEY] = { ...cfg };
4858
+ if (obj[PATCHED_KEY]) return;
4859
+ obj[PATCHED_KEY] = true;
4860
+ const originalRender = obj._render.bind(obj);
4861
+ obj._render = function(ctx) {
4862
+ const bg = this[PD_BG_KEY];
4863
+ if (hasTextBackground(bg)) {
4864
+ const w = this.width ?? 0;
4865
+ const h = this.height ?? 0;
4866
+ const pad = Math.max(0, Number(bg.padding ?? 0));
4867
+ const x = -w / 2 - pad;
4868
+ const y = -h / 2 - pad;
4869
+ const bgW = w + pad * 2;
4870
+ const bgH = h + pad * 2;
4871
+ ctx.save();
4872
+ buildRoundedRectPath2D(
4873
+ ctx,
4874
+ x,
4875
+ y,
4876
+ bgW,
4877
+ bgH,
4878
+ bg.rxTL ?? 0,
4879
+ bg.rxTR ?? 0,
4880
+ bg.rxBR ?? 0,
4881
+ bg.rxBL ?? 0
4882
+ );
4883
+ ctx.fillStyle = bg.color;
4884
+ ctx.fill();
4885
+ ctx.restore();
4886
+ }
4887
+ originalRender(ctx);
4888
+ };
4889
+ const originalToObject = obj.toObject.bind(obj);
4890
+ obj.toObject = function(propertiesToInclude) {
4891
+ const out = originalToObject(propertiesToInclude);
4892
+ const bg = this[PD_BG_KEY];
4893
+ if (hasTextBackground(bg)) {
4894
+ out.__pdBg = { ...bg };
4895
+ }
4896
+ return out;
4897
+ };
4898
+ const originalToSVG = (_a = obj.toSVG) == null ? void 0 : _a.bind(obj);
4899
+ if (typeof originalToSVG === "function") {
4900
+ obj.toSVG = function(reviver) {
4901
+ const svg = originalToSVG(reviver);
4902
+ const bg = this[PD_BG_KEY];
4903
+ if (!hasTextBackground(bg)) return svg;
4904
+ const w = this.width ?? 0;
4905
+ const h = this.height ?? 0;
4906
+ const pad = Math.max(0, Number(bg.padding ?? 0));
4907
+ const x = -w / 2 - pad;
4908
+ const y = -h / 2 - pad;
4909
+ const bgW = w + pad * 2;
4910
+ const bgH = h + pad * 2;
4911
+ const d = buildRoundedRectPathD(
4912
+ x,
4913
+ y,
4914
+ bgW,
4915
+ bgH,
4916
+ bg.rxTL ?? 0,
4917
+ bg.rxTR ?? 0,
4918
+ bg.rxBR ?? 0,
4919
+ bg.rxBL ?? 0
4920
+ );
4921
+ const fill = bg.color;
4922
+ const bgPath = `<path d="${d}" fill="${escapeXmlAttr(fill)}" />`;
4923
+ const openTagMatch = svg.match(/^\s*<g\b[^>]*>/);
4924
+ if (openTagMatch) {
4925
+ const openTag = openTagMatch[0];
4926
+ return svg.replace(openTag, openTag + bgPath);
4927
+ }
4928
+ return `<g>${bgPath}${svg}</g>`;
4929
+ };
4930
+ }
4931
+ }
4932
+ function buildRoundedRectPathD(x, y, w, h, rTL, rTR, rBR, rBL) {
4933
+ const maxR = Math.min(w, h) / 2;
4934
+ const tl = Math.min(Math.max(0, rTL), maxR);
4935
+ const tr = Math.min(Math.max(0, rTR), maxR);
4936
+ const br = Math.min(Math.max(0, rBR), maxR);
4937
+ const bl = Math.min(Math.max(0, rBL), maxR);
4938
+ const fmt = (n) => Number.isFinite(n) ? Number(n.toFixed(3)) : 0;
4939
+ const parts = [];
4940
+ parts.push(`M ${fmt(x + tl)} ${fmt(y)}`);
4941
+ parts.push(`L ${fmt(x + w - tr)} ${fmt(y)}`);
4942
+ if (tr > 0) parts.push(`Q ${fmt(x + w)} ${fmt(y)} ${fmt(x + w)} ${fmt(y + tr)}`);
4943
+ parts.push(`L ${fmt(x + w)} ${fmt(y + h - br)}`);
4944
+ if (br > 0) parts.push(`Q ${fmt(x + w)} ${fmt(y + h)} ${fmt(x + w - br)} ${fmt(y + h)}`);
4945
+ parts.push(`L ${fmt(x + bl)} ${fmt(y + h)}`);
4946
+ if (bl > 0) parts.push(`Q ${fmt(x)} ${fmt(y + h)} ${fmt(x)} ${fmt(y + h - bl)}`);
4947
+ parts.push(`L ${fmt(x)} ${fmt(y + tl)}`);
4948
+ if (tl > 0) parts.push(`Q ${fmt(x)} ${fmt(y)} ${fmt(x + tl)} ${fmt(y)}`);
4949
+ parts.push("Z");
4950
+ return parts.join(" ");
4951
+ }
4952
+ function escapeXmlAttr(s) {
4953
+ return String(s).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
4954
+ }
4804
4955
  const TRIANGLE_STROKE_MITER_LIMIT = 1e6;
4805
4956
  const toSafeNumber = (value, fallback = 0) => Number.isFinite(value) ? Math.max(0, Number(value)) : fallback;
4806
4957
  function normalizeShapeType(shapeType) {
@@ -5101,6 +5252,9 @@ function createText(element) {
5101
5252
  textbox.setCoords();
5102
5253
  }
5103
5254
  textbox.dirty = true;
5255
+ applyTextBackground(textbox, extractTextBgConfig(element));
5256
+ const shadow = buildTextShadow(element);
5257
+ if (shadow) textbox.set("shadow", shadow);
5104
5258
  return textbox;
5105
5259
  }
5106
5260
  function createLine(element) {
@@ -7713,7 +7867,19 @@ const PageCanvas = react.forwardRef(
7713
7867
  const resolvedSizeForCompare = (pageChildren == null ? void 0 : pageChildren.length) ? getNodeBounds(element, pageChildren) : { width: typeof element.width === "number" ? element.width : 0, height: typeof element.height === "number" ? element.height : 0 };
7714
7868
  const fabricText = existingObj.text ?? "";
7715
7869
  const storeText = element.text ?? "";
7716
- const otherPropsChanged = Math.abs((existingObj.width ?? 0) - resolvedSizeForCompare.width) > 0.1 || Math.abs((existingObj.height ?? 0) - resolvedSizeForCompare.height) > 0.1 || Math.abs((existingObj.angle ?? 0) - (element.angle ?? 0)) > 0.1 || Math.abs((existingObj.scaleX ?? 1) - (element.scaleX ?? 1)) > 0.01 || Math.abs((existingObj.scaleY ?? 1) - (element.scaleY ?? 1)) > 0.01 || (existingObj.flipX ?? false) !== (element.flipX ?? false) || (existingObj.flipY ?? false) !== (element.flipY ?? false) || fabricText !== storeText || existingObj.fill !== (element.fill ?? "") || existingObj.stroke !== (element.stroke ?? "") || Math.abs((existingObj.strokeWidth ?? 0) - (element.strokeWidth ?? 0)) > 0.01 || Math.abs((existingObj.opacity ?? 1) - (element.opacity ?? 1)) > 0.01 || (existingObj.fontSize ?? 0) !== (element.fontSize ?? 0) || (existingObj.fontFamily ?? "") !== (element.fontFamily ?? "") || // CRITICAL: Detect gradient fill/stroke changes serialise to JSON for deep comparison
7870
+ const otherPropsChanged = Math.abs((existingObj.width ?? 0) - resolvedSizeForCompare.width) > 0.1 || Math.abs((existingObj.height ?? 0) - resolvedSizeForCompare.height) > 0.1 || Math.abs((existingObj.angle ?? 0) - (element.angle ?? 0)) > 0.1 || Math.abs((existingObj.scaleX ?? 1) - (element.scaleX ?? 1)) > 0.01 || Math.abs((existingObj.scaleY ?? 1) - (element.scaleY ?? 1)) > 0.01 || (existingObj.flipX ?? false) !== (element.flipX ?? false) || (existingObj.flipY ?? false) !== (element.flipY ?? false) || fabricText !== storeText || existingObj.fill !== (element.fill ?? "") || existingObj.stroke !== (element.stroke ?? "") || Math.abs((existingObj.strokeWidth ?? 0) - (element.strokeWidth ?? 0)) > 0.01 || Math.abs((existingObj.opacity ?? 1) - (element.opacity ?? 1)) > 0.01 || (existingObj.fontSize ?? 0) !== (element.fontSize ?? 0) || (existingObj.fontFamily ?? "") !== (element.fontFamily ?? "") || // Detect text background + shadow changes so panel edits flow into Fabric.
7871
+ JSON.stringify({
7872
+ c: element.textBgColor ?? null,
7873
+ p: element.textBgPadding ?? 0,
7874
+ tl: element.textBgRxTL ?? 0,
7875
+ tr: element.textBgRxTR ?? 0,
7876
+ br: element.textBgRxBR ?? 0,
7877
+ bl: element.textBgRxBL ?? 0,
7878
+ sc: element.textShadowColor ?? null,
7879
+ sb: element.textShadowBlur ?? 0,
7880
+ sx: element.textShadowOffsetX ?? 0,
7881
+ sy: element.textShadowOffsetY ?? 0
7882
+ }) !== (existingObj.__lastTextBgShadowJson ?? "") || // CRITICAL: Detect gradient fill/stroke changes — serialise to JSON for deep comparison
7717
7883
  JSON.stringify(element.fillGradient || null) !== (existingObj.__lastFillGradientJson ?? "null") || JSON.stringify(element.strokeGradient || null) !== (existingObj.__lastStrokeGradientJson ?? "null");
7718
7884
  const forceApplyFromPanel = syncTriggeredByPanelRef.current;
7719
7885
  const noPropsOrPositionChanged = !positionChanged && !otherPropsChanged;
@@ -8608,6 +8774,26 @@ const PageCanvas = react.forwardRef(
8608
8774
  }
8609
8775
  obj.setCoords();
8610
8776
  obj.dirty = true;
8777
+ try {
8778
+ applyTextBackground(obj, extractTextBgConfig(element));
8779
+ const shadow = buildTextShadow(element);
8780
+ obj.set("shadow", shadow ?? null);
8781
+ obj.__lastTextBgShadowJson = JSON.stringify({
8782
+ c: element.textBgColor ?? null,
8783
+ p: element.textBgPadding ?? 0,
8784
+ tl: element.textBgRxTL ?? 0,
8785
+ tr: element.textBgRxTR ?? 0,
8786
+ br: element.textBgRxBR ?? 0,
8787
+ bl: element.textBgRxBL ?? 0,
8788
+ sc: element.textShadowColor ?? null,
8789
+ sb: element.textShadowBlur ?? 0,
8790
+ sx: element.textShadowOffsetX ?? 0,
8791
+ sy: element.textShadowOffsetY ?? 0
8792
+ });
8793
+ obj.dirty = true;
8794
+ } catch (err) {
8795
+ console.warn("[text-bg] failed to apply background/shadow", err);
8796
+ }
8611
8797
  } else if (!isImage && !isLine) {
8612
8798
  if (obj instanceof fabric__namespace.Circle) {
8613
8799
  obj.set({
@@ -12072,7 +12258,7 @@ function PixldocsPreview(props) {
12072
12258
  !canvasSettled && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { position: "absolute", inset: 0, display: "flex", alignItems: "center", justifyContent: "center", minHeight: 200 }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { color: "#888", fontSize: 14 }, children: "Loading preview..." }) })
12073
12259
  ] });
12074
12260
  }
12075
- const PACKAGE_VERSION = "0.5.40";
12261
+ const PACKAGE_VERSION = "0.5.42";
12076
12262
  let __underlineFixInstalled = false;
12077
12263
  function installUnderlineFix(fab) {
12078
12264
  var _a;
@@ -12227,7 +12413,7 @@ class PixldocsRenderer {
12227
12413
  * This is the primary external API for the package.
12228
12414
  */
12229
12415
  async renderFromForm(options) {
12230
- const { templateId, formSchemaId, sectionState, themeId, watermark, prefetched, ...renderOpts } = options;
12416
+ const { templateId, formSchemaId, sectionState, themeId, watermark, watermarkOptions, prefetched, ...renderOpts } = options;
12231
12417
  const resolved = await resolveFromForm({
12232
12418
  templateId,
12233
12419
  formSchemaId,
@@ -12240,8 +12426,8 @@ class PixldocsRenderer {
12240
12426
  const shouldWatermark = watermark ?? resolved.price > 0;
12241
12427
  let configToRender = resolved.config;
12242
12428
  if (shouldWatermark) {
12243
- const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-DAZIQ_IR.cjs"));
12244
- configToRender = injectWatermark(configToRender);
12429
+ const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-B0ab38Ok.cjs"));
12430
+ configToRender = injectWatermark(configToRender, watermarkOptions);
12245
12431
  }
12246
12432
  return this.renderAllPages(configToRender, renderOpts);
12247
12433
  }
@@ -12280,7 +12466,7 @@ class PixldocsRenderer {
12280
12466
  * Resolve from V2 sectionState and return SVGs for all pages (for server vector PDF).
12281
12467
  */
12282
12468
  async renderSvgsFromForm(options) {
12283
- const { templateId, formSchemaId, sectionState, themeId, watermark, prefetched } = options;
12469
+ const { templateId, formSchemaId, sectionState, themeId, watermark, watermarkOptions, prefetched } = options;
12284
12470
  const resolved = await resolveFromForm({
12285
12471
  templateId,
12286
12472
  formSchemaId,
@@ -12293,8 +12479,8 @@ class PixldocsRenderer {
12293
12479
  const shouldWatermark = watermark ?? resolved.price > 0;
12294
12480
  let configToRender = resolved.config;
12295
12481
  if (shouldWatermark) {
12296
- const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-DAZIQ_IR.cjs"));
12297
- configToRender = injectWatermark(configToRender);
12482
+ const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-B0ab38Ok.cjs"));
12483
+ configToRender = injectWatermark(configToRender, watermarkOptions);
12298
12484
  }
12299
12485
  return this.renderAllPageSvgs(configToRender);
12300
12486
  }
@@ -12312,7 +12498,7 @@ class PixldocsRenderer {
12312
12498
  * This is the primary PDF export API — mirrors renderFromForm() but returns a PDF.
12313
12499
  */
12314
12500
  async renderPdfFromForm(options) {
12315
- const { templateId, formSchemaId, sectionState, themeId, watermark, prefetched, title, fontBaseUrl } = options;
12501
+ const { templateId, formSchemaId, sectionState, themeId, watermark, watermarkOptions, prefetched, title, fontBaseUrl } = options;
12316
12502
  const resolved = await resolveFromForm({
12317
12503
  templateId,
12318
12504
  formSchemaId,
@@ -12325,8 +12511,8 @@ class PixldocsRenderer {
12325
12511
  const shouldWatermark = watermark ?? resolved.price > 0;
12326
12512
  let configToRender = resolved.config;
12327
12513
  if (shouldWatermark) {
12328
- const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-DAZIQ_IR.cjs"));
12329
- configToRender = injectWatermark(configToRender);
12514
+ const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-B0ab38Ok.cjs"));
12515
+ configToRender = injectWatermark(configToRender, watermarkOptions);
12330
12516
  }
12331
12517
  const svgs = await this.renderAllPageSvgs(configToRender);
12332
12518
  const { assemblePdfFromSvgs: assemblePdfFromSvgs2 } = await Promise.resolve().then(() => pdfExport);