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,65 @@
1
+ /**
2
+ * Effects Renderer
3
+ *
4
+ * Handles rendering effects including:
5
+ * - Opacity effects
6
+ * - Transform effects (matrix transformations)
7
+ * - Clip effects (overflow / border-radius clipping via Path[])
8
+ * - Clip-path effects (CSS clip-path shapes: inset, circle, ellipse, polygon, path)
9
+ */
10
+ import { IElementEffect } from '../effects';
11
+ import { Path } from '../path';
12
+ /**
13
+ * Dependencies required for EffectsRenderer
14
+ */
15
+ export interface EffectsRendererDependencies {
16
+ ctx: CanvasRenderingContext2D;
17
+ }
18
+ /**
19
+ * Path callback for clip effects
20
+ */
21
+ export interface EffectsPathCallback {
22
+ path(paths: Path[]): void;
23
+ }
24
+ /**
25
+ * Effects Renderer
26
+ *
27
+ * Manages rendering effects stack including opacity, transforms, and clipping.
28
+ * Extracted from CanvasRenderer to improve code organization and maintainability.
29
+ */
30
+ export declare class EffectsRenderer {
31
+ private readonly ctx;
32
+ private readonly pathCallback;
33
+ private readonly activeEffects;
34
+ constructor(deps: EffectsRendererDependencies, pathCallback: EffectsPathCallback);
35
+ /**
36
+ * Apply multiple effects
37
+ * Clears existing effects and applies new ones
38
+ *
39
+ * @param effects - Array of effects to apply
40
+ */
41
+ applyEffects(effects: IElementEffect[]): void;
42
+ /**
43
+ * Apply a single effect
44
+ *
45
+ * @param effect - Effect to apply
46
+ */
47
+ applyEffect(effect: IElementEffect): void;
48
+ /**
49
+ * Remove the most recent effect
50
+ * Restores the canvas state before the effect was applied
51
+ */
52
+ popEffect(): void;
53
+ /**
54
+ * Get the current number of active effects
55
+ *
56
+ * @returns Number of active effects
57
+ */
58
+ getActiveEffectCount(): number;
59
+ /**
60
+ * Check if there are any active effects
61
+ *
62
+ * @returns True if there are active effects
63
+ */
64
+ hasActiveEffects(): boolean;
65
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Text Renderer
3
+ *
4
+ * Handles rendering of text content including:
5
+ * - Text with letter spacing
6
+ * - Text decorations (underline, overline, line-through)
7
+ * - Text shadows
8
+ * - Webkit line clamp
9
+ * - Text overflow ellipsis
10
+ * - Paint order (fill/stroke)
11
+ * - Font styles
12
+ */
13
+ import { Context } from '../../core/context';
14
+ import { TextContainer } from '../../dom/text-container';
15
+ import { CSSParsedDeclaration } from '../../css';
16
+ import { Bounds } from '../../css/layout/bounds';
17
+ import { TextBounds } from '../../css/layout/text';
18
+ /**
19
+ * Dependencies required for TextRenderer
20
+ */
21
+ export interface TextRendererDependencies {
22
+ ctx: CanvasRenderingContext2D;
23
+ context: Context;
24
+ options: {
25
+ scale: number;
26
+ };
27
+ }
28
+ export declare const hasCJKCharacters: (text: string) => boolean;
29
+ /**
30
+ * Text Renderer
31
+ *
32
+ * Specialized renderer for text content.
33
+ * Extracted from CanvasRenderer to improve code organization and maintainability.
34
+ */
35
+ export declare class TextRenderer {
36
+ private readonly ctx;
37
+ private readonly options;
38
+ constructor(deps: TextRendererDependencies);
39
+ /**
40
+ * Iterate grapheme clusters one-by-one, applying correct letter-spacing and
41
+ * per-script baseline for each character.
42
+ *
43
+ * Issue #73: When letter-spacing is non-zero, text must be rendered character by
44
+ * character. This helper centralises two fixes applied during that iteration:
45
+ * 1. Add `letterSpacing` to each character's advance width (was previously
46
+ * omitted, causing characters to render without any spacing).
47
+ * 2. Switch to the ideographic baseline for CJK glyphs so their vertical
48
+ * position matches how browsers lay them out in the DOM.
49
+ *
50
+ * The `renderFn` callback receives (letter, x, y) and performs the actual draw
51
+ * call (fillText or strokeText), allowing fill and stroke paths to share one
52
+ * implementation.
53
+ */
54
+ private iterateLettersWithLetterSpacing;
55
+ /**
56
+ * Render text with letter-spacing applied (fill pass).
57
+ * When letterSpacing is 0 the whole string is drawn in one call; otherwise each
58
+ * grapheme is drawn individually so spacing and CJK baseline are applied correctly.
59
+ */
60
+ renderTextWithLetterSpacing(text: TextBounds, letterSpacing: number, baseline: number): void;
61
+ /**
62
+ * Helper method to render text with paint order support
63
+ * Reduces code duplication in line-clamp and normal rendering
64
+ */
65
+ private renderTextBoundWithPaintOrder;
66
+ private renderTextDecoration;
67
+ private drawDecorationLine;
68
+ private truncateTextWithEllipsis;
69
+ /**
70
+ * Create font style array
71
+ * Public method used by list rendering
72
+ */
73
+ createFontStyle(styles: CSSParsedDeclaration): string[];
74
+ renderTextNode(text: TextContainer, styles: CSSParsedDeclaration, containerBounds?: Bounds): Promise<void>;
75
+ }
@@ -3,7 +3,8 @@ import { Path } from './path';
3
3
  export declare const enum EffectType {
4
4
  TRANSFORM = 0,
5
5
  CLIP = 1,
6
- OPACITY = 2
6
+ OPACITY = 2,
7
+ CLIP_PATH = 3
7
8
  }
8
9
  export declare const enum EffectTarget {
9
10
  BACKGROUND_BORDERS = 2,
@@ -33,6 +34,19 @@ export declare class OpacityEffect implements IElementEffect {
33
34
  readonly target: number;
34
35
  constructor(opacity: number);
35
36
  }
37
+ /**
38
+ * Clips the element and all its descendants to an arbitrary canvas-drawn shape.
39
+ * The `applyClip` callback is responsible for calling beginPath, the shape
40
+ * operations, and ctx.clip() — giving each shape type full control over how
41
+ * the path is constructed (arc, ellipse, lineTo, Path2D, etc.).
42
+ */
43
+ export declare class ClipPathEffect implements IElementEffect {
44
+ readonly applyClip: (ctx: CanvasRenderingContext2D) => void;
45
+ readonly type: EffectType;
46
+ readonly target: number;
47
+ constructor(applyClip: (ctx: CanvasRenderingContext2D) => void);
48
+ }
36
49
  export declare const isTransformEffect: (effect: IElementEffect) => effect is TransformEffect;
37
50
  export declare const isClipEffect: (effect: IElementEffect) => effect is ClipEffect;
38
51
  export declare const isOpacityEffect: (effect: IElementEffect) => effect is OpacityEffect;
52
+ export declare const isClipPathEffect: (effect: IElementEffect) => effect is ClipPathEffect;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Base interface for all specialized renderers
3
+ * Each renderer is responsible for rendering a specific aspect of an element
4
+ */
5
+ export interface IRenderer {
6
+ /**
7
+ * Render the specified aspect of the element
8
+ */
9
+ render(...args: any[]): void | Promise<void>;
10
+ }
11
+ /**
12
+ * Common dependencies required by renderers
13
+ */
14
+ export interface RendererDependencies {
15
+ ctx: CanvasRenderingContext2D;
16
+ scale: number;
17
+ options: any;
18
+ }
19
+ /**
20
+ * Performance tracking for renderers
21
+ */
22
+ export interface RenderMetrics {
23
+ renderCount: number;
24
+ totalTime: number;
25
+ averageTime: number;
26
+ }
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "default": "./dist/html2canvas-pro.esm.js"
15
15
  }
16
16
  },
17
- "version": "1.6.7",
17
+ "version": "2.0.1",
18
18
  "author": {
19
19
  "name": "yorickshan",
20
20
  "email": "yorickshan@gmail.com",
@@ -58,6 +58,7 @@
58
58
  "appium-ios-simulator": "^8.0.9",
59
59
  "base64-arraybuffer": "1.0.2",
60
60
  "body-parser": "^2.2.1",
61
+ "change-case": "^5.4.4",
61
62
  "chai": "6.2.2",
62
63
  "conventional-changelog-cli": "^5.0.0",
63
64
  "cors": "^2.8.5",