html2canvas-pro 1.6.7 → 2.0.1

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 (133) 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 +3391 -1491
  5. package/dist/html2canvas-pro.esm.js.map +1 -1
  6. package/dist/html2canvas-pro.js +3394 -1490
  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 +4 -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__/clip-path.test.js +273 -0
  36. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js.map +1 -0
  37. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +142 -0
  38. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +1 -0
  39. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js +167 -0
  40. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +1 -0
  41. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +61 -0
  42. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +1 -0
  43. package/dist/lib/css/property-descriptors/clip-path.js +190 -0
  44. package/dist/lib/css/property-descriptors/clip-path.js.map +1 -0
  45. package/dist/lib/css/property-descriptors/image-rendering.js +34 -0
  46. package/dist/lib/css/property-descriptors/image-rendering.js.map +1 -0
  47. package/dist/lib/css/types/__tests__/image-tests.js +7 -1
  48. package/dist/lib/css/types/__tests__/image-tests.js.map +1 -1
  49. package/dist/lib/css/types/color-math.js +26 -0
  50. package/dist/lib/css/types/color-math.js.map +1 -0
  51. package/dist/lib/css/types/color-spaces/srgb.js +6 -6
  52. package/dist/lib/css/types/color-spaces/srgb.js.map +1 -1
  53. package/dist/lib/css/types/color-utilities.js +13 -22
  54. package/dist/lib/css/types/color-utilities.js.map +1 -1
  55. package/dist/lib/dom/__tests__/dom-normalizer.test.js +113 -0
  56. package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +1 -0
  57. package/dist/lib/dom/__tests__/element-container.test.js +109 -0
  58. package/dist/lib/dom/__tests__/element-container.test.js.map +1 -0
  59. package/dist/lib/dom/document-cloner.js +3 -3
  60. package/dist/lib/dom/document-cloner.js.map +1 -1
  61. package/dist/lib/dom/dom-normalizer.js +116 -0
  62. package/dist/lib/dom/dom-normalizer.js.map +1 -0
  63. package/dist/lib/dom/element-container.js +32 -15
  64. package/dist/lib/dom/element-container.js.map +1 -1
  65. package/dist/lib/dom/node-parser.js +16 -20
  66. package/dist/lib/dom/node-parser.js.map +1 -1
  67. package/dist/lib/dom/node-type-guards.js +44 -0
  68. package/dist/lib/dom/node-type-guards.js.map +1 -0
  69. package/dist/lib/dom/replaced-elements/iframe-element-container.js +5 -4
  70. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +1 -1
  71. package/dist/lib/index.js +148 -41
  72. package/dist/lib/index.js.map +1 -1
  73. package/dist/lib/render/canvas/__tests__/background-renderer.test.js +65 -0
  74. package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +1 -0
  75. package/dist/lib/render/canvas/__tests__/border-renderer.test.js +23 -0
  76. package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +1 -0
  77. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +30 -0
  78. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +1 -0
  79. package/dist/lib/render/canvas/__tests__/text-renderer.test.js +310 -0
  80. package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +1 -0
  81. package/dist/lib/render/canvas/background-renderer.js +222 -0
  82. package/dist/lib/render/canvas/background-renderer.js.map +1 -0
  83. package/dist/lib/render/canvas/border-renderer.js +185 -0
  84. package/dist/lib/render/canvas/border-renderer.js.map +1 -0
  85. package/dist/lib/render/canvas/canvas-renderer.js +61 -689
  86. package/dist/lib/render/canvas/canvas-renderer.js.map +1 -1
  87. package/dist/lib/render/canvas/effects-renderer.js +94 -0
  88. package/dist/lib/render/canvas/effects-renderer.js.map +1 -0
  89. package/dist/lib/render/canvas/text-renderer.js +575 -0
  90. package/dist/lib/render/canvas/text-renderer.js.map +1 -0
  91. package/dist/lib/render/effects.js +17 -1
  92. package/dist/lib/render/effects.js.map +1 -1
  93. package/dist/lib/render/renderer-interface.js +3 -0
  94. package/dist/lib/render/renderer-interface.js.map +1 -0
  95. package/dist/lib/render/stacking-context.js +131 -0
  96. package/dist/lib/render/stacking-context.js.map +1 -1
  97. package/dist/types/config.d.ts +54 -0
  98. package/dist/types/core/__tests__/cache-storage.test.d.ts +1 -0
  99. package/dist/types/core/__tests__/validator.d.ts +1 -0
  100. package/dist/types/core/cache-storage.d.ts +42 -1
  101. package/dist/types/core/context.d.ts +5 -1
  102. package/dist/types/core/origin-checker.d.ts +33 -0
  103. package/dist/types/core/performance-monitor.d.ts +131 -0
  104. package/dist/types/core/validator.d.ts +132 -0
  105. package/dist/types/css/index.d.ts +4 -0
  106. package/dist/types/css/property-descriptors/__tests__/clip-path.test.d.ts +1 -0
  107. package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +1 -0
  108. package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +1 -0
  109. package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +1 -0
  110. package/dist/types/css/property-descriptors/clip-path.d.ts +62 -0
  111. package/dist/types/css/property-descriptors/image-rendering.d.ts +8 -0
  112. package/dist/types/css/types/color-math.d.ts +12 -0
  113. package/dist/types/css/types/color-utilities.d.ts +2 -3
  114. package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +1 -0
  115. package/dist/types/dom/__tests__/element-container.test.d.ts +1 -0
  116. package/dist/types/dom/dom-normalizer.d.ts +62 -0
  117. package/dist/types/dom/element-container.d.ts +20 -1
  118. package/dist/types/dom/node-parser.d.ts +2 -7
  119. package/dist/types/dom/node-type-guards.d.ts +33 -0
  120. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +4 -1
  121. package/dist/types/index.d.ts +48 -3
  122. package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +1 -0
  123. package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +1 -0
  124. package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +1 -0
  125. package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +1 -0
  126. package/dist/types/render/canvas/background-renderer.d.ts +87 -0
  127. package/dist/types/render/canvas/border-renderer.d.ts +67 -0
  128. package/dist/types/render/canvas/canvas-renderer.d.ts +19 -23
  129. package/dist/types/render/canvas/effects-renderer.d.ts +65 -0
  130. package/dist/types/render/canvas/text-renderer.d.ts +75 -0
  131. package/dist/types/render/effects.d.ts +15 -1
  132. package/dist/types/render/renderer-interface.d.ts +26 -0
  133. package/package.json +2 -1
