@pixldocs/canvas-renderer 0.3.16 → 0.3.18

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.
@@ -0,0 +1,119 @@
1
+ const WATERMARK_ID_PREFIX = "__wm_";
2
+ function getWatermarkText() {
3
+ try {
4
+ const host = window.location.hostname;
5
+ if (host.includes("biomaker")) return "biomaker.app";
6
+ } catch {
7
+ }
8
+ return "pixldocs.com";
9
+ }
10
+ function getLuminance(color) {
11
+ if (!color || color === "transparent" || color === "none") return 1;
12
+ let r = 255, g = 255, b = 255;
13
+ if (color.startsWith("#")) {
14
+ const hex = color.slice(1);
15
+ const full = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
16
+ const n = parseInt(full, 16);
17
+ r = n >> 16 & 255;
18
+ g = n >> 8 & 255;
19
+ b = n & 255;
20
+ } else {
21
+ const m = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
22
+ if (m) {
23
+ r = +m[1];
24
+ g = +m[2];
25
+ b = +m[3];
26
+ }
27
+ }
28
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
29
+ }
30
+ function getWatermarkColor(bgColor) {
31
+ const lum = getLuminance(bgColor);
32
+ return lum < 0.45 ? "#cccccc" : "#808080";
33
+ }
34
+ function getPageBgColor(page, canvasBg) {
35
+ var _a, _b;
36
+ const settingsBg = (_a = page.settings) == null ? void 0 : _a.backgroundColor;
37
+ if (settingsBg && settingsBg !== "transparent" && settingsBg !== "none") {
38
+ return settingsBg;
39
+ }
40
+ const children = page.children || [];
41
+ for (const child of children) {
42
+ if (child.type === "shape" && child.fill && child.fill !== "transparent" && child.fill !== "none") {
43
+ return child.fill;
44
+ }
45
+ if ((_b = child.children) == null ? void 0 : _b.length) {
46
+ for (const gc of child.children) {
47
+ if (gc.type === "shape" && gc.fill && gc.fill !== "transparent" && gc.fill !== "none") {
48
+ return gc.fill;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ return canvasBg;
54
+ }
55
+ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
56
+ const elements = [];
57
+ const text = getWatermarkText();
58
+ const fontSize = 18;
59
+ const angle = -30;
60
+ const estimatedTextWidth = text.length * fontSize * 0.55;
61
+ const spacingX = Math.max(160, estimatedTextWidth + 30);
62
+ const spacingY = 90;
63
+ const startX = -canvasWidth * 0.3;
64
+ const startY = -canvasHeight * 0.3;
65
+ const endX = canvasWidth * 1.5;
66
+ const endY = canvasHeight * 1.5;
67
+ let idx = 0;
68
+ for (let y = startY; y < endY; y += spacingY) {
69
+ for (let x = startX; x < endX; x += spacingX) {
70
+ elements.push({
71
+ id: `${WATERMARK_ID_PREFIX}${idx++}`,
72
+ type: "text",
73
+ left: x,
74
+ top: y,
75
+ width: 200,
76
+ height: 40,
77
+ text,
78
+ fontFamily: "Montserrat",
79
+ fontSize,
80
+ fontWeight: "600",
81
+ fill: wmColor,
82
+ angle,
83
+ selectable: false,
84
+ locked: true,
85
+ visible: true,
86
+ opacity: 0.14,
87
+ scaleX: 1,
88
+ scaleY: 1,
89
+ letterSpacing: 4
90
+ });
91
+ }
92
+ }
93
+ return elements;
94
+ }
95
+ function injectWatermark(config) {
96
+ var _a, _b, _c;
97
+ const canvasWidth = ((_a = config.canvas) == null ? void 0 : _a.width) || 612;
98
+ const canvasHeight = ((_b = config.canvas) == null ? void 0 : _b.height) || 792;
99
+ const canvasBg = (_c = config.canvas) == null ? void 0 : _c.backgroundColor;
100
+ return {
101
+ ...config,
102
+ pages: config.pages.map((page) => {
103
+ const pageBg = getPageBgColor(page, canvasBg);
104
+ const wmColor = getWatermarkColor(pageBg);
105
+ const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor);
106
+ return {
107
+ ...page,
108
+ children: [
109
+ ...page.children || [],
110
+ ...watermarkElements
111
+ ]
112
+ };
113
+ })
114
+ };
115
+ }
116
+ export {
117
+ injectWatermark
118
+ };
119
+ //# sourceMappingURL=canvasWatermark-CM85x4k7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasWatermark-CM85x4k7.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/** 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): CanvasElement[] {\n const elements: CanvasElement[] = [];\n const text = getWatermarkText();\n const fontSize = 18;\n const angle = -30;\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: 0.14,\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(config: TemplateConfig): 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);\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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"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const WATERMARK_ID_PREFIX = "__wm_";
4
+ function getWatermarkText() {
5
+ try {
6
+ const host = window.location.hostname;
7
+ if (host.includes("biomaker")) return "biomaker.app";
8
+ } catch {
9
+ }
10
+ return "pixldocs.com";
11
+ }
12
+ function getLuminance(color) {
13
+ if (!color || color === "transparent" || color === "none") return 1;
14
+ let r = 255, g = 255, b = 255;
15
+ if (color.startsWith("#")) {
16
+ const hex = color.slice(1);
17
+ const full = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
18
+ const n = parseInt(full, 16);
19
+ r = n >> 16 & 255;
20
+ g = n >> 8 & 255;
21
+ b = n & 255;
22
+ } else {
23
+ const m = color.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
24
+ if (m) {
25
+ r = +m[1];
26
+ g = +m[2];
27
+ b = +m[3];
28
+ }
29
+ }
30
+ return (0.299 * r + 0.587 * g + 0.114 * b) / 255;
31
+ }
32
+ function getWatermarkColor(bgColor) {
33
+ const lum = getLuminance(bgColor);
34
+ return lum < 0.45 ? "#cccccc" : "#808080";
35
+ }
36
+ function getPageBgColor(page, canvasBg) {
37
+ var _a, _b;
38
+ const settingsBg = (_a = page.settings) == null ? void 0 : _a.backgroundColor;
39
+ if (settingsBg && settingsBg !== "transparent" && settingsBg !== "none") {
40
+ return settingsBg;
41
+ }
42
+ const children = page.children || [];
43
+ for (const child of children) {
44
+ if (child.type === "shape" && child.fill && child.fill !== "transparent" && child.fill !== "none") {
45
+ return child.fill;
46
+ }
47
+ if ((_b = child.children) == null ? void 0 : _b.length) {
48
+ for (const gc of child.children) {
49
+ if (gc.type === "shape" && gc.fill && gc.fill !== "transparent" && gc.fill !== "none") {
50
+ return gc.fill;
51
+ }
52
+ }
53
+ }
54
+ }
55
+ return canvasBg;
56
+ }
57
+ function generateWatermarkElements(canvasWidth, canvasHeight, wmColor) {
58
+ const elements = [];
59
+ const text = getWatermarkText();
60
+ const fontSize = 18;
61
+ const angle = -30;
62
+ const estimatedTextWidth = text.length * fontSize * 0.55;
63
+ const spacingX = Math.max(160, estimatedTextWidth + 30);
64
+ const spacingY = 90;
65
+ const startX = -canvasWidth * 0.3;
66
+ const startY = -canvasHeight * 0.3;
67
+ const endX = canvasWidth * 1.5;
68
+ const endY = canvasHeight * 1.5;
69
+ let idx = 0;
70
+ for (let y = startY; y < endY; y += spacingY) {
71
+ for (let x = startX; x < endX; x += spacingX) {
72
+ elements.push({
73
+ id: `${WATERMARK_ID_PREFIX}${idx++}`,
74
+ type: "text",
75
+ left: x,
76
+ top: y,
77
+ width: 200,
78
+ height: 40,
79
+ text,
80
+ fontFamily: "Montserrat",
81
+ fontSize,
82
+ fontWeight: "600",
83
+ fill: wmColor,
84
+ angle,
85
+ selectable: false,
86
+ locked: true,
87
+ visible: true,
88
+ opacity: 0.14,
89
+ scaleX: 1,
90
+ scaleY: 1,
91
+ letterSpacing: 4
92
+ });
93
+ }
94
+ }
95
+ return elements;
96
+ }
97
+ function injectWatermark(config) {
98
+ var _a, _b, _c;
99
+ const canvasWidth = ((_a = config.canvas) == null ? void 0 : _a.width) || 612;
100
+ const canvasHeight = ((_b = config.canvas) == null ? void 0 : _b.height) || 792;
101
+ const canvasBg = (_c = config.canvas) == null ? void 0 : _c.backgroundColor;
102
+ return {
103
+ ...config,
104
+ pages: config.pages.map((page) => {
105
+ const pageBg = getPageBgColor(page, canvasBg);
106
+ const wmColor = getWatermarkColor(pageBg);
107
+ const watermarkElements = generateWatermarkElements(canvasWidth, canvasHeight, wmColor);
108
+ return {
109
+ ...page,
110
+ children: [
111
+ ...page.children || [],
112
+ ...watermarkElements
113
+ ]
114
+ };
115
+ })
116
+ };
117
+ }
118
+ exports.injectWatermark = injectWatermark;
119
+ //# sourceMappingURL=canvasWatermark-DAZIQ_IR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasWatermark-DAZIQ_IR.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/** 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): CanvasElement[] {\n const elements: CanvasElement[] = [];\n const text = getWatermarkText();\n const fontSize = 18;\n const angle = -30;\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: 0.14,\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(config: TemplateConfig): 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);\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
@@ -10093,7 +10093,7 @@ async function resolveTemplateData(options) {
10093
10093
  const defaultData = template.default_data;
10094
10094
  if (defaultData) config = applyFormDataSimple(config, defaultData);
10095
10095
  if (formData && Object.keys(formData).length > 0) config = applyFormDataSimple(config, formData);
10096
- return { config, templateName: template.name || "Untitled", templateId };
10096
+ return { config, templateName: template.name || "Untitled", templateId, price: template.price ?? 0 };
10097
10097
  }
10098
10098
  async function resolveFromForm(options) {
10099
10099
  var _a, _b, _c, _d;
@@ -10234,7 +10234,8 @@ async function resolveFromForm(options) {
10234
10234
  return {
10235
10235
  config: resolvedConfig,
10236
10236
  templateName: templateRow.name || "Untitled",
10237
- templateId
10237
+ templateId,
10238
+ price: templateRow.price ?? 0
10238
10239
  };
10239
10240
  }
10240
10241
  function flattenAll(nodes) {
@@ -10684,7 +10685,7 @@ class PixldocsRenderer {
10684
10685
  * This is the primary external API for the package.
10685
10686
  */
10686
10687
  async renderFromForm(options) {
10687
- const { templateId, formSchemaId, sectionState, themeId, ...renderOpts } = options;
10688
+ const { templateId, formSchemaId, sectionState, themeId, watermark, ...renderOpts } = options;
10688
10689
  const resolved = await resolveFromForm({
10689
10690
  templateId,
10690
10691
  formSchemaId,
@@ -10693,7 +10694,13 @@ class PixldocsRenderer {
10693
10694
  supabaseUrl: this.config.supabaseUrl,
10694
10695
  supabaseAnonKey: this.config.supabaseAnonKey
10695
10696
  });
10696
- return this.renderAllPages(resolved.config, renderOpts);
10697
+ const shouldWatermark = watermark ?? resolved.price > 0;
10698
+ let configToRender = resolved.config;
10699
+ if (shouldWatermark) {
10700
+ const { injectWatermark } = await Promise.resolve().then(() => require("./canvasWatermark-DAZIQ_IR.cjs"));
10701
+ configToRender = injectWatermark(configToRender);
10702
+ }
10703
+ return this.renderAllPages(configToRender, renderOpts);
10697
10704
  }
10698
10705
  /**
10699
10706
  * Convenience: fetch by ID with simple flat data and render.