html2canvas-pro 1.6.6 → 2.0.0

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.
Files changed (123) hide show
  1. package/README.md +1 -0
  2. package/demo/image-smoothing-demo.html +256 -0
  3. package/demo/refactoring-test.html +602 -0
  4. package/dist/html2canvas-pro.esm.js +2846 -1238
  5. package/dist/html2canvas-pro.esm.js.map +1 -1
  6. package/dist/html2canvas-pro.js +2849 -1237
  7. package/dist/html2canvas-pro.js.map +1 -1
  8. package/dist/html2canvas-pro.min.js +5 -4
  9. package/dist/lib/__tests__/index.js +8 -2
  10. package/dist/lib/__tests__/index.js.map +1 -1
  11. package/dist/lib/config.js +72 -0
  12. package/dist/lib/config.js.map +1 -0
  13. package/dist/lib/core/__tests__/cache-storage.js +6 -3
  14. package/dist/lib/core/__tests__/cache-storage.js.map +1 -1
  15. package/dist/lib/core/__tests__/cache-storage.test.js +158 -0
  16. package/dist/lib/core/__tests__/cache-storage.test.js.map +1 -0
  17. package/dist/lib/core/__tests__/validator.js +296 -0
  18. package/dist/lib/core/__tests__/validator.js.map +1 -0
  19. package/dist/lib/core/cache-storage.js +130 -11
  20. package/dist/lib/core/cache-storage.js.map +1 -1
  21. package/dist/lib/core/context.js +5 -2
  22. package/dist/lib/core/context.js.map +1 -1
  23. package/dist/lib/core/debugger.js +3 -0
  24. package/dist/lib/core/debugger.js.map +1 -1
  25. package/dist/lib/core/origin-checker.js +54 -0
  26. package/dist/lib/core/origin-checker.js.map +1 -0
  27. package/dist/lib/core/performance-monitor.js +208 -0
  28. package/dist/lib/core/performance-monitor.js.map +1 -0
  29. package/dist/lib/core/validator.js +501 -0
  30. package/dist/lib/core/validator.js.map +1 -0
  31. package/dist/lib/css/index.js +2 -0
  32. package/dist/lib/css/index.js.map +1 -1
  33. package/dist/lib/css/property-descriptors/__tests__/background-tests.js +7 -1
  34. package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +1 -1
  35. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +142 -0
  36. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +1 -0
  37. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js +167 -0
  38. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +1 -0
  39. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +61 -0
  40. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +1 -0
  41. package/dist/lib/css/property-descriptors/image-rendering.js +34 -0
  42. package/dist/lib/css/property-descriptors/image-rendering.js.map +1 -0
  43. package/dist/lib/css/types/__tests__/image-tests.js +7 -1
  44. package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
  45. package/dist/lib/css/types/color-math.js +26 -0
  46. package/dist/lib/css/types/color-math.js.map +1 -0
  47. package/dist/lib/css/types/color-spaces/srgb.js +6 -6
  48. package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
  49. package/dist/lib/css/types/color-utilities.js +13 -22
  50. package/dist/lib/css/types/color-utilities.js.map +1 -1
  51. package/dist/lib/dom/__tests__/dom-normalizer.test.js +113 -0
  52. package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +1 -0
  53. package/dist/lib/dom/__tests__/element-container.test.js +109 -0
  54. package/dist/lib/dom/__tests__/element-container.test.js.map +1 -0
  55. package/dist/lib/dom/document-cloner.js +152 -11
  56. package/dist/lib/dom/document-cloner.js.map +1 -1
  57. package/dist/lib/dom/dom-normalizer.js +80 -0
  58. package/dist/lib/dom/dom-normalizer.js.map +1 -0
  59. package/dist/lib/dom/element-container.js +32 -15
  60. package/dist/lib/dom/element-container.js.map +1 -1
  61. package/dist/lib/dom/node-parser.js +16 -20
  62. package/dist/lib/dom/node-parser.js.map +1 -1
  63. package/dist/lib/dom/node-type-guards.js +44 -0
  64. package/dist/lib/dom/node-type-guards.js.map +1 -0
  65. package/dist/lib/dom/replaced-elements/iframe-element-container.js +5 -4
  66. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
  67. package/dist/lib/index.js +148 -41
  68. package/dist/lib/index.js.map +1 -1
  69. package/dist/lib/render/canvas/__tests__/background-renderer.test.js +65 -0
  70. package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +1 -0
  71. package/dist/lib/render/canvas/__tests__/border-renderer.test.js +23 -0
  72. package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +1 -0
  73. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +30 -0
  74. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +1 -0
  75. package/dist/lib/render/canvas/__tests__/text-renderer.test.js +63 -0
  76. package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +1 -0
  77. package/dist/lib/render/canvas/background-renderer.js +222 -0
  78. package/dist/lib/render/canvas/background-renderer.js.map +1 -0
  79. package/dist/lib/render/canvas/border-renderer.js +185 -0
  80. package/dist/lib/render/canvas/border-renderer.js.map +1 -0
  81. package/dist/lib/render/canvas/canvas-renderer.js +61 -689
  82. package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
  83. package/dist/lib/render/canvas/effects-renderer.js +89 -0
  84. package/dist/lib/render/canvas/effects-renderer.js.map +1 -0
  85. package/dist/lib/render/canvas/text-renderer.js +508 -0
  86. package/dist/lib/render/canvas/text-renderer.js.map +1 -0
  87. package/dist/lib/render/renderer-interface.js +3 -0
  88. package/dist/lib/render/renderer-interface.js.map +1 -0
  89. package/dist/types/config.d.ts +54 -0
  90. package/dist/types/core/__tests__/cache-storage.test.d.ts +1 -0
  91. package/dist/types/core/__tests__/validator.d.ts +1 -0
  92. package/dist/types/core/cache-storage.d.ts +42 -1
  93. package/dist/types/core/context.d.ts +5 -1
  94. package/dist/types/core/origin-checker.d.ts +33 -0
  95. package/dist/types/core/performance-monitor.d.ts +131 -0
  96. package/dist/types/core/validator.d.ts +132 -0
  97. package/dist/types/css/index.d.ts +2 -0
  98. package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +1 -0
  99. package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +1 -0
  100. package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +1 -0
  101. package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
  102. package/dist/types/css/types/color-math.d.ts +12 -0
  103. package/dist/types/css/types/color-utilities.d.ts +2 -3
  104. package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +1 -0
  105. package/dist/types/dom/__tests__/element-container.test.d.ts +1 -0
  106. package/dist/types/dom/document-cloner.d.ts +46 -0
  107. package/dist/types/dom/dom-normalizer.d.ts +43 -0
  108. package/dist/types/dom/element-container.d.ts +20 -1
  109. package/dist/types/dom/node-parser.d.ts +2 -7
  110. package/dist/types/dom/node-type-guards.d.ts +33 -0
  111. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +4 -1
  112. package/dist/types/index.d.ts +48 -3
  113. package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +1 -0
  114. package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +1 -0
  115. package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +1 -0
  116. package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +1 -0
  117. package/dist/types/render/canvas/background-renderer.d.ts +87 -0
  118. package/dist/types/render/canvas/border-renderer.d.ts +67 -0
  119. package/dist/types/render/canvas/canvas-renderer.d.ts +19 -23
  120. package/dist/types/render/canvas/effects-renderer.d.ts +64 -0
  121. package/dist/types/render/canvas/text-renderer.d.ts +57 -0
  122. package/dist/types/render/renderer-interface.d.ts +26 -0
  123. package/package.json +2 -1
@@ -0,0 +1,508 @@
1
+ "use strict";
2
+ /**
3
+ * Text Renderer
4
+ *
5
+ * Handles rendering of text content including:
6
+ * - Text with letter spacing
7
+ * - Text decorations (underline, overline, line-through)
8
+ * - Text shadows
9
+ * - Webkit line clamp
10
+ * - Text overflow ellipsis
11
+ * - Paint order (fill/stroke)
12
+ * - Font styles
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.TextRenderer = void 0;
16
+ const text_1 = require("../../css/layout/text");
17
+ const color_utilities_1 = require("../../css/types/color-utilities");
18
+ const parser_1 = require("../../css/syntax/parser");
19
+ // iOS font fix - see https://github.com/niklasvh/html2canvas/pull/2645
20
+ const iOSBrokenFonts = ['-apple-system', 'system-ui'];
21
+ /**
22
+ * Detect iOS version from user agent
23
+ * Returns null if not iOS or version cannot be determined
24
+ */
25
+ const getIOSVersion = () => {
26
+ if (typeof navigator === 'undefined') {
27
+ return null;
28
+ }
29
+ const userAgent = navigator.userAgent;
30
+ // Check if it's iOS or iPadOS
31
+ // iPadOS 13+ may identify as Macintosh, check for touch support
32
+ const isIOS = /iPhone|iPad|iPod/.test(userAgent);
33
+ const isIPadOS = /Macintosh/.test(userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;
34
+ if (!isIOS && !isIPadOS) {
35
+ return null;
36
+ }
37
+ // Extract version number from various iOS user agent formats:
38
+ // - "iPhone OS 15_0" or "iPhone OS 15_0_1"
39
+ // - "CPU OS 15_0 like Mac OS X"
40
+ // - "CPU iPhone OS 15_0 like Mac OS X"
41
+ // - "Version/15.0" (for iPadOS)
42
+ const patterns = [
43
+ /(?:iPhone|CPU(?:\siPhone)?)\sOS\s(\d+)[\._](\d+)/, // iPhone OS, CPU OS, CPU iPhone OS
44
+ /Version\/(\d+)\.(\d+)/ // Version/15.0 (iPadOS)
45
+ ];
46
+ for (const pattern of patterns) {
47
+ const match = userAgent.match(pattern);
48
+ if (match && match[1]) {
49
+ return parseInt(match[1], 10);
50
+ }
51
+ }
52
+ return null;
53
+ };
54
+ const fixIOSSystemFonts = (fontFamilies) => {
55
+ const iosVersion = getIOSVersion();
56
+ // On iOS 15.0 and 15.1, system fonts have rendering issues
57
+ // Fixed in iOS 17+
58
+ if (iosVersion !== null && iosVersion >= 15 && iosVersion < 17) {
59
+ return fontFamilies.map((fontFamily) => iOSBrokenFonts.indexOf(fontFamily) !== -1
60
+ ? `-apple-system, "Helvetica Neue", Arial, sans-serif`
61
+ : fontFamily);
62
+ }
63
+ return fontFamilies;
64
+ };
65
+ /**
66
+ * Text Renderer
67
+ *
68
+ * Specialized renderer for text content.
69
+ * Extracted from CanvasRenderer to improve code organization and maintainability.
70
+ */
71
+ class TextRenderer {
72
+ constructor(deps) {
73
+ this.ctx = deps.ctx;
74
+ // context stored but not used directly in this renderer
75
+ this.options = deps.options;
76
+ }
77
+ /**
78
+ * Render text with letter spacing
79
+ * Public method used by list rendering
80
+ */
81
+ renderTextWithLetterSpacing(text, letterSpacing, baseline) {
82
+ if (letterSpacing === 0) {
83
+ // Use alphabetic baseline for consistent text positioning across browsers
84
+ // Issue #129: text.bounds.top + text.bounds.height causes text to render too low
85
+ this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + baseline);
86
+ }
87
+ else {
88
+ const letters = (0, text_1.segmentGraphemes)(text.text);
89
+ letters.reduce((left, letter) => {
90
+ this.ctx.fillText(letter, left, text.bounds.top + baseline);
91
+ return left + this.ctx.measureText(letter).width;
92
+ }, text.bounds.left);
93
+ }
94
+ }
95
+ /**
96
+ * Helper method to render text with paint order support
97
+ * Reduces code duplication in line-clamp and normal rendering
98
+ */
99
+ renderTextBoundWithPaintOrder(textBound, styles, paintOrderLayers) {
100
+ paintOrderLayers.forEach((paintOrderLayer) => {
101
+ switch (paintOrderLayer) {
102
+ case 0 /* PAINT_ORDER_LAYER.FILL */:
103
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
104
+ this.renderTextWithLetterSpacing(textBound, styles.letterSpacing, styles.fontSize.number);
105
+ break;
106
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
107
+ if (styles.webkitTextStrokeWidth && textBound.text.trim().length) {
108
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
109
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
110
+ this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
111
+ this.renderTextWithLetterSpacing(textBound, styles.letterSpacing, styles.fontSize.number);
112
+ }
113
+ break;
114
+ }
115
+ });
116
+ }
117
+ renderTextDecoration(bounds, styles) {
118
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.textDecorationColor || styles.color);
119
+ // Calculate decoration line thickness
120
+ let thickness = 1; // default
121
+ if (typeof styles.textDecorationThickness === 'number') {
122
+ thickness = styles.textDecorationThickness;
123
+ }
124
+ else if (styles.textDecorationThickness === 'from-font') {
125
+ // Use a reasonable default based on font size
126
+ thickness = Math.max(1, Math.floor(styles.fontSize.number * 0.05));
127
+ }
128
+ // 'auto' uses default thickness of 1
129
+ // Calculate underline offset
130
+ let underlineOffset = 0;
131
+ if (typeof styles.textUnderlineOffset === 'number') {
132
+ // It's a pixel value
133
+ underlineOffset = styles.textUnderlineOffset;
134
+ }
135
+ // 'auto' uses default offset of 0
136
+ const decorationStyle = styles.textDecorationStyle;
137
+ styles.textDecorationLine.forEach((textDecorationLine) => {
138
+ let y = 0;
139
+ switch (textDecorationLine) {
140
+ case 1 /* TEXT_DECORATION_LINE.UNDERLINE */:
141
+ y = bounds.top + bounds.height - thickness + underlineOffset;
142
+ break;
143
+ case 2 /* TEXT_DECORATION_LINE.OVERLINE */:
144
+ y = bounds.top;
145
+ break;
146
+ case 3 /* TEXT_DECORATION_LINE.LINE_THROUGH */:
147
+ y = bounds.top + (bounds.height / 2 - thickness / 2);
148
+ break;
149
+ default:
150
+ return;
151
+ }
152
+ this.drawDecorationLine(bounds.left, y, bounds.width, thickness, decorationStyle);
153
+ });
154
+ }
155
+ drawDecorationLine(x, y, width, thickness, style) {
156
+ switch (style) {
157
+ case 0 /* TEXT_DECORATION_STYLE.SOLID */:
158
+ // Solid line (default)
159
+ this.ctx.fillRect(x, y, width, thickness);
160
+ break;
161
+ case 1 /* TEXT_DECORATION_STYLE.DOUBLE */:
162
+ // Double line
163
+ const gap = Math.max(1, thickness);
164
+ this.ctx.fillRect(x, y, width, thickness);
165
+ this.ctx.fillRect(x, y + thickness + gap, width, thickness);
166
+ break;
167
+ case 2 /* TEXT_DECORATION_STYLE.DOTTED */:
168
+ // Dotted line
169
+ this.ctx.save();
170
+ this.ctx.beginPath();
171
+ this.ctx.setLineDash([thickness, thickness * 2]);
172
+ this.ctx.lineWidth = thickness;
173
+ this.ctx.strokeStyle = this.ctx.fillStyle;
174
+ this.ctx.moveTo(x, y + thickness / 2);
175
+ this.ctx.lineTo(x + width, y + thickness / 2);
176
+ this.ctx.stroke();
177
+ this.ctx.restore();
178
+ break;
179
+ case 3 /* TEXT_DECORATION_STYLE.DASHED */:
180
+ // Dashed line
181
+ this.ctx.save();
182
+ this.ctx.beginPath();
183
+ this.ctx.setLineDash([thickness * 3, thickness * 2]);
184
+ this.ctx.lineWidth = thickness;
185
+ this.ctx.strokeStyle = this.ctx.fillStyle;
186
+ this.ctx.moveTo(x, y + thickness / 2);
187
+ this.ctx.lineTo(x + width, y + thickness / 2);
188
+ this.ctx.stroke();
189
+ this.ctx.restore();
190
+ break;
191
+ case 4 /* TEXT_DECORATION_STYLE.WAVY */:
192
+ // Wavy line (approximation using quadratic curves)
193
+ this.ctx.save();
194
+ this.ctx.beginPath();
195
+ this.ctx.lineWidth = thickness;
196
+ this.ctx.strokeStyle = this.ctx.fillStyle;
197
+ const amplitude = thickness * 2;
198
+ const wavelength = thickness * 4;
199
+ let currentX = x;
200
+ this.ctx.moveTo(currentX, y + thickness / 2);
201
+ while (currentX < x + width) {
202
+ const nextX = Math.min(currentX + wavelength / 2, x + width);
203
+ this.ctx.quadraticCurveTo(currentX + wavelength / 4, y + thickness / 2 - amplitude, nextX, y + thickness / 2);
204
+ currentX = nextX;
205
+ if (currentX < x + width) {
206
+ const nextX2 = Math.min(currentX + wavelength / 2, x + width);
207
+ this.ctx.quadraticCurveTo(currentX + wavelength / 4, y + thickness / 2 + amplitude, nextX2, y + thickness / 2);
208
+ currentX = nextX2;
209
+ }
210
+ }
211
+ this.ctx.stroke();
212
+ this.ctx.restore();
213
+ break;
214
+ default:
215
+ // Fallback to solid
216
+ this.ctx.fillRect(x, y, width, thickness);
217
+ }
218
+ }
219
+ // Helper method to truncate text and add ellipsis if needed
220
+ truncateTextWithEllipsis(text, maxWidth, letterSpacing) {
221
+ const ellipsis = '...';
222
+ const ellipsisWidth = this.ctx.measureText(ellipsis).width;
223
+ if (letterSpacing === 0) {
224
+ let truncated = text;
225
+ while (this.ctx.measureText(truncated).width + ellipsisWidth > maxWidth && truncated.length > 0) {
226
+ truncated = truncated.slice(0, -1);
227
+ }
228
+ return truncated + ellipsis;
229
+ }
230
+ else {
231
+ const letters = (0, text_1.segmentGraphemes)(text);
232
+ let width = ellipsisWidth;
233
+ let result = [];
234
+ for (const letter of letters) {
235
+ const letterWidth = this.ctx.measureText(letter).width + letterSpacing;
236
+ if (width + letterWidth > maxWidth) {
237
+ break;
238
+ }
239
+ result.push(letter);
240
+ width += letterWidth;
241
+ }
242
+ return result.join('') + ellipsis;
243
+ }
244
+ }
245
+ /**
246
+ * Create font style array
247
+ * Public method used by list rendering
248
+ */
249
+ createFontStyle(styles) {
250
+ const fontVariant = styles.fontVariant
251
+ .filter((variant) => variant === 'normal' || variant === 'small-caps')
252
+ .join('');
253
+ const fontFamily = fixIOSSystemFonts(styles.fontFamily).join(', ');
254
+ const fontSize = (0, parser_1.isDimensionToken)(styles.fontSize)
255
+ ? `${styles.fontSize.number}${styles.fontSize.unit}`
256
+ : `${styles.fontSize.number}px`;
257
+ return [
258
+ [styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),
259
+ fontFamily,
260
+ fontSize
261
+ ];
262
+ }
263
+ async renderTextNode(text, styles, containerBounds) {
264
+ const [font] = this.createFontStyle(styles);
265
+ this.ctx.font = font;
266
+ this.ctx.direction = styles.direction === 1 /* DIRECTION.RTL */ ? 'rtl' : 'ltr';
267
+ this.ctx.textAlign = 'left';
268
+ this.ctx.textBaseline = 'alphabetic';
269
+ const paintOrder = styles.paintOrder;
270
+ // Calculate line height for text layout detection (used by both line-clamp and ellipsis)
271
+ const lineHeight = styles.fontSize.number * 1.5;
272
+ // Check if we need to apply -webkit-line-clamp
273
+ // This limits text to a specific number of lines with ellipsis
274
+ const shouldApplyLineClamp = styles.webkitLineClamp > 0 &&
275
+ (styles.display & 2 /* DISPLAY.BLOCK */) !== 0 &&
276
+ styles.overflowY === 1 /* OVERFLOW.HIDDEN */ &&
277
+ text.textBounds.length > 0;
278
+ if (shouldApplyLineClamp) {
279
+ // Group text bounds by lines based on their Y position
280
+ const lines = [];
281
+ let currentLine = [];
282
+ let currentLineTop = text.textBounds[0].bounds.top;
283
+ text.textBounds.forEach((tb) => {
284
+ // If this text bound is on a different line, start a new line
285
+ if (Math.abs(tb.bounds.top - currentLineTop) >= lineHeight * 0.5) {
286
+ if (currentLine.length > 0) {
287
+ lines.push(currentLine);
288
+ }
289
+ currentLine = [tb];
290
+ currentLineTop = tb.bounds.top;
291
+ }
292
+ else {
293
+ currentLine.push(tb);
294
+ }
295
+ });
296
+ // Don't forget the last line
297
+ if (currentLine.length > 0) {
298
+ lines.push(currentLine);
299
+ }
300
+ // Only render up to webkitLineClamp lines
301
+ const maxLines = styles.webkitLineClamp;
302
+ if (lines.length > maxLines) {
303
+ // Render only the first (maxLines - 1) complete lines
304
+ for (let i = 0; i < maxLines - 1; i++) {
305
+ lines[i].forEach((textBound) => {
306
+ this.renderTextBoundWithPaintOrder(textBound, styles, paintOrder);
307
+ });
308
+ }
309
+ // For the last line, truncate with ellipsis
310
+ const lastLine = lines[maxLines - 1];
311
+ if (lastLine && lastLine.length > 0 && containerBounds) {
312
+ const lastLineText = lastLine.map((tb) => tb.text).join('');
313
+ const firstBound = lastLine[0];
314
+ const availableWidth = containerBounds.width - (firstBound.bounds.left - containerBounds.left);
315
+ const truncatedText = this.truncateTextWithEllipsis(lastLineText, availableWidth, styles.letterSpacing);
316
+ paintOrder.forEach((paintOrderLayer) => {
317
+ switch (paintOrderLayer) {
318
+ case 0 /* PAINT_ORDER_LAYER.FILL */:
319
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
320
+ if (styles.letterSpacing === 0) {
321
+ this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
322
+ }
323
+ else {
324
+ const letters = (0, text_1.segmentGraphemes)(truncatedText);
325
+ letters.reduce((left, letter) => {
326
+ this.ctx.fillText(letter, left, firstBound.bounds.top + styles.fontSize.number);
327
+ return left + this.ctx.measureText(letter).width + styles.letterSpacing;
328
+ }, firstBound.bounds.left);
329
+ }
330
+ break;
331
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
332
+ if (styles.webkitTextStrokeWidth && truncatedText.trim().length) {
333
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
334
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
335
+ this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
336
+ if (styles.letterSpacing === 0) {
337
+ this.ctx.strokeText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
338
+ }
339
+ else {
340
+ const letters = (0, text_1.segmentGraphemes)(truncatedText);
341
+ letters.reduce((left, letter) => {
342
+ this.ctx.strokeText(letter, left, firstBound.bounds.top + styles.fontSize.number);
343
+ return left + this.ctx.measureText(letter).width + styles.letterSpacing;
344
+ }, firstBound.bounds.left);
345
+ }
346
+ }
347
+ break;
348
+ }
349
+ });
350
+ }
351
+ return; // Don't render anything else
352
+ }
353
+ // If lines.length <= maxLines, fall through to normal rendering
354
+ }
355
+ // Check if we need to apply text-overflow: ellipsis
356
+ // Issue #203: Only apply ellipsis for single-line text overflow
357
+ // Multi-line text truncation (like -webkit-line-clamp) should not be affected
358
+ const shouldApplyEllipsis = styles.textOverflow === 1 /* TEXT_OVERFLOW.ELLIPSIS */ &&
359
+ containerBounds &&
360
+ styles.overflowX === 1 /* OVERFLOW.HIDDEN */ &&
361
+ text.textBounds.length > 0;
362
+ // Calculate total text width if ellipsis might be needed
363
+ let needsEllipsis = false;
364
+ let truncatedText = '';
365
+ if (shouldApplyEllipsis) {
366
+ // Check if all text bounds are on approximately the same line (single-line scenario)
367
+ // For multi-line text (like -webkit-line-clamp), textBounds will have different Y positions
368
+ const firstTop = text.textBounds[0].bounds.top;
369
+ const isSingleLine = text.textBounds.every((tb) => Math.abs(tb.bounds.top - firstTop) < lineHeight * 0.5);
370
+ if (isSingleLine) {
371
+ // Measure the full text content
372
+ // Note: text.textBounds may contain whitespace characters from HTML formatting
373
+ // We need to collapse them like the browser does for white-space: nowrap
374
+ let fullText = text.textBounds.map((tb) => tb.text).join('');
375
+ // Collapse whitespace: replace sequences of whitespace (including newlines) with single spaces
376
+ // and trim leading/trailing whitespace
377
+ fullText = fullText.replace(/\s+/g, ' ').trim();
378
+ const fullTextWidth = this.ctx.measureText(fullText).width;
379
+ const availableWidth = containerBounds.width;
380
+ if (fullTextWidth > availableWidth) {
381
+ needsEllipsis = true;
382
+ truncatedText = this.truncateTextWithEllipsis(fullText, availableWidth, styles.letterSpacing);
383
+ }
384
+ }
385
+ }
386
+ // If ellipsis is needed, render the truncated text once
387
+ if (needsEllipsis) {
388
+ const firstBound = text.textBounds[0];
389
+ paintOrder.forEach((paintOrderLayer) => {
390
+ switch (paintOrderLayer) {
391
+ case 0 /* PAINT_ORDER_LAYER.FILL */:
392
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
393
+ if (styles.letterSpacing === 0) {
394
+ this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
395
+ }
396
+ else {
397
+ const letters = (0, text_1.segmentGraphemes)(truncatedText);
398
+ letters.reduce((left, letter) => {
399
+ this.ctx.fillText(letter, left, firstBound.bounds.top + styles.fontSize.number);
400
+ return left + this.ctx.measureText(letter).width + styles.letterSpacing;
401
+ }, firstBound.bounds.left);
402
+ }
403
+ const textShadows = styles.textShadow;
404
+ if (textShadows.length && truncatedText.trim().length) {
405
+ textShadows
406
+ .slice(0)
407
+ .reverse()
408
+ .forEach((textShadow) => {
409
+ this.ctx.shadowColor = (0, color_utilities_1.asString)(textShadow.color);
410
+ this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;
411
+ this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;
412
+ this.ctx.shadowBlur = textShadow.blur.number;
413
+ if (styles.letterSpacing === 0) {
414
+ this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
415
+ }
416
+ else {
417
+ const letters = (0, text_1.segmentGraphemes)(truncatedText);
418
+ letters.reduce((left, letter) => {
419
+ this.ctx.fillText(letter, left, firstBound.bounds.top + styles.fontSize.number);
420
+ return left + this.ctx.measureText(letter).width + styles.letterSpacing;
421
+ }, firstBound.bounds.left);
422
+ }
423
+ });
424
+ this.ctx.shadowColor = '';
425
+ this.ctx.shadowOffsetX = 0;
426
+ this.ctx.shadowOffsetY = 0;
427
+ this.ctx.shadowBlur = 0;
428
+ }
429
+ break;
430
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
431
+ if (styles.webkitTextStrokeWidth && truncatedText.trim().length) {
432
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
433
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
434
+ this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
435
+ if (styles.letterSpacing === 0) {
436
+ this.ctx.strokeText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
437
+ }
438
+ else {
439
+ const letters = (0, text_1.segmentGraphemes)(truncatedText);
440
+ letters.reduce((left, letter) => {
441
+ this.ctx.strokeText(letter, left, firstBound.bounds.top + styles.fontSize.number);
442
+ return left + this.ctx.measureText(letter).width + styles.letterSpacing;
443
+ }, firstBound.bounds.left);
444
+ }
445
+ }
446
+ break;
447
+ }
448
+ });
449
+ return;
450
+ }
451
+ // Normal rendering (no ellipsis needed)
452
+ text.textBounds.forEach((text) => {
453
+ paintOrder.forEach((paintOrderLayer) => {
454
+ switch (paintOrderLayer) {
455
+ case 0 /* PAINT_ORDER_LAYER.FILL */:
456
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
457
+ this.renderTextWithLetterSpacing(text, styles.letterSpacing, styles.fontSize.number);
458
+ const textShadows = styles.textShadow;
459
+ if (textShadows.length && text.text.trim().length) {
460
+ textShadows
461
+ .slice(0)
462
+ .reverse()
463
+ .forEach((textShadow) => {
464
+ this.ctx.shadowColor = (0, color_utilities_1.asString)(textShadow.color);
465
+ this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;
466
+ this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;
467
+ this.ctx.shadowBlur = textShadow.blur.number;
468
+ this.renderTextWithLetterSpacing(text, styles.letterSpacing, styles.fontSize.number);
469
+ });
470
+ this.ctx.shadowColor = '';
471
+ this.ctx.shadowOffsetX = 0;
472
+ this.ctx.shadowOffsetY = 0;
473
+ this.ctx.shadowBlur = 0;
474
+ }
475
+ if (styles.textDecorationLine.length) {
476
+ this.renderTextDecoration(text.bounds, styles);
477
+ }
478
+ break;
479
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
480
+ if (styles.webkitTextStrokeWidth && text.text.trim().length) {
481
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
482
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
483
+ this.ctx.lineJoin = !!window.chrome ? 'miter' : 'round';
484
+ // Issue #110: Use baseline (fontSize) for consistent positioning with fill
485
+ // Previously used text.bounds.height which caused stroke to render too low
486
+ const baseline = styles.fontSize.number;
487
+ if (styles.letterSpacing === 0) {
488
+ this.ctx.strokeText(text.text, text.bounds.left, text.bounds.top + baseline);
489
+ }
490
+ else {
491
+ const letters = (0, text_1.segmentGraphemes)(text.text);
492
+ letters.reduce((left, letter) => {
493
+ this.ctx.strokeText(letter, left, text.bounds.top + baseline);
494
+ return left + this.ctx.measureText(letter).width;
495
+ }, text.bounds.left);
496
+ }
497
+ }
498
+ this.ctx.strokeStyle = '';
499
+ this.ctx.lineWidth = 0;
500
+ this.ctx.lineJoin = 'miter';
501
+ break;
502
+ }
503
+ });
504
+ });
505
+ }
506
+ }
507
+ exports.TextRenderer = TextRenderer;
508
+ //# sourceMappingURL=text-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-renderer.js","sourceRoot":"","sources":["../../../../src/render/canvas/text-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=renderer-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-interface.js","sourceRoot":"","sources":["../../../src/render/renderer-interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { Cache } from './core/cache-storage';
2
+ /**
3
+ * Configuration options for Html2Canvas
4
+ *
5
+ * This class manages global configuration without using module-level static variables.
6
+ * Each html2canvas invocation can have its own configuration instance.
7
+ */
8
+ export interface ConfigOptions {
9
+ /**
10
+ * Window object to use for DOM operations
11
+ */
12
+ window?: Window;
13
+ /**
14
+ * CSP nonce for inline styles
15
+ * See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
16
+ */
17
+ cspNonce?: string;
18
+ /**
19
+ * Cache instance to reuse across multiple calls
20
+ * Useful for avoiding redundant image loads
21
+ */
22
+ cache?: Cache;
23
+ }
24
+ /**
25
+ * Html2Canvas Configuration
26
+ *
27
+ * Manages configuration state for html2canvas rendering.
28
+ * Eliminates the need for global static variables.
29
+ */
30
+ export declare class Html2CanvasConfig {
31
+ readonly window: Window;
32
+ readonly cspNonce?: string;
33
+ readonly cache?: Cache;
34
+ constructor(options?: ConfigOptions);
35
+ /**
36
+ * Create configuration from an element
37
+ * Extracts window from element's owner document
38
+ */
39
+ static fromElement(element: HTMLElement, options?: Partial<ConfigOptions>): Html2CanvasConfig;
40
+ /**
41
+ * Clone configuration with override options
42
+ */
43
+ clone(options?: Partial<ConfigOptions>): Html2CanvasConfig;
44
+ }
45
+ /**
46
+ * Set default configuration
47
+ * @deprecated Pass configuration directly to html2canvas instead
48
+ */
49
+ export declare function setDefaultConfig(config: Html2CanvasConfig): void;
50
+ /**
51
+ * Get default configuration
52
+ * @deprecated Pass configuration directly to html2canvas instead
53
+ */
54
+ export declare function getDefaultConfig(): Html2CanvasConfig | null;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};