html2canvas-pro 2.4.5 → 2.5.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 (231) hide show
  1. package/README.md +117 -13
  2. package/dist/html2canvas-pro.cjs +3425 -1677
  3. package/dist/html2canvas-pro.cjs.map +1 -1
  4. package/dist/html2canvas-pro.esm.js +3425 -1677
  5. package/dist/html2canvas-pro.esm.js.map +1 -1
  6. package/dist/html2canvas-pro.js +3479 -1731
  7. package/dist/html2canvas-pro.js.map +1 -1
  8. package/dist/html2canvas-pro.min.js +5 -5
  9. package/dist/types/core/cache-storage.d.ts +22 -1
  10. package/dist/types/core/context.d.ts +10 -1
  11. package/dist/types/core/logger.d.ts +0 -3
  12. package/dist/types/core/render-element.d.ts +11 -0
  13. package/dist/types/core/util.d.ts +6 -0
  14. package/dist/types/css/index.d.ts +77 -46
  15. package/dist/types/css/parse.d.ts +15 -0
  16. package/dist/types/css/property-descriptors/accent-color.d.ts +5 -0
  17. package/dist/types/css/property-descriptors/backdrop-filter.d.ts +9 -0
  18. package/dist/types/css/property-descriptors/background-blend-mode.d.ts +16 -16
  19. package/dist/types/css/property-descriptors/border-image-width.d.ts +36 -0
  20. package/dist/types/css/property-descriptors/clip-path.d.ts +16 -2
  21. package/dist/types/css/property-descriptors/isolation.d.ts +6 -0
  22. package/dist/types/css/property-descriptors/mask.d.ts +25 -0
  23. package/dist/types/css/property-descriptors/mix-blend-mode.d.ts +16 -16
  24. package/dist/types/css/property-descriptors/outline.d.ts +15 -0
  25. package/dist/types/css/property-descriptors/text-emphasis.d.ts +22 -0
  26. package/dist/types/css/property-descriptors/text-shadow.d.ts +1 -1
  27. package/dist/types/css/property-descriptors/webkit-box-reflect.d.ts +19 -0
  28. package/dist/types/css/property-descriptors/webkit-text-fill-color.d.ts +9 -0
  29. package/dist/types/css/syntax/token-constants.d.ts +1 -1
  30. package/dist/types/css/types/color-math.d.ts +7 -1
  31. package/dist/types/css/types/color-spaces/a98.d.ts +2 -1
  32. package/dist/types/css/types/color-spaces/p3.d.ts +5 -4
  33. package/dist/types/css/types/color-spaces/pro-photo.d.ts +5 -4
  34. package/dist/types/css/types/color-spaces/rec2020.d.ts +5 -4
  35. package/dist/types/css/types/color-spaces/srgb.d.ts +5 -4
  36. package/dist/types/css/types/color-utilities.d.ts +11 -11
  37. package/dist/types/css/types/color.d.ts +1 -0
  38. package/dist/types/css/types/functions/conic-gradient.d.ts +17 -0
  39. package/dist/types/css/types/functions/image-set.d.ts +11 -0
  40. package/dist/types/css/types/functions/repeating-radial-gradient.d.ts +8 -0
  41. package/dist/types/css/types/image.d.ts +17 -2
  42. package/dist/types/css/types/safe-eval.d.ts +0 -6
  43. package/dist/types/dom/copy-css-styles.d.ts +8 -0
  44. package/dist/types/dom/document-cloner.d.ts +3 -13
  45. package/dist/types/dom/iframe-mount.d.ts +37 -0
  46. package/dist/types/dom/pseudo-content.d.ts +33 -0
  47. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +2 -2
  48. package/dist/types/dom/replaced-elements/input-element-container.d.ts +1 -1
  49. package/dist/types/options.d.ts +8 -2
  50. package/dist/types/render/canvas/background-renderer.d.ts +28 -0
  51. package/dist/types/render/canvas/border-image-renderer.d.ts +50 -1
  52. package/dist/types/render/canvas/canvas-renderer.d.ts +29 -15
  53. package/dist/types/render/canvas/effects-renderer.d.ts +8 -0
  54. package/dist/types/render/canvas/mask-renderer.d.ts +36 -0
  55. package/dist/types/render/canvas/text-clip-renderer.d.ts +56 -0
  56. package/dist/types/render/canvas/text-renderer.d.ts +22 -0
  57. package/dist/types/render/stacking-context.d.ts +4 -1
  58. package/package.json +41 -42
  59. package/dist/lib/config.js +0 -49
  60. package/dist/lib/core/abort-helper.js +0 -20
  61. package/dist/lib/core/background-parser.js +0 -41
  62. package/dist/lib/core/bitwise.js +0 -5
  63. package/dist/lib/core/cache-storage.js +0 -283
  64. package/dist/lib/core/config-assembler.js +0 -88
  65. package/dist/lib/core/constants.js +0 -25
  66. package/dist/lib/core/context.js +0 -19
  67. package/dist/lib/core/debugger.js +0 -27
  68. package/dist/lib/core/features.js +0 -190
  69. package/dist/lib/core/logger.js +0 -56
  70. package/dist/lib/core/lru-map.js +0 -66
  71. package/dist/lib/core/origin-checker.js +0 -53
  72. package/dist/lib/core/performance-monitor.js +0 -185
  73. package/dist/lib/core/render-element.js +0 -131
  74. package/dist/lib/core/util.js +0 -4
  75. package/dist/lib/core/validator.js +0 -500
  76. package/dist/lib/css/grouped/background-styles.js +0 -36
  77. package/dist/lib/css/grouped/border-styles.js +0 -75
  78. package/dist/lib/css/grouped/font-styles.js +0 -93
  79. package/dist/lib/css/grouped/layout-styles.js +0 -127
  80. package/dist/lib/css/index.js +0 -339
  81. package/dist/lib/css/layout/bounds.js +0 -52
  82. package/dist/lib/css/layout/text.js +0 -133
  83. package/dist/lib/css/property-descriptor.js +0 -2
  84. package/dist/lib/css/property-descriptors/background-blend-mode.js +0 -41
  85. package/dist/lib/css/property-descriptors/background-clip.js +0 -25
  86. package/dist/lib/css/property-descriptors/background-color.js +0 -10
  87. package/dist/lib/css/property-descriptors/background-image.js +0 -24
  88. package/dist/lib/css/property-descriptors/background-origin.js +0 -23
  89. package/dist/lib/css/property-descriptors/background-position.js +0 -19
  90. package/dist/lib/css/property-descriptors/background-repeat.js +0 -33
  91. package/dist/lib/css/property-descriptors/background-size.js +0 -23
  92. package/dist/lib/css/property-descriptors/border-color.js +0 -14
  93. package/dist/lib/css/property-descriptors/border-image-repeat.js +0 -42
  94. package/dist/lib/css/property-descriptors/border-image-slice.js +0 -45
  95. package/dist/lib/css/property-descriptors/border-image-source.js +0 -22
  96. package/dist/lib/css/property-descriptors/border-radius.js +0 -15
  97. package/dist/lib/css/property-descriptors/border-style.js +0 -26
  98. package/dist/lib/css/property-descriptors/border-width.js +0 -20
  99. package/dist/lib/css/property-descriptors/box-decoration-break.js +0 -18
  100. package/dist/lib/css/property-descriptors/box-shadow.js +0 -54
  101. package/dist/lib/css/property-descriptors/clip-path.js +0 -189
  102. package/dist/lib/css/property-descriptors/color.js +0 -10
  103. package/dist/lib/css/property-descriptors/content.js +0 -19
  104. package/dist/lib/css/property-descriptors/counter-increment.js +0 -35
  105. package/dist/lib/css/property-descriptors/counter-reset.js +0 -18
  106. package/dist/lib/css/property-descriptors/direction.js +0 -18
  107. package/dist/lib/css/property-descriptors/display.js +0 -81
  108. package/dist/lib/css/property-descriptors/duration.js +0 -14
  109. package/dist/lib/css/property-descriptors/filter.js +0 -86
  110. package/dist/lib/css/property-descriptors/float.js +0 -22
  111. package/dist/lib/css/property-descriptors/font-family.js +0 -47
  112. package/dist/lib/css/property-descriptors/font-size.js +0 -10
  113. package/dist/lib/css/property-descriptors/font-style.js +0 -20
  114. package/dist/lib/css/property-descriptors/font-variant-ligatures.js +0 -34
  115. package/dist/lib/css/property-descriptors/font-variant.js +0 -13
  116. package/dist/lib/css/property-descriptors/font-weight.js +0 -25
  117. package/dist/lib/css/property-descriptors/image-rendering.js +0 -33
  118. package/dist/lib/css/property-descriptors/letter-spacing.js +0 -21
  119. package/dist/lib/css/property-descriptors/line-break.js +0 -23
  120. package/dist/lib/css/property-descriptors/line-height.js +0 -24
  121. package/dist/lib/css/property-descriptors/list-style-image.js +0 -17
  122. package/dist/lib/css/property-descriptors/list-style-position.js +0 -18
  123. package/dist/lib/css/property-descriptors/list-style-type.js +0 -122
  124. package/dist/lib/css/property-descriptors/margin.js +0 -13
  125. package/dist/lib/css/property-descriptors/mix-blend-mode.js +0 -31
  126. package/dist/lib/css/property-descriptors/object-fit.js +0 -28
  127. package/dist/lib/css/property-descriptors/object-position.js +0 -42
  128. package/dist/lib/css/property-descriptors/opacity.js +0 -16
  129. package/dist/lib/css/property-descriptors/overflow-wrap.js +0 -18
  130. package/dist/lib/css/property-descriptors/overflow.js +0 -27
  131. package/dist/lib/css/property-descriptors/padding.js +0 -14
  132. package/dist/lib/css/property-descriptors/paint-order.js +0 -33
  133. package/dist/lib/css/property-descriptors/position.js +0 -22
  134. package/dist/lib/css/property-descriptors/quotes.js +0 -41
  135. package/dist/lib/css/property-descriptors/rotate.js +0 -27
  136. package/dist/lib/css/property-descriptors/text-align.js +0 -21
  137. package/dist/lib/css/property-descriptors/text-decoration-color.js +0 -10
  138. package/dist/lib/css/property-descriptors/text-decoration-line.js +0 -28
  139. package/dist/lib/css/property-descriptors/text-decoration-style.js +0 -24
  140. package/dist/lib/css/property-descriptors/text-decoration-thickness.js +0 -26
  141. package/dist/lib/css/property-descriptors/text-overflow.js +0 -18
  142. package/dist/lib/css/property-descriptors/text-shadow.js +0 -46
  143. package/dist/lib/css/property-descriptors/text-transform.js +0 -20
  144. package/dist/lib/css/property-descriptors/text-underline-offset.js +0 -23
  145. package/dist/lib/css/property-descriptors/transform-origin.js +0 -24
  146. package/dist/lib/css/property-descriptors/transform.js +0 -57
  147. package/dist/lib/css/property-descriptors/visibility.js +0 -20
  148. package/dist/lib/css/property-descriptors/webkit-line-clamp.js +0 -26
  149. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +0 -10
  150. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +0 -16
  151. package/dist/lib/css/property-descriptors/white-space.js +0 -32
  152. package/dist/lib/css/property-descriptors/word-break.js +0 -26
  153. package/dist/lib/css/property-descriptors/writing-mode.js +0 -28
  154. package/dist/lib/css/property-descriptors/z-index.js +0 -19
  155. package/dist/lib/css/property-descriptors/zoom.js +0 -18
  156. package/dist/lib/css/syntax/parser.js +0 -141
  157. package/dist/lib/css/syntax/token-constants.js +0 -214
  158. package/dist/lib/css/syntax/token-singletons.js +0 -36
  159. package/dist/lib/css/syntax/token-types.js +0 -10
  160. package/dist/lib/css/syntax/tokenizer.js +0 -502
  161. package/dist/lib/css/type-descriptor.js +0 -2
  162. package/dist/lib/css/types/angle.js +0 -80
  163. package/dist/lib/css/types/color-math.js +0 -25
  164. package/dist/lib/css/types/color-spaces/a98.js +0 -78
  165. package/dist/lib/css/types/color-spaces/p3.js +0 -86
  166. package/dist/lib/css/types/color-spaces/pro-photo.js +0 -83
  167. package/dist/lib/css/types/color-spaces/rec2020.js +0 -85
  168. package/dist/lib/css/types/color-spaces/srgb.js +0 -79
  169. package/dist/lib/css/types/color-utilities.js +0 -342
  170. package/dist/lib/css/types/color.js +0 -400
  171. package/dist/lib/css/types/functions/-prefix-linear-gradient.js +0 -32
  172. package/dist/lib/css/types/functions/-prefix-radial-gradient.js +0 -83
  173. package/dist/lib/css/types/functions/-webkit-gradient.js +0 -59
  174. package/dist/lib/css/types/functions/counter.js +0 -367
  175. package/dist/lib/css/types/functions/gradient.js +0 -163
  176. package/dist/lib/css/types/functions/linear-gradient.js +0 -27
  177. package/dist/lib/css/types/functions/radial-gradient.js +0 -90
  178. package/dist/lib/css/types/functions/repeating-linear-gradient.js +0 -9
  179. package/dist/lib/css/types/image.js +0 -62
  180. package/dist/lib/css/types/index.js +0 -2
  181. package/dist/lib/css/types/length-percentage.js +0 -197
  182. package/dist/lib/css/types/length.js +0 -5
  183. package/dist/lib/css/types/safe-eval.js +0 -80
  184. package/dist/lib/css/types/time.js +0 -17
  185. package/dist/lib/dom/document-cloner.js +0 -618
  186. package/dist/lib/dom/dom-normalizer.js +0 -115
  187. package/dist/lib/dom/element-container.js +0 -71
  188. package/dist/lib/dom/elements/li-element-container.js +0 -11
  189. package/dist/lib/dom/elements/ol-element-container.js +0 -12
  190. package/dist/lib/dom/elements/select-element-container.js +0 -12
  191. package/dist/lib/dom/elements/textarea-element-container.js +0 -11
  192. package/dist/lib/dom/node-parser.js +0 -125
  193. package/dist/lib/dom/node-type-guards.js +0 -81
  194. package/dist/lib/dom/replaced-elements/canvas-element-container.js +0 -13
  195. package/dist/lib/dom/replaced-elements/iframe-element-container.js +0 -38
  196. package/dist/lib/dom/replaced-elements/image-element-container.js +0 -14
  197. package/dist/lib/dom/replaced-elements/index.js +0 -2
  198. package/dist/lib/dom/replaced-elements/input-element-container.js +0 -89
  199. package/dist/lib/dom/replaced-elements/svg-element-container.js +0 -57
  200. package/dist/lib/dom/slot-cloner.js +0 -176
  201. package/dist/lib/dom/text-container.js +0 -35
  202. package/dist/lib/index.js +0 -49
  203. package/dist/lib/options.js +0 -2
  204. package/dist/lib/render/background.js +0 -188
  205. package/dist/lib/render/bezier-curve.js +0 -34
  206. package/dist/lib/render/border.js +0 -104
  207. package/dist/lib/render/bound-curves.js +0 -188
  208. package/dist/lib/render/box-sizing.js +0 -20
  209. package/dist/lib/render/canvas/background-renderer.js +0 -338
  210. package/dist/lib/render/canvas/border-image-renderer.js +0 -153
  211. package/dist/lib/render/canvas/border-renderer.js +0 -184
  212. package/dist/lib/render/canvas/box-shadow-geometry.js +0 -52
  213. package/dist/lib/render/canvas/box-shadow-painter.js +0 -194
  214. package/dist/lib/render/canvas/box-shadow-transform.js +0 -42
  215. package/dist/lib/render/canvas/canvas-path.js +0 -25
  216. package/dist/lib/render/canvas/canvas-renderer.js +0 -610
  217. package/dist/lib/render/canvas/content-renderer.js +0 -270
  218. package/dist/lib/render/canvas/effects-renderer.js +0 -171
  219. package/dist/lib/render/canvas/filter-surface.js +0 -270
  220. package/dist/lib/render/canvas/font-utils.js +0 -46
  221. package/dist/lib/render/canvas/foreignobject-renderer.js +0 -38
  222. package/dist/lib/render/canvas/surface-bounds.js +0 -64
  223. package/dist/lib/render/canvas/text/text-decoration-renderer.js +0 -99
  224. package/dist/lib/render/canvas/text-renderer.js +0 -486
  225. package/dist/lib/render/effects.js +0 -231
  226. package/dist/lib/render/font-metrics.js +0 -53
  227. package/dist/lib/render/object-fit.js +0 -91
  228. package/dist/lib/render/path.js +0 -26
  229. package/dist/lib/render/renderer-interface.js +0 -2
  230. package/dist/lib/render/stacking-context.js +0 -341
  231. package/dist/lib/render/vector.js +0 -16