@@ -0,0 +1,575 @@
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 = exports.hasCJKCharacters = 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 CJK (Chinese, Japanese, Korean) characters in a string.
23
+ * CJK characters use the ideographic baseline in browsers, which differs
24
+ * from the alphabetic baseline used for Latin script.
25
+ *
26
+ * Covers:
27
+ * U+2E80–U+2FFF CJK Radicals Supplement, Kangxi Radicals
28
+ * U+3000–U+30FF CJK Symbols & Punctuation (。、「」…), Hiragana, Katakana
29
+ * U+3400–U+4DBF CJK Extension A
30
+ * U+4E00–U+9FFF CJK Unified Ideographs (most common Chinese/Japanese/Korean)
31
+ * U+AC00–U+D7AF Hangul Syllables
32
+ * U+F900–U+FAFF CJK Compatibility Ideographs
33
+ * U+FF01–U+FFEF Halfwidth and Fullwidth Forms (A B 1 2 ! ? etc.)
34
+ */
35
+ const CJK_CHAR_REGEX = /[\u2E80-\u2FFF\u3000-\u30FF\u3400-\u4DBF\u4E00-\u9FFF\uAC00-\uD7AF\uF900-\uFAFF\uFF01-\uFFEF]/;
36
+ const hasCJKCharacters = (text) => CJK_CHAR_REGEX.test(text);
37
+ exports.hasCJKCharacters = hasCJKCharacters;
38
+ /**
39
+ * Detect iOS version from user agent
40
+ * Returns null if not iOS or version cannot be determined
41
+ */
42
+ const getIOSVersion = () => {
43
+ if (typeof navigator === 'undefined') {
44
+ return null;
45
+ }
46
+ const userAgent = navigator.userAgent;
47
+ // Check if it's iOS or iPadOS
48
+ // iPadOS 13+ may identify as Macintosh, check for touch support
49
+ const isIOS = /iPhone|iPad|iPod/.test(userAgent);
50
+ const isIPadOS = /Macintosh/.test(userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 1;
51
+ if (!isIOS && !isIPadOS) {
52
+ return null;
53
+ }
54
+ // Extract version number from various iOS user agent formats:
55
+ // - "iPhone OS 15_0" or "iPhone OS 15_0_1"
56
+ // - "CPU OS 15_0 like Mac OS X"
57
+ // - "CPU iPhone OS 15_0 like Mac OS X"
58
+ // - "Version/15.0" (for iPadOS)
59
+ const patterns = [
60
+ /(?:iPhone|CPU(?:\siPhone)?)\sOS\s(\d+)[\._](\d+)/, // iPhone OS, CPU OS, CPU iPhone OS
61
+ /Version\/(\d+)\.(\d+)/ // Version/15.0 (iPadOS)
62
+ ];
63
+ for (const pattern of patterns) {
64
+ const match = userAgent.match(pattern);
65
+ if (match && match[1]) {
66
+ return parseInt(match[1], 10);
67
+ }
68
+ }
69
+ return null;
70
+ };
71
+ const fixIOSSystemFonts = (fontFamilies) => {
72
+ const iosVersion = getIOSVersion();
73
+ // On iOS 15.0 and 15.1, system fonts have rendering issues
74
+ // Fixed in iOS 17+
75
+ if (iosVersion !== null && iosVersion >= 15 && iosVersion < 17) {
76
+ return fontFamilies.map((fontFamily) => iOSBrokenFonts.indexOf(fontFamily) !== -1
77
+ ? `-apple-system, "Helvetica Neue", Arial, sans-serif`
78
+ : fontFamily);
79
+ }
80
+ return fontFamilies;
81
+ };
82
+ /**
83
+ * Text Renderer
84
+ *
85
+ * Specialized renderer for text content.
86
+ * Extracted from CanvasRenderer to improve code organization and maintainability.
87
+ */
88
+ class TextRenderer {
89
+ constructor(deps) {
90
+ this.ctx = deps.ctx;
91
+ // context stored but not used directly in this renderer
92
+ this.options = deps.options;
93
+ }
94
+ /**
95
+ * Iterate grapheme clusters one-by-one, applying correct letter-spacing and
96
+ * per-script baseline for each character.
97
+ *
98
+ * Issue #73: When letter-spacing is non-zero, text must be rendered character by
99
+ * character. This helper centralises two fixes applied during that iteration:
100
+ * 1. Add `letterSpacing` to each character's advance width (was previously
101
+ * omitted, causing characters to render without any spacing).
102
+ * 2. Switch to the ideographic baseline for CJK glyphs so their vertical
103
+ * position matches how browsers lay them out in the DOM.
104
+ *
105
+ * The `renderFn` callback receives (letter, x, y) and performs the actual draw
106
+ * call (fillText or strokeText), allowing fill and stroke paths to share one
107
+ * implementation.
108
+ */
109
+ iterateLettersWithLetterSpacing(text, letterSpacing, baseline, renderFn) {
110
+ const letters = (0, text_1.segmentGraphemes)(text.text);
111
+ const y = text.bounds.top + baseline;
112
+ let left = text.bounds.left;
113
+ for (const letter of letters) {
114
+ if ((0, exports.hasCJKCharacters)(letter)) {
115
+ const savedBaseline = this.ctx.textBaseline;
116
+ this.ctx.textBaseline = 'ideographic';
117
+ renderFn(letter, left, y);
118
+ this.ctx.textBaseline = savedBaseline;
119
+ }
120
+ else {
121
+ renderFn(letter, left, y);
122
+ }
123
+ left += this.ctx.measureText(letter).width + letterSpacing;
124
+ }
125
+ }
126
+ /**
127
+ * Render text with letter-spacing applied (fill pass).
128
+ * When letterSpacing is 0 the whole string is drawn in one call; otherwise each
129
+ * grapheme is drawn individually so spacing and CJK baseline are applied correctly.
130
+ */
131
+ renderTextWithLetterSpacing(text, letterSpacing, baseline) {
132
+ if (letterSpacing === 0) {
133
+ this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + baseline);
134
+ }
135
+ else {
136
+ this.iterateLettersWithLetterSpacing(text, letterSpacing, baseline, (letter, x, y) => {
137
+ this.ctx.fillText(letter, x, y);
138
+ });
139
+ }
140
+ }
141
+ /**
142
+ * Helper method to render text with paint order support
143
+ * Reduces code duplication in line-clamp and normal rendering
144
+ */
145
+ renderTextBoundWithPaintOrder(textBound, styles, paintOrderLayers) {
146
+ paintOrderLayers.forEach((paintOrderLayer) => {
147
+ switch (paintOrderLayer) {
148
+ case 0 /* PAINT_ORDER_LAYER.FILL */:
149
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
150
+ this.renderTextWithLetterSpacing(textBound, styles.letterSpacing, styles.fontSize.number);
151
+ break;
152
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
153
+ if (styles.webkitTextStrokeWidth && textBound.text.trim().length) {
154
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
155
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
156
+ this.ctx.lineJoin =
157
+ typeof window !== 'undefined' && !!window.chrome ? 'miter' : 'round';
158
+ if (styles.letterSpacing === 0) {
159
+ this.ctx.strokeText(textBound.text, textBound.bounds.left, textBound.bounds.top + styles.fontSize.number);
160
+ }
161
+ else {
162
+ this.iterateLettersWithLetterSpacing(textBound, styles.letterSpacing, styles.fontSize.number, (letter, x, y) => this.ctx.strokeText(letter, x, y));
163
+ }
164
+ this.ctx.strokeStyle = '';
165
+ this.ctx.lineWidth = 0;
166
+ this.ctx.lineJoin = 'miter';
167
+ }
168
+ break;
169
+ }
170
+ });
171
+ }
172
+ renderTextDecoration(bounds, styles) {
173
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.textDecorationColor || styles.color);
174
+ // Calculate decoration line thickness
175
+ let thickness = 1; // default
176
+ if (typeof styles.textDecorationThickness === 'number') {
177
+ thickness = styles.textDecorationThickness;
178
+ }
179
+ else if (styles.textDecorationThickness === 'from-font') {
180
+ // Use a reasonable default based on font size
181
+ thickness = Math.max(1, Math.floor(styles.fontSize.number * 0.05));
182
+ }
183
+ // 'auto' uses default thickness of 1
184
+ // Calculate underline offset
185
+ let underlineOffset = 0;
186
+ if (typeof styles.textUnderlineOffset === 'number') {
187
+ // It's a pixel value
188
+ underlineOffset = styles.textUnderlineOffset;
189
+ }
190
+ // 'auto' uses default offset of 0
191
+ const decorationStyle = styles.textDecorationStyle;
192
+ styles.textDecorationLine.forEach((textDecorationLine) => {
193
+ let y = 0;
194
+ switch (textDecorationLine) {
195
+ case 1 /* TEXT_DECORATION_LINE.UNDERLINE */:
196
+ y = bounds.top + bounds.height - thickness + underlineOffset;
197
+ break;
198
+ case 2 /* TEXT_DECORATION_LINE.OVERLINE */:
199
+ y = bounds.top;
200
+ break;
201
+ case 3 /* TEXT_DECORATION_LINE.LINE_THROUGH */:
202
+ y = bounds.top + (bounds.height / 2 - thickness / 2);
203
+ break;
204
+ default:
205
+ return;
206
+ }
207
+ this.drawDecorationLine(bounds.left, y, bounds.width, thickness, decorationStyle);
208
+ });
209
+ }
210
+ drawDecorationLine(x, y, width, thickness, style) {
211
+ switch (style) {
212
+ case 0 /* TEXT_DECORATION_STYLE.SOLID */:
213
+ // Solid line (default)
214
+ this.ctx.fillRect(x, y, width, thickness);
215
+ break;
216
+ case 1 /* TEXT_DECORATION_STYLE.DOUBLE */:
217
+ // Double line
218
+ const gap = Math.max(1, thickness);
219
+ this.ctx.fillRect(x, y, width, thickness);
220
+ this.ctx.fillRect(x, y + thickness + gap, width, thickness);
221
+ break;
222
+ case 2 /* TEXT_DECORATION_STYLE.DOTTED */:
223
+ // Dotted line
224
+ this.ctx.save();
225
+ this.ctx.beginPath();
226
+ this.ctx.setLineDash([thickness, thickness * 2]);
227
+ this.ctx.lineWidth = thickness;
228
+ this.ctx.strokeStyle = this.ctx.fillStyle;
229
+ this.ctx.moveTo(x, y + thickness / 2);
230
+ this.ctx.lineTo(x + width, y + thickness / 2);
231
+ this.ctx.stroke();
232
+ this.ctx.restore();
233
+ break;
234
+ case 3 /* TEXT_DECORATION_STYLE.DASHED */:
235
+ // Dashed line
236
+ this.ctx.save();
237
+ this.ctx.beginPath();
238
+ this.ctx.setLineDash([thickness * 3, thickness * 2]);
239
+ this.ctx.lineWidth = thickness;
240
+ this.ctx.strokeStyle = this.ctx.fillStyle;
241
+ this.ctx.moveTo(x, y + thickness / 2);
242
+ this.ctx.lineTo(x + width, y + thickness / 2);
243
+ this.ctx.stroke();
244
+ this.ctx.restore();
245
+ break;
246
+ case 4 /* TEXT_DECORATION_STYLE.WAVY */:
247
+ // Wavy line (approximation using quadratic curves)
248
+ this.ctx.save();
249
+ this.ctx.beginPath();
250
+ this.ctx.lineWidth = thickness;
251
+ this.ctx.strokeStyle = this.ctx.fillStyle;
252
+ const amplitude = thickness * 2;
253
+ const wavelength = thickness * 4;
254
+ let currentX = x;
255
+ this.ctx.moveTo(currentX, y + thickness / 2);
256
+ while (currentX < x + width) {
257
+ const nextX = Math.min(currentX + wavelength / 2, x + width);
258
+ this.ctx.quadraticCurveTo(currentX + wavelength / 4, y + thickness / 2 - amplitude, nextX, y + thickness / 2);
259
+ currentX = nextX;
260
+ if (currentX < x + width) {
261
+ const nextX2 = Math.min(currentX + wavelength / 2, x + width);
262
+ this.ctx.quadraticCurveTo(currentX + wavelength / 4, y + thickness / 2 + amplitude, nextX2, y + thickness / 2);
263
+ currentX = nextX2;
264
+ }
265
+ }
266
+ this.ctx.stroke();
267
+ this.ctx.restore();
268
+ break;
269
+ default:
270
+ // Fallback to solid
271
+ this.ctx.fillRect(x, y, width, thickness);
272
+ }
273
+ }
274
+ // Helper method to truncate text and add ellipsis if needed
275
+ truncateTextWithEllipsis(text, maxWidth, letterSpacing) {
276
+ // Use the Unicode ellipsis character (U+2026) whose width the browser measures
277
+ // as a single glyph, matching native text-overflow behaviour more closely.
278
+ const ellipsis = '\u2026';
279
+ const ellipsisWidth = this.ctx.measureText(ellipsis).width;
280
+ // Segment into grapheme clusters so multi-byte characters (emoji, composed
281
+ // sequences) are never split mid-character.
282
+ const graphemes = (0, text_1.segmentGraphemes)(text);
283
+ if (letterSpacing === 0) {
284
+ // Measure the whole candidate string for accuracy: the browser applies
285
+ // kerning and ligatures when rendering multiple glyphs together, so
286
+ // measuring them as one string is more precise than summing individual widths.
287
+ // Binary search reduces measurements from O(n) to O(log n).
288
+ const fits = (n) => this.ctx.measureText(graphemes.slice(0, n).join('')).width + ellipsisWidth <= maxWidth;
289
+ let lo = 0;
290
+ let hi = graphemes.length;
291
+ while (lo < hi) {
292
+ const mid = (lo + hi + 1) >> 1;
293
+ if (fits(mid)) {
294
+ lo = mid;
295
+ }
296
+ else {
297
+ hi = mid - 1;
298
+ }
299
+ }
300
+ return graphemes.slice(0, lo).join('') + ellipsis;
301
+ }
302
+ else {
303
+ let width = ellipsisWidth;
304
+ const result = [];
305
+ for (const letter of graphemes) {
306
+ const glyphWidth = this.ctx.measureText(letter).width;
307
+ // Check against glyph width only (no trailing spacing): letter-spacing
308
+ // is applied *between* characters, not after the final glyph. Using
309
+ // `glyphWidth + letterSpacing` would incorrectly discard letters that
310
+ // fit as the last character before the ellipsis.
311
+ if (width + glyphWidth > maxWidth) {
312
+ break;
313
+ }
314
+ result.push(letter);
315
+ // Accumulate glyph + inter-character spacing for the *next* iteration.
316
+ width += glyphWidth + letterSpacing;
317
+ }
318
+ return result.join('') + ellipsis;
319
+ }
320
+ }
321
+ /**
322
+ * Create font style array
323
+ * Public method used by list rendering
324
+ */
325
+ createFontStyle(styles) {
326
+ const fontVariant = styles.fontVariant
327
+ .filter((variant) => variant === 'normal' || variant === 'small-caps')
328
+ .join('');
329
+ const fontFamily = fixIOSSystemFonts(styles.fontFamily).join(', ');
330
+ const fontSize = (0, parser_1.isDimensionToken)(styles.fontSize)
331
+ ? `${styles.fontSize.number}${styles.fontSize.unit}`
332
+ : `${styles.fontSize.number}px`;
333
+ return [
334
+ [styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),
335
+ fontFamily,
336
+ fontSize
337
+ ];
338
+ }
339
+ async renderTextNode(text, styles, containerBounds) {
340
+ const [font] = this.createFontStyle(styles);
341
+ this.ctx.font = font;
342
+ this.ctx.direction = styles.direction === 1 /* DIRECTION.RTL */ ? 'rtl' : 'ltr';
343
+ this.ctx.textAlign = 'left';
344
+ this.ctx.textBaseline = 'alphabetic';
345
+ const paintOrder = styles.paintOrder;
346
+ // Calculate line height for text layout detection (used by both line-clamp and ellipsis)
347
+ const lineHeight = styles.fontSize.number * 1.5;
348
+ // Check if we need to apply -webkit-line-clamp
349
+ // This limits text to a specific number of lines with ellipsis
350
+ const shouldApplyLineClamp = styles.webkitLineClamp > 0 &&
351
+ (styles.display & 2 /* DISPLAY.BLOCK */) !== 0 &&
352
+ styles.overflowY === 1 /* OVERFLOW.HIDDEN */ &&
353
+ text.textBounds.length > 0;
354
+ if (shouldApplyLineClamp) {
355
+ // Group text bounds by lines based on their Y position
356
+ const lines = [];
357
+ let currentLine = [];
358
+ let currentLineTop = text.textBounds[0].bounds.top;
359
+ text.textBounds.forEach((tb) => {
360
+ // If this text bound is on a different line, start a new line
361
+ if (Math.abs(tb.bounds.top - currentLineTop) >= lineHeight * 0.5) {
362
+ if (currentLine.length > 0) {
363
+ lines.push(currentLine);
364
+ }
365
+ currentLine = [tb];
366
+ currentLineTop = tb.bounds.top;
367
+ }
368
+ else {
369
+ currentLine.push(tb);
370
+ }
371
+ });
372
+ // Don't forget the last line
373
+ if (currentLine.length > 0) {
374
+ lines.push(currentLine);
375
+ }
376
+ // Only render up to webkitLineClamp lines
377
+ const maxLines = styles.webkitLineClamp;
378
+ if (lines.length > maxLines) {
379
+ // Render only the first (maxLines - 1) complete lines
380
+ for (let i = 0; i < maxLines - 1; i++) {
381
+ lines[i].forEach((textBound) => {
382
+ this.renderTextBoundWithPaintOrder(textBound, styles, paintOrder);
383
+ });
384
+ }
385
+ // For the last line, truncate with ellipsis
386
+ const lastLine = lines[maxLines - 1];
387
+ if (lastLine && lastLine.length > 0 && containerBounds) {
388
+ const lastLineText = lastLine.map((tb) => tb.text).join('');
389
+ const firstBound = lastLine[0];
390
+ const availableWidth = containerBounds.width - (firstBound.bounds.left - containerBounds.left);
391
+ const truncatedText = this.truncateTextWithEllipsis(lastLineText, availableWidth, styles.letterSpacing);
392
+ // Build TextBounds once; reused for fill and stroke without re-allocating.
393
+ const truncatedBounds = new text_1.TextBounds(truncatedText, firstBound.bounds);
394
+ paintOrder.forEach((paintOrderLayer) => {
395
+ switch (paintOrderLayer) {
396
+ case 0 /* PAINT_ORDER_LAYER.FILL */:
397
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
398
+ if (styles.letterSpacing === 0) {
399
+ this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
400
+ }
401
+ else {
402
+ this.iterateLettersWithLetterSpacing(truncatedBounds, styles.letterSpacing, styles.fontSize.number, (letter, x, y) => this.ctx.fillText(letter, x, y));
403
+ }
404
+ break;
405
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
406
+ if (styles.webkitTextStrokeWidth && truncatedText.trim().length) {
407
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
408
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
409
+ this.ctx.lineJoin =
410
+ typeof window !== 'undefined' && !!window.chrome ? 'miter' : 'round';
411
+ if (styles.letterSpacing === 0) {
412
+ this.ctx.strokeText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
413
+ }
414
+ else {
415
+ this.iterateLettersWithLetterSpacing(truncatedBounds, styles.letterSpacing, styles.fontSize.number, (letter, x, y) => this.ctx.strokeText(letter, x, y));
416
+ }
417
+ this.ctx.strokeStyle = '';
418
+ this.ctx.lineWidth = 0;
419
+ this.ctx.lineJoin = 'miter';
420
+ }
421
+ break;
422
+ }
423
+ });
424
+ }
425
+ return; // Don't render anything else
426
+ }
427
+ // If lines.length <= maxLines, fall through to normal rendering
428
+ }
429
+ // Check if we need to apply text-overflow: ellipsis
430
+ // Issue #203: Only apply ellipsis for single-line text overflow
431
+ // Multi-line text truncation (like -webkit-line-clamp) should not be affected
432
+ const shouldApplyEllipsis = styles.textOverflow === 1 /* TEXT_OVERFLOW.ELLIPSIS */ &&
433
+ containerBounds &&
434
+ styles.overflowX === 1 /* OVERFLOW.HIDDEN */ &&
435
+ text.textBounds.length > 0;
436
+ // Calculate total text width if ellipsis might be needed
437
+ let needsEllipsis = false;
438
+ let truncatedText = '';
439
+ if (shouldApplyEllipsis) {
440
+ // Check if all text bounds are on approximately the same line (single-line scenario)
441
+ // For multi-line text (like -webkit-line-clamp), textBounds will have different Y positions
442
+ const firstTop = text.textBounds[0].bounds.top;
443
+ const isSingleLine = text.textBounds.every((tb) => Math.abs(tb.bounds.top - firstTop) < lineHeight * 0.5);
444
+ if (isSingleLine) {
445
+ // Measure the full text content
446
+ // Note: text.textBounds may contain whitespace characters from HTML formatting
447
+ // We need to collapse them like the browser does for white-space: nowrap
448
+ let fullText = text.textBounds.map((tb) => tb.text).join('');
449
+ // Collapse whitespace: replace sequences of whitespace (including newlines) with single spaces
450
+ // and trim leading/trailing whitespace
451
+ fullText = fullText.replace(/\s+/g, ' ').trim();
452
+ const fullTextWidth = this.ctx.measureText(fullText).width;
453
+ const availableWidth = containerBounds.width;
454
+ if (fullTextWidth > availableWidth) {
455
+ needsEllipsis = true;
456
+ truncatedText = this.truncateTextWithEllipsis(fullText, availableWidth, styles.letterSpacing);
457
+ }
458
+ }
459
+ }
460
+ // If ellipsis is needed, render the truncated text once
461
+ if (needsEllipsis) {
462
+ const firstBound = text.textBounds[0];
463
+ // Build TextBounds once; reused across paint layers and every shadow pass
464
+ // to avoid repeated allocation inside forEach callbacks.
465
+ const truncatedBounds = new text_1.TextBounds(truncatedText, firstBound.bounds);
466
+ paintOrder.forEach((paintOrderLayer) => {
467
+ switch (paintOrderLayer) {
468
+ case 0 /* PAINT_ORDER_LAYER.FILL */: {
469
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
470
+ if (styles.letterSpacing === 0) {
471
+ this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
472
+ }
473
+ else {
474
+ this.iterateLettersWithLetterSpacing(truncatedBounds, styles.letterSpacing, styles.fontSize.number, (letter, x, y) => this.ctx.fillText(letter, x, y));
475
+ }
476
+ const textShadows = styles.textShadow;
477
+ if (textShadows.length && truncatedText.trim().length) {
478
+ textShadows
479
+ .slice(0)
480
+ .reverse()
481
+ .forEach((textShadow) => {
482
+ this.ctx.shadowColor = (0, color_utilities_1.asString)(textShadow.color);
483
+ this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;
484
+ this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;
485
+ this.ctx.shadowBlur = textShadow.blur.number;
486
+ if (styles.letterSpacing === 0) {
487
+ this.ctx.fillText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
488
+ }
489
+ else {
490
+ this.iterateLettersWithLetterSpacing(truncatedBounds, styles.letterSpacing, styles.fontSize.number, (letter, x, y) => this.ctx.fillText(letter, x, y));
491
+ }
492
+ });
493
+ this.ctx.shadowColor = '';
494
+ this.ctx.shadowOffsetX = 0;
495
+ this.ctx.shadowOffsetY = 0;
496
+ this.ctx.shadowBlur = 0;
497
+ }
498
+ break;
499
+ }
500
+ case 1 /* PAINT_ORDER_LAYER.STROKE */:
501
+ if (styles.webkitTextStrokeWidth && truncatedText.trim().length) {
502
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
503
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
504
+ this.ctx.lineJoin =
505
+ typeof window !== 'undefined' && !!window.chrome ? 'miter' : 'round';
506
+ if (styles.letterSpacing === 0) {
507
+ this.ctx.strokeText(truncatedText, firstBound.bounds.left, firstBound.bounds.top + styles.fontSize.number);
508
+ }
509
+ else {
510
+ this.iterateLettersWithLetterSpacing(truncatedBounds, styles.letterSpacing, styles.fontSize.number, (letter, x, y) => this.ctx.strokeText(letter, x, y));
511
+ }
512
+ this.ctx.strokeStyle = '';
513
+ this.ctx.lineWidth = 0;
514
+ this.ctx.lineJoin = 'miter';
515
+ }
516
+ break;
517
+ }
518
+ });
519
+ return;
520
+ }
521
+ // Normal rendering (no ellipsis needed)
522
+ text.textBounds.forEach((text) => {
523
+ paintOrder.forEach((paintOrderLayer) => {
524
+ switch (paintOrderLayer) {
525
+ case 0 /* PAINT_ORDER_LAYER.FILL */: {
526
+ this.ctx.fillStyle = (0, color_utilities_1.asString)(styles.color);
527
+ this.renderTextWithLetterSpacing(text, styles.letterSpacing, styles.fontSize.number);
528
+ const textShadows = styles.textShadow;
529
+ if (textShadows.length && text.text.trim().length) {
530
+ textShadows
531
+ .slice(0)
532
+ .reverse()
533
+ .forEach((textShadow) => {
534
+ this.ctx.shadowColor = (0, color_utilities_1.asString)(textShadow.color);
535
+ this.ctx.shadowOffsetX = textShadow.offsetX.number * this.options.scale;
536
+ this.ctx.shadowOffsetY = textShadow.offsetY.number * this.options.scale;
537
+ this.ctx.shadowBlur = textShadow.blur.number;
538
+ this.renderTextWithLetterSpacing(text, styles.letterSpacing, styles.fontSize.number);
539
+ });
540
+ this.ctx.shadowColor = '';
541
+ this.ctx.shadowOffsetX = 0;
542
+ this.ctx.shadowOffsetY = 0;
543
+ this.ctx.shadowBlur = 0;
544
+ }
545
+ if (styles.textDecorationLine.length) {
546
+ this.renderTextDecoration(text.bounds, styles);
547
+ }
548
+ break;
549
+ }
550
+ case 1 /* PAINT_ORDER_LAYER.STROKE */: {
551
+ if (styles.webkitTextStrokeWidth && text.text.trim().length) {
552
+ this.ctx.strokeStyle = (0, color_utilities_1.asString)(styles.webkitTextStrokeColor);
553
+ this.ctx.lineWidth = styles.webkitTextStrokeWidth;
554
+ this.ctx.lineJoin =
555
+ typeof window !== 'undefined' && !!window.chrome ? 'miter' : 'round';
556
+ const baseline = styles.fontSize.number;
557
+ if (styles.letterSpacing === 0) {
558
+ this.ctx.strokeText(text.text, text.bounds.left, text.bounds.top + baseline);
559
+ }
560
+ else {
561
+ this.iterateLettersWithLetterSpacing(text, styles.letterSpacing, baseline, (letter, x, y) => this.ctx.strokeText(letter, x, y));
562
+ }
563
+ this.ctx.strokeStyle = '';
564
+ this.ctx.lineWidth = 0;
565
+ this.ctx.lineJoin = 'miter';
566
+ }
567
+ break;
568
+ }
569
+ }
570
+ });
571
+ });
572
+ }
573
+ }
574
+ exports.TextRenderer = TextRenderer;
575
+ //# 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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"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isOpacityEffect = exports.isClipEffect = exports.isTransformEffect = exports.OpacityEffect = exports.ClipEffect = exports.TransformEffect = void 0;
3
+ exports.isClipPathEffect = exports.isOpacityEffect = exports.isClipEffect = exports.isTransformEffect = exports.ClipPathEffect = exports.OpacityEffect = exports.ClipEffect = exports.TransformEffect = void 0;
4
4
  class TransformEffect {
5
5
  constructor(offsetX, offsetY, matrix) {
6
6
  this.offsetX = offsetX;
@@ -27,10 +27,26 @@ class OpacityEffect {
27
27
  }
28
28
  }
29
29
  exports.OpacityEffect = OpacityEffect;
30
+ /**
31
+ * Clips the element and all its descendants to an arbitrary canvas-drawn shape.
32
+ * The `applyClip` callback is responsible for calling beginPath, the shape
33
+ * operations, and ctx.clip() — giving each shape type full control over how
34
+ * the path is constructed (arc, ellipse, lineTo, Path2D, etc.).
35
+ */
36
+ class ClipPathEffect {
37
+ constructor(applyClip) {
38
+ this.applyClip = applyClip;
39
+ this.type = 3 /* EffectType.CLIP_PATH */;
40
+ this.target = 2 /* EffectTarget.BACKGROUND_BORDERS */ | 4 /* EffectTarget.CONTENT */;
41
+ }
42
+ }
43
+ exports.ClipPathEffect = ClipPathEffect;
30
44
  const isTransformEffect = (effect) => effect.type === 0 /* EffectType.TRANSFORM */;
31
45
  exports.isTransformEffect = isTransformEffect;
32
46
  const isClipEffect = (effect) => effect.type === 1 /* EffectType.CLIP */;
33
47
  exports.isClipEffect = isClipEffect;
34
48
  const isOpacityEffect = (effect) => effect.type === 2 /* EffectType.OPACITY */;
35
49
  exports.isOpacityEffect = isOpacityEffect;
50
+ const isClipPathEffect = (effect) => effect.type === 3 /* EffectType.CLIP_PATH */;
51
+ exports.isClipPathEffect = isClipPathEffect;
36
52
  //# sourceMappingURL=effects.js.map