@@ -1,115 +0,0 @@
1
- "use strict";
2
- /**
3
- * DOM Normalizer
4
- * Handles DOM side effects that need to happen before rendering
5
- * Extracted from ElementContainer to follow SRP
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.DOMNormalizer = void 0;
9
- const node_type_guards_1 = require("./node-type-guards");
10
- /**
11
- * Normalize element styles for accurate rendering
12
- * This includes disabling animations and neutralizing transforms.
13
- */
14
- class DOMNormalizer {
15
- /**
16
- * Normalize a single element and return original styles.
17
- *
18
- * ## Why we replace transforms with an identity value instead of "none"
19
- *
20
- * `getBoundingClientRect()` returns visual (post-transform) coordinates, so we
21
- * must neutralize any active transform before measuring element bounds.
22
- *
23
- * The naive approach of setting `transform: none` (or `rotate: none`) has a
24
- * critical side-effect: per **CSS Transforms Level 2**, an element whose
25
- * `transform` is non-none automatically becomes the **containing block** for
26
- * all of its `position: absolute` *and* `position: fixed` descendants.
27
- * Setting it to `none` destroys that role, causing children to resolve their
28
- * percentage dimensions and offsets against an unintended ancestor — which
29
- * produces completely wrong bounds.
30
- *
31
- * Solution: instead of removing the transform, we replace it with a visually
32
- * inert identity value:
33
- *
34
- * - `transform: scale(0.5)` → `transform: translate(0, 0)`
35
- * - `translate(0, 0)` is an identity transform (no visual change, no layout shift).
36
- * - `getBoundingClientRect()` returns the same layout-space coordinates as
37
- * if there were no transform at all.
38
- * - Because the value is still non-none, the element **remains a containing
39
- * block** for both `position: absolute` and `position: fixed` descendants.
40
- *
41
- * - `rotate: 45deg` → `rotate: 0deg`
42
- * - `0deg` is the identity rotation; `0deg ≠ none`, so the same containing-
43
- * block guarantee holds.
44
- *
45
- * @param element - Element to normalize
46
- * @param styles - Parsed CSS styles
47
- * @returns Original styles map for restoration
48
- */
49
- static normalizeElement(element, styles) {
50
- const originalStyles = {};
51
- if (!(0, node_type_guards_1.isHTMLElementNode)(element)) {
52
- return originalStyles;
53
- }
54
- // Disable animations to capture static state
55
- if (styles.animationDuration.some((duration) => duration > 0)) {
56
- originalStyles.animationDuration = element.style.animationDuration;
57
- element.style.animationDuration = '0s';
58
- }
59
- // Replace the actual transform with an identity translate so that:
60
- // 1. getBoundingClientRect() returns layout-space (unscaled/unrotated) coords.
61
- // 2. The element still satisfies "transform != none" and therefore keeps
62
- // its role as a containing block for position:absolute / position:fixed
63
- // descendants (CSS Transforms Level 2 §2.3).
64
- if (styles.transform !== null) {
65
- originalStyles.transform = element.style.transform;
66
- element.style.transform = 'translate(0, 0)';
67
- }
68
- // Same rationale for the standalone `rotate` property.
69
- // `rotate: 0deg` is an identity rotation with no visual effect.
70
- //
71
- // However, individual transform properties (`rotate`, `translate`, `scale`)
72
- // are part of CSS Transforms Level 2 and their containing-block guarantee
73
- // is not uniformly implemented across all browsers. To be safe, if `rotate`
74
- // is the only transform-like property active on this element, we also set
75
- // `transform: translate(0, 0)` so that the containing-block role is reliably
76
- // preserved via the well-supported `transform` property.
77
- if (styles.rotate !== null) {
78
- originalStyles.rotate = element.style.rotate;
79
- element.style.rotate = '0deg';
80
- // Individual transform properties (`rotate`, `translate`, `scale`) are
81
- // CSS Transforms Level 2 and their containing-block guarantee is not
82
- // uniformly implemented in all browsers. If `transform` was not already
83
- // set to translate(0,0) in the block above (i.e. this element has
84
- // `rotate` but no `transform`), we set it now so the containing-block
85
- // role is reliably established via the widely-supported `transform`
86
- // property – independently of browser support for individual props.
87
- if (originalStyles.transform === undefined) {
88
- originalStyles.transform = element.style.transform;
89
- element.style.transform = 'translate(0, 0)';
90
- }
91
- }
92
- return originalStyles;
93
- }
94
- /**
95
- * Restore element styles after rendering.
96
- *
97
- * @param element - Element to restore
98
- * @param originalStyles - Original styles to restore
99
- */
100
- static restoreElement(element, originalStyles) {
101
- if (!(0, node_type_guards_1.isHTMLElementNode)(element)) {
102
- return;
103
- }
104
- if (originalStyles.animationDuration !== undefined) {
105
- element.style.animationDuration = originalStyles.animationDuration;
106
- }
107
- if (originalStyles.transform !== undefined) {
108
- element.style.transform = originalStyles.transform;
109
- }
110
- if (originalStyles.rotate !== undefined) {
111
- element.style.rotate = originalStyles.rotate;
112
- }
113
- }
114
- }
115
- exports.DOMNormalizer = DOMNormalizer;
@@ -1,71 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ElementContainer = void 0;
4
- const index_1 = require("../css/index");
5
- const bounds_1 = require("../css/layout/bounds");
6
- const node_type_guards_1 = require("./node-type-guards");
7
- const debugger_1 = require("../core/debugger");
8
- const dom_normalizer_1 = require("./dom-normalizer");
9
- class ElementContainer {
10
- constructor(context, element, options = {}) {
11
- this.context = context;
12
- this.textNodes = [];
13
- this.elements = [];
14
- this.createsStackingContext = false;
15
- this.createsRealStackingContext = false;
16
- this.isListOwner = false;
17
- this.debugRender = false;
18
- if ((0, debugger_1.isDebugging)(element, 3 /* DebuggerType.PARSE */)) {
19
- debugger;
20
- }
21
- this.styles = new index_1.CSSParsedDeclaration(context, context.config.window.getComputedStyle(element, null));
22
- const shouldNormalize = options.normalizeDom !== false;
23
- if (shouldNormalize && (0, node_type_guards_1.isHTMLElementNode)(element)) {
24
- this.originalStyles = dom_normalizer_1.DOMNormalizer.normalizeElement(element, this.styles);
25
- this.originalElement = element;
26
- }
27
- this.bounds = (0, bounds_1.parseBounds)(this.context, element);
28
- if (element.tagName === 'FIELDSET') {
29
- const legend = element.querySelector(':scope > legend');
30
- if (legend) {
31
- const legendBounds = (0, bounds_1.parseBounds)(this.context, legend);
32
- this.legendBounds = legendBounds;
33
- // A <fieldset>'s legend is centered on its top border line and
34
- // overflows ABOVE it. Chrome's getBoundingClientRect() for the
35
- // fieldset includes that overflow, so bounds.top is too high and
36
- // the border would be drawn above the legend. Shift the bounds so
37
- // the top border sits at the legend's vertical center, matching
38
- // how the browser renders fieldset + legend (issue #227).
39
- const borderBoxTop = legendBounds.top + legendBounds.height / 2 - this.styles.borderTopWidth / 2;
40
- this.bounds = new bounds_1.Bounds(this.bounds.left, borderBoxTop, this.bounds.width, this.bounds.height - (borderBoxTop - this.bounds.top));
41
- }
42
- }
43
- if ((0, debugger_1.isDebugging)(element, 4 /* DebuggerType.RENDER */)) {
44
- this.debugRender = true;
45
- }
46
- }
47
- /**
48
- * Restore original element styles (if normalized)
49
- * Call this after rendering is complete to clean up DOM state
50
- */
51
- restore() {
52
- if (this.originalStyles && this.originalElement) {
53
- dom_normalizer_1.DOMNormalizer.restoreElement(this.originalElement, this.originalStyles);
54
- // Clear references to prevent memory leaks
55
- this.originalStyles = undefined;
56
- this.originalElement = undefined;
57
- }
58
- }
59
- /**
60
- * Recursively restore all elements in the tree
61
- * Call this on the root container after rendering is complete
62
- */
63
- restoreTree() {
64
- this.restore();
65
- // Recursively restore all child elements
66
- for (const child of this.elements) {
67
- child.restoreTree();
68
- }
69
- }
70
- }
71
- exports.ElementContainer = ElementContainer;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LIElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- class LIElementContainer extends element_container_1.ElementContainer {
6
- constructor(context, element) {
7
- super(context, element);
8
- this.value = element.value;
9
- }
10
- }
11
- exports.LIElementContainer = LIElementContainer;
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OLElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- class OLElementContainer extends element_container_1.ElementContainer {
6
- constructor(context, element) {
7
- super(context, element);
8
- this.start = element.start;
9
- this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;
10
- }
11
- }
12
- exports.OLElementContainer = OLElementContainer;
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SelectElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- class SelectElementContainer extends element_container_1.ElementContainer {
6
- constructor(context, element) {
7
- super(context, element);
8
- const option = element.options[element.selectedIndex || 0];
9
- this.value = option ? option.text || '' : '';
10
- }
11
- }
12
- exports.SelectElementContainer = SelectElementContainer;
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TextareaElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- class TextareaElementContainer extends element_container_1.ElementContainer {
6
- constructor(context, element) {
7
- super(context, element);
8
- this.value = element.value;
9
- }
10
- }
11
- exports.TextareaElementContainer = TextareaElementContainer;
@@ -1,125 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseTree = void 0;
4
- const element_container_1 = require("./element-container");
5
- const text_container_1 = require("./text-container");
6
- const image_element_container_1 = require("./replaced-elements/image-element-container");
7
- const canvas_element_container_1 = require("./replaced-elements/canvas-element-container");
8
- const svg_element_container_1 = require("./replaced-elements/svg-element-container");
9
- const li_element_container_1 = require("./elements/li-element-container");
10
- const ol_element_container_1 = require("./elements/ol-element-container");
11
- const input_element_container_1 = require("./replaced-elements/input-element-container");
12
- const select_element_container_1 = require("./elements/select-element-container");
13
- const textarea_element_container_1 = require("./elements/textarea-element-container");
14
- const iframe_element_container_1 = require("./replaced-elements/iframe-element-container");
15
- const node_type_guards_1 = require("./node-type-guards");
16
- const bitwise_1 = require("../core/bitwise");
17
- const LIST_OWNERS = ['OL', 'UL', 'MENU'];
18
- const parseNodeTree = (context, node, parent, root) => {
19
- for (let childNode = node.firstChild, nextNode; childNode; childNode = nextNode) {
20
- nextNode = childNode.nextSibling;
21
- parseChildNode(context, childNode, parent, root);
22
- }
23
- };
24
- /**
25
- * Parse a single node as a child of `parent`.
26
- *
27
- * Separated from the tree walk so that nodes assigned to a `<slot>` (including
28
- * bare text nodes, which have no child nodes) can be parsed directly. Without
29
- * this, slotted shadow-DOM content such as web component labels was silently
30
- * dropped because `parseNodeTree` only iterates `node.firstChild` (issue #226).
31
- */
32
- const parseChildNode = (context, childNode, parent, root) => {
33
- // Fixes #2238 #1624 - Fix the issue of TextNode content being overlooked in rendering due to being perceived as blank by trim().
34
- if ((0, node_type_guards_1.isTextNode)(childNode) && childNode.data.length > 0) {
35
- parent.textNodes.push(new text_container_1.TextContainer(context, childNode, parent.styles));
36
- }
37
- else if ((0, node_type_guards_1.isElementNode)(childNode)) {
38
- if ((0, node_type_guards_1.isSlotElement)(childNode) && childNode.assignedNodes) {
39
- // Slotted content is laid out at the slot's position: parse each
40
- // assigned node (text or element) as a direct child of the slot's
41
- // parent container.
42
- childNode
43
- .assignedNodes()
44
- .forEach((assignedNode) => parseChildNode(context, assignedNode, parent, root));
45
- }
46
- else {
47
- const container = createContainer(context, childNode);
48
- if (container.styles.isVisible()) {
49
- if (createsRealStackingContext(childNode, container, root)) {
50
- container.createsRealStackingContext = true;
51
- }
52
- else if (createsStackingContext(container.styles)) {
53
- container.createsStackingContext = true;
54
- }
55
- if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {
56
- container.isListOwner = true;
57
- }
58
- parent.elements.push(container);
59
- if (childNode.shadowRoot) {
60
- parseNodeTree(context, childNode.shadowRoot, container, root);
61
- }
62
- else if (!(0, node_type_guards_1.isTextareaElement)(childNode) && !(0, node_type_guards_1.isSVGElement)(childNode) && !(0, node_type_guards_1.isSelectElement)(childNode)) {
63
- parseNodeTree(context, childNode, container, root);
64
- }
65
- }
66
- }
67
- }
68
- };
69
- const createContainer = (context, element) => {
70
- if ((0, node_type_guards_1.isImageElement)(element)) {
71
- return new image_element_container_1.ImageElementContainer(context, element);
72
- }
73
- if ((0, node_type_guards_1.isCanvasElement)(element)) {
74
- return new canvas_element_container_1.CanvasElementContainer(context, element);
75
- }
76
- if ((0, node_type_guards_1.isSVGElement)(element)) {
77
- return new svg_element_container_1.SVGElementContainer(context, element);
78
- }
79
- if ((0, node_type_guards_1.isLIElement)(element)) {
80
- return new li_element_container_1.LIElementContainer(context, element);
81
- }
82
- if ((0, node_type_guards_1.isOLElement)(element)) {
83
- return new ol_element_container_1.OLElementContainer(context, element);
84
- }
85
- if ((0, node_type_guards_1.isInputElement)(element)) {
86
- return new input_element_container_1.InputElementContainer(context, element);
87
- }
88
- if ((0, node_type_guards_1.isSelectElement)(element)) {
89
- return new select_element_container_1.SelectElementContainer(context, element);
90
- }
91
- if ((0, node_type_guards_1.isTextareaElement)(element)) {
92
- return new textarea_element_container_1.TextareaElementContainer(context, element);
93
- }
94
- if ((0, node_type_guards_1.isIFrameElement)(element)) {
95
- return new iframe_element_container_1.IFrameElementContainer(context, element, exports.parseTree);
96
- }
97
- return new element_container_1.ElementContainer(context, element);
98
- };
99
- const parseTree = (context, element) => {
100
- const container = createContainer(context, element);
101
- container.createsRealStackingContext = true;
102
- parseNodeTree(context, element, container, container);
103
- return container;
104
- };
105
- exports.parseTree = parseTree;
106
- const createsRealStackingContext = (node, container, root) => {
107
- return (container.styles.isPositionedWithZIndex() ||
108
- container.styles.opacity < 1 ||
109
- Boolean(container.styles.filter) ||
110
- container.styles.isTransformed() ||
111
- ((0, node_type_guards_1.isBodyElement)(node) && root.styles.isTransparent()));
112
- };
113
- const createsStackingContext = (styles) => {
114
- // Positioned and floating elements create stacking contexts
115
- if (styles.isPositioned() || styles.isFloating()) {
116
- return true;
117
- }
118
- // Fix for Issue #137: Inline-level containers (inline-flex, inline-block, etc.)
119
- // should create stacking contexts to prevent their children from being added
120
- // to the parent's stacking context, which causes rendering order issues
121
- return ((0, bitwise_1.contains)(styles.display, 268435456 /* DISPLAY.INLINE_FLEX */) ||
122
- (0, bitwise_1.contains)(styles.display, 33554432 /* DISPLAY.INLINE_BLOCK */) ||
123
- (0, bitwise_1.contains)(styles.display, 536870912 /* DISPLAY.INLINE_GRID */) ||
124
- (0, bitwise_1.contains)(styles.display, 134217728 /* DISPLAY.INLINE_TABLE */));
125
- };
@@ -1,81 +0,0 @@
1
- "use strict";
2
- /**
3
- * DOM Node Type Guards
4
- *
5
- * All DOM node type guards consolidated here to eliminate duplication
6
- * and provide a single source of truth for node type checking.
7
- */
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.canHavePseudoElements = exports.isCustomElement = exports.isOLElement = exports.isLIElement = exports.isSlotElement = exports.isSelectElement = exports.isTextareaElement = exports.isScriptElement = exports.isStyleElement = exports.isIFrameElement = exports.isImageElement = exports.isVideoElement = exports.isCanvasElement = exports.isBodyElement = exports.isSVGElement = exports.isHTMLElement = exports.isInputElement = exports.isHTMLElementNode = exports.isSVGElementNode = exports.isTextNode = exports.isElementNode = void 0;
10
- // --- Generic node type guards ---
11
- const isElementNode = (node) => node.nodeType === Node.ELEMENT_NODE;
12
- exports.isElementNode = isElementNode;
13
- const isTextNode = (node) => node.nodeType === Node.TEXT_NODE;
14
- exports.isTextNode = isTextNode;
15
- const isSVGElementNode = (element) => typeof element.className === 'object';
16
- exports.isSVGElementNode = isSVGElementNode;
17
- const isHTMLElementNode = (node) => (0, exports.isElementNode)(node) && typeof node.style !== 'undefined' && !(0, exports.isSVGElementNode)(node);
18
- exports.isHTMLElementNode = isHTMLElementNode;
19
- // --- Tag name based type guards ---
20
- const isInputElement = (node) => node.tagName === 'INPUT';
21
- exports.isInputElement = isInputElement;
22
- const isHTMLElement = (node) => node.tagName === 'HTML';
23
- exports.isHTMLElement = isHTMLElement;
24
- const isSVGElement = (node) => node.tagName === 'svg';
25
- exports.isSVGElement = isSVGElement;
26
- const isBodyElement = (node) => node.tagName === 'BODY';
27
- exports.isBodyElement = isBodyElement;
28
- const isCanvasElement = (node) => node.tagName === 'CANVAS';
29
- exports.isCanvasElement = isCanvasElement;
30
- const isVideoElement = (node) => node.tagName === 'VIDEO';
31
- exports.isVideoElement = isVideoElement;
32
- const isImageElement = (node) => node.tagName === 'IMG';
33
- exports.isImageElement = isImageElement;
34
- const isIFrameElement = (node) => node.tagName === 'IFRAME';
35
- exports.isIFrameElement = isIFrameElement;
36
- const isStyleElement = (node) => node.tagName === 'STYLE';
37
- exports.isStyleElement = isStyleElement;
38
- const isScriptElement = (node) => node.tagName === 'SCRIPT';
39
- exports.isScriptElement = isScriptElement;
40
- const isTextareaElement = (node) => node.tagName === 'TEXTAREA';
41
- exports.isTextareaElement = isTextareaElement;
42
- const isSelectElement = (node) => node.tagName === 'SELECT';
43
- exports.isSelectElement = isSelectElement;
44
- const isSlotElement = (node) => node.tagName === 'SLOT';
45
- exports.isSlotElement = isSlotElement;
46
- const isLIElement = (node) => node.tagName === 'LI';
47
- exports.isLIElement = isLIElement;
48
- const isOLElement = (node) => node.tagName === 'OL';
49
- exports.isOLElement = isOLElement;
50
- const isCustomElement = (element) => !(0, exports.isSVGElementNode)(element) && element.tagName.indexOf('-') > 0;
51
- exports.isCustomElement = isCustomElement;
52
- const VOID_OR_REPLACED_TAGS = new Set([
53
- 'IMG',
54
- 'VIDEO',
55
- 'AUDIO',
56
- 'CANVAS',
57
- 'IFRAME',
58
- 'INPUT',
59
- 'TEXTAREA',
60
- 'SELECT',
61
- 'BR',
62
- 'HR',
63
- 'META',
64
- 'LINK',
65
- 'BASE',
66
- 'COL',
67
- 'SOURCE',
68
- 'TRACK',
69
- 'WBR',
70
- 'AREA',
71
- 'PARAM',
72
- 'EMBED',
73
- 'OBJECT'
74
- ]);
75
- /**
76
- * Check if an element can have ::before / ::after pseudo-elements.
77
- * Per the CSS spec, replaced elements and void elements cannot have pseudo-elements.
78
- * SVG elements also do not support pseudo-elements.
79
- */
80
- const canHavePseudoElements = (element) => !(0, exports.isSVGElementNode)(element) && !VOID_OR_REPLACED_TAGS.has(element.tagName);
81
- exports.canHavePseudoElements = canHavePseudoElements;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CanvasElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- class CanvasElementContainer extends element_container_1.ElementContainer {
6
- constructor(context, canvas) {
7
- super(context, canvas);
8
- this.canvas = canvas;
9
- this.intrinsicWidth = canvas.width;
10
- this.intrinsicHeight = canvas.height;
11
- }
12
- }
13
- exports.CanvasElementContainer = CanvasElementContainer;
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IFrameElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- const color_1 = require("../../css/types/color");
6
- const color_utilities_1 = require("../../css/types/color-utilities");
7
- class IFrameElementContainer extends element_container_1.ElementContainer {
8
- constructor(context, iframe, parseTreeFn) {
9
- super(context, iframe);
10
- this.src = iframe.src;
11
- this.width = parseInt(iframe.width, 10) || 0;
12
- this.height = parseInt(iframe.height, 10) || 0;
13
- this.backgroundColor = this.styles.backgroundColor;
14
- this.parseTreeFn = parseTreeFn;
15
- try {
16
- if (iframe.contentWindow &&
17
- iframe.contentWindow.document &&
18
- iframe.contentWindow.document.documentElement &&
19
- this.parseTreeFn) {
20
- this.tree = this.parseTreeFn(context, iframe.contentWindow.document.documentElement);
21
- // http://www.w3.org/TR/css3-background/#special-backgrounds
22
- const documentBackgroundColor = iframe.contentWindow.document.documentElement
23
- ? (0, color_1.parseColor)(context, getComputedStyle(iframe.contentWindow.document.documentElement).backgroundColor)
24
- : color_1.COLORS.TRANSPARENT;
25
- const bodyBackgroundColor = iframe.contentWindow.document.body
26
- ? (0, color_1.parseColor)(context, getComputedStyle(iframe.contentWindow.document.body).backgroundColor)
27
- : color_1.COLORS.TRANSPARENT;
28
- this.backgroundColor = (0, color_utilities_1.isTransparent)(documentBackgroundColor)
29
- ? (0, color_utilities_1.isTransparent)(bodyBackgroundColor)
30
- ? this.styles.backgroundColor
31
- : bodyBackgroundColor
32
- : documentBackgroundColor;
33
- }
34
- }
35
- catch (e) { }
36
- }
37
- }
38
- exports.IFrameElementContainer = IFrameElementContainer;
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ImageElementContainer = void 0;
4
- const element_container_1 = require("../element-container");
5
- class ImageElementContainer extends element_container_1.ElementContainer {
6
- constructor(context, img) {
7
- super(context, img);
8
- this.src = img.currentSrc || img.src;
9
- this.intrinsicWidth = img.naturalWidth;
10
- this.intrinsicHeight = img.naturalHeight;
11
- this.context.cache.addImage(this.src);
12
- }
13
- }
14
- exports.ImageElementContainer = ImageElementContainer;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,89 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InputElementContainer = exports.PLACEHOLDER_COLOR = exports.INPUT_COLOR = exports.PASSWORD = exports.RADIO = exports.CHECKBOX = void 0;
4
- const element_container_1 = require("../element-container");
5
- const bounds_1 = require("../../css/layout/bounds");
6
- const CHECKBOX_BORDER_RADIUS = [
7
- {
8
- type: 15 /* TokenType.DIMENSION_TOKEN */,
9
- flags: 0,
10
- unit: 'px',
11
- number: 3
12
- }
13
- ];
14
- const RADIO_BORDER_RADIUS = [
15
- {
16
- type: 16 /* TokenType.PERCENTAGE_TOKEN */,
17
- flags: 0,
18
- number: 50
19
- }
20
- ];
21
- const reformatInputBounds = (bounds) => {
22
- if (bounds.width > bounds.height) {
23
- return new bounds_1.Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);
24
- }
25
- else if (bounds.width < bounds.height) {
26
- return new bounds_1.Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);
27
- }
28
- return bounds;
29
- };
30
- const getInputValue = (node) => {
31
- const value = node.type === exports.PASSWORD ? new Array(node.value.length + 1).join('\u2022') : node.value;
32
- return value.length === 0 ? node.placeholder || '' : value;
33
- };
34
- const isPlaceholder = (node) => {
35
- return node.value.length === 0 && !!node.placeholder;
36
- };
37
- exports.CHECKBOX = 'checkbox';
38
- exports.RADIO = 'radio';
39
- exports.PASSWORD = 'password';
40
- exports.INPUT_COLOR = 0x2a2a2aff;
41
- // Default placeholder color (similar to browsers: rgba(117, 117, 117, 1) or #757575)
42
- exports.PLACEHOLDER_COLOR = 0x757575ff;
43
- class InputElementContainer extends element_container_1.ElementContainer {
44
- constructor(context, input) {
45
- super(context, input);
46
- this.type = input.type.toLowerCase();
47
- this.checked = input.checked;
48
- this.value = getInputValue(input);
49
- this.isPlaceholder = isPlaceholder(input);
50
- if (this.type === exports.CHECKBOX || this.type === exports.RADIO) {
51
- this.styles.backgroundColor = 0xdededeff;
52
- this.styles.borderTopColor =
53
- this.styles.borderRightColor =
54
- this.styles.borderBottomColor =
55
- this.styles.borderLeftColor =
56
- 0xa5a5a5ff;
57
- this.styles.borderTopWidth =
58
- this.styles.borderRightWidth =
59
- this.styles.borderBottomWidth =
60
- this.styles.borderLeftWidth =
61
- 1;
62
- this.styles.borderTopStyle =
63
- this.styles.borderRightStyle =
64
- this.styles.borderBottomStyle =
65
- this.styles.borderLeftStyle =
66
- 1 /* BORDER_STYLE.SOLID */;
67
- this.styles.backgroundClip = [0 /* BACKGROUND_CLIP.BORDER_BOX */];
68
- this.styles.backgroundOrigin = [0 /* BACKGROUND_ORIGIN.BORDER_BOX */];
69
- this.bounds = reformatInputBounds(this.bounds);
70
- }
71
- switch (this.type) {
72
- case exports.CHECKBOX:
73
- this.styles.borderTopRightRadius =
74
- this.styles.borderTopLeftRadius =
75
- this.styles.borderBottomRightRadius =
76
- this.styles.borderBottomLeftRadius =
77
- CHECKBOX_BORDER_RADIUS;
78
- break;
79
- case exports.RADIO:
80
- this.styles.borderTopRightRadius =
81
- this.styles.borderTopLeftRadius =
82
- this.styles.borderBottomRightRadius =
83
- this.styles.borderBottomLeftRadius =
84
- RADIO_BORDER_RADIUS;
85
- break;
86
- }
87
- }
88
- }
89
- exports.InputElementContainer = InputElementContainer;
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SVGElementContainer = exports.serializeWithoutBoxOffsets = void 0;
4
- const element_container_1 = require("../element-container");
5
- const bounds_1 = require("../../css/layout/bounds");
6
- const BOX_OFFSET_PROPERTIES = [
7
- 'position',
8
- 'inset',
9
- 'top',
10
- 'right',
11
- 'bottom',
12
- 'left',
13
- 'inset-inline',
14
- 'inset-inline-start',
15
- 'inset-inline-end',
16
- 'inset-block',
17
- 'inset-block-start',
18
- 'inset-block-end',
19
- 'margin',
20
- 'margin-top',
21
- 'margin-right',
22
- 'margin-bottom',
23
- 'margin-left',
24
- 'margin-inline',
25
- 'margin-inline-start',
26
- 'margin-inline-end',
27
- 'margin-block',
28
- 'margin-block-start',
29
- 'margin-block-end'
30
- ];
31
- const serializeWithoutBoxOffsets = (serializer, img) => {
32
- const style = img.getAttribute('style');
33
- BOX_OFFSET_PROPERTIES.forEach((property) => img.style.removeProperty(property));
34
- const serialized = serializer.serializeToString(img);
35
- if (style === null) {
36
- img.removeAttribute('style');
37
- }
38
- else {
39
- img.setAttribute('style', style);
40
- }
41
- return serialized;
42
- };
43
- exports.serializeWithoutBoxOffsets = serializeWithoutBoxOffsets;
44
- class SVGElementContainer extends element_container_1.ElementContainer {
45
- constructor(context, img) {
46
- super(context, img);
47
- const s = new XMLSerializer();
48
- const bounds = (0, bounds_1.parseBounds)(context, img);
49
- img.setAttribute('width', `${bounds.width}px`);
50
- img.setAttribute('height', `${bounds.height}px`);
51
- this.svg = `data:image/svg+xml,${encodeURIComponent((0, exports.serializeWithoutBoxOffsets)(s, img))}`;
52
- this.intrinsicWidth = img.width.baseVal.value;
53
- this.intrinsicHeight = img.height.baseVal.value;
54
- this.context.cache.addImage(this.svg);
55
- }
56
- }
57
- exports.SVGElementContainer = SVGElementContainer;