html2canvas-pro 2.4.5 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/README.md +115 -13
  2. package/dist/html2canvas-pro.cjs +3058 -1607
  3. package/dist/html2canvas-pro.cjs.map +1 -1
  4. package/dist/html2canvas-pro.esm.js +3058 -1607
  5. package/dist/html2canvas-pro.esm.js.map +1 -1
  6. package/dist/html2canvas-pro.js +3055 -1604
  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 +4 -1
  10. package/dist/types/core/context.d.ts +10 -1
  11. package/dist/types/core/render-element.d.ts +11 -0
  12. package/dist/types/core/util.d.ts +6 -0
  13. package/dist/types/css/index.d.ts +77 -46
  14. package/dist/types/css/parse.d.ts +15 -0
  15. package/dist/types/css/property-descriptors/accent-color.d.ts +5 -0
  16. package/dist/types/css/property-descriptors/backdrop-filter.d.ts +9 -0
  17. package/dist/types/css/property-descriptors/background-blend-mode.d.ts +16 -16
  18. package/dist/types/css/property-descriptors/border-image-width.d.ts +36 -0
  19. package/dist/types/css/property-descriptors/clip-path.d.ts +16 -2
  20. package/dist/types/css/property-descriptors/isolation.d.ts +6 -0
  21. package/dist/types/css/property-descriptors/mask.d.ts +25 -0
  22. package/dist/types/css/property-descriptors/mix-blend-mode.d.ts +16 -16
  23. package/dist/types/css/property-descriptors/outline.d.ts +15 -0
  24. package/dist/types/css/property-descriptors/text-emphasis.d.ts +22 -0
  25. package/dist/types/css/property-descriptors/text-shadow.d.ts +1 -1
  26. package/dist/types/css/property-descriptors/webkit-box-reflect.d.ts +19 -0
  27. package/dist/types/css/property-descriptors/webkit-text-fill-color.d.ts +9 -0
  28. package/dist/types/css/syntax/token-constants.d.ts +1 -1
  29. package/dist/types/css/types/color-math.d.ts +7 -1
  30. package/dist/types/css/types/color-spaces/a98.d.ts +2 -1
  31. package/dist/types/css/types/color-spaces/p3.d.ts +5 -4
  32. package/dist/types/css/types/color-spaces/pro-photo.d.ts +5 -4
  33. package/dist/types/css/types/color-spaces/rec2020.d.ts +5 -4
  34. package/dist/types/css/types/color-spaces/srgb.d.ts +5 -4
  35. package/dist/types/css/types/color-utilities.d.ts +11 -11
  36. package/dist/types/css/types/color.d.ts +1 -0
  37. package/dist/types/css/types/functions/conic-gradient.d.ts +11 -0
  38. package/dist/types/css/types/functions/image-set.d.ts +11 -0
  39. package/dist/types/css/types/functions/repeating-radial-gradient.d.ts +8 -0
  40. package/dist/types/css/types/image.d.ts +15 -2
  41. package/dist/types/css/types/safe-eval.d.ts +0 -6
  42. package/dist/types/dom/copy-css-styles.d.ts +8 -0
  43. package/dist/types/dom/document-cloner.d.ts +3 -13
  44. package/dist/types/dom/iframe-mount.d.ts +37 -0
  45. package/dist/types/dom/pseudo-content.d.ts +33 -0
  46. package/dist/types/dom/replaced-elements/iframe-element-container.d.ts +2 -2
  47. package/dist/types/options.d.ts +8 -2
  48. package/dist/types/render/canvas/background-renderer.d.ts +19 -0
  49. package/dist/types/render/canvas/border-image-renderer.d.ts +50 -1
  50. package/dist/types/render/canvas/canvas-renderer.d.ts +21 -15
  51. package/dist/types/render/canvas/mask-renderer.d.ts +36 -0
  52. package/dist/types/render/canvas/text-clip-renderer.d.ts +36 -0
  53. package/dist/types/render/canvas/text-renderer.d.ts +22 -0
  54. package/dist/types/render/stacking-context.d.ts +4 -1
  55. package/package.json +39 -40
  56. package/dist/lib/config.js +0 -49
  57. package/dist/lib/core/abort-helper.js +0 -20
  58. package/dist/lib/core/background-parser.js +0 -41
  59. package/dist/lib/core/bitwise.js +0 -5
  60. package/dist/lib/core/cache-storage.js +0 -283
  61. package/dist/lib/core/config-assembler.js +0 -88
  62. package/dist/lib/core/constants.js +0 -25
  63. package/dist/lib/core/context.js +0 -19
  64. package/dist/lib/core/debugger.js +0 -27
  65. package/dist/lib/core/features.js +0 -190
  66. package/dist/lib/core/logger.js +0 -56
  67. package/dist/lib/core/lru-map.js +0 -66
  68. package/dist/lib/core/origin-checker.js +0 -53
  69. package/dist/lib/core/performance-monitor.js +0 -185
  70. package/dist/lib/core/render-element.js +0 -131
  71. package/dist/lib/core/util.js +0 -4
  72. package/dist/lib/core/validator.js +0 -500
  73. package/dist/lib/css/grouped/background-styles.js +0 -36
  74. package/dist/lib/css/grouped/border-styles.js +0 -75
  75. package/dist/lib/css/grouped/font-styles.js +0 -93
  76. package/dist/lib/css/grouped/layout-styles.js +0 -127
  77. package/dist/lib/css/index.js +0 -339
  78. package/dist/lib/css/layout/bounds.js +0 -52
  79. package/dist/lib/css/layout/text.js +0 -133
  80. package/dist/lib/css/property-descriptor.js +0 -2
  81. package/dist/lib/css/property-descriptors/background-blend-mode.js +0 -41
  82. package/dist/lib/css/property-descriptors/background-clip.js +0 -25
  83. package/dist/lib/css/property-descriptors/background-color.js +0 -10
  84. package/dist/lib/css/property-descriptors/background-image.js +0 -24
  85. package/dist/lib/css/property-descriptors/background-origin.js +0 -23
  86. package/dist/lib/css/property-descriptors/background-position.js +0 -19
  87. package/dist/lib/css/property-descriptors/background-repeat.js +0 -33
  88. package/dist/lib/css/property-descriptors/background-size.js +0 -23
  89. package/dist/lib/css/property-descriptors/border-color.js +0 -14
  90. package/dist/lib/css/property-descriptors/border-image-repeat.js +0 -42
  91. package/dist/lib/css/property-descriptors/border-image-slice.js +0 -45
  92. package/dist/lib/css/property-descriptors/border-image-source.js +0 -22
  93. package/dist/lib/css/property-descriptors/border-radius.js +0 -15
  94. package/dist/lib/css/property-descriptors/border-style.js +0 -26
  95. package/dist/lib/css/property-descriptors/border-width.js +0 -20
  96. package/dist/lib/css/property-descriptors/box-decoration-break.js +0 -18
  97. package/dist/lib/css/property-descriptors/box-shadow.js +0 -54
  98. package/dist/lib/css/property-descriptors/clip-path.js +0 -189
  99. package/dist/lib/css/property-descriptors/color.js +0 -10
  100. package/dist/lib/css/property-descriptors/content.js +0 -19
  101. package/dist/lib/css/property-descriptors/counter-increment.js +0 -35
  102. package/dist/lib/css/property-descriptors/counter-reset.js +0 -18
  103. package/dist/lib/css/property-descriptors/direction.js +0 -18
  104. package/dist/lib/css/property-descriptors/display.js +0 -81
  105. package/dist/lib/css/property-descriptors/duration.js +0 -14
  106. package/dist/lib/css/property-descriptors/filter.js +0 -86
  107. package/dist/lib/css/property-descriptors/float.js +0 -22
  108. package/dist/lib/css/property-descriptors/font-family.js +0 -47
  109. package/dist/lib/css/property-descriptors/font-size.js +0 -10
  110. package/dist/lib/css/property-descriptors/font-style.js +0 -20
  111. package/dist/lib/css/property-descriptors/font-variant-ligatures.js +0 -34
  112. package/dist/lib/css/property-descriptors/font-variant.js +0 -13
  113. package/dist/lib/css/property-descriptors/font-weight.js +0 -25
  114. package/dist/lib/css/property-descriptors/image-rendering.js +0 -33
  115. package/dist/lib/css/property-descriptors/letter-spacing.js +0 -21
  116. package/dist/lib/css/property-descriptors/line-break.js +0 -23
  117. package/dist/lib/css/property-descriptors/line-height.js +0 -24
  118. package/dist/lib/css/property-descriptors/list-style-image.js +0 -17
  119. package/dist/lib/css/property-descriptors/list-style-position.js +0 -18
  120. package/dist/lib/css/property-descriptors/list-style-type.js +0 -122
  121. package/dist/lib/css/property-descriptors/margin.js +0 -13
  122. package/dist/lib/css/property-descriptors/mix-blend-mode.js +0 -31
  123. package/dist/lib/css/property-descriptors/object-fit.js +0 -28
  124. package/dist/lib/css/property-descriptors/object-position.js +0 -42
  125. package/dist/lib/css/property-descriptors/opacity.js +0 -16
  126. package/dist/lib/css/property-descriptors/overflow-wrap.js +0 -18
  127. package/dist/lib/css/property-descriptors/overflow.js +0 -27
  128. package/dist/lib/css/property-descriptors/padding.js +0 -14
  129. package/dist/lib/css/property-descriptors/paint-order.js +0 -33
  130. package/dist/lib/css/property-descriptors/position.js +0 -22
  131. package/dist/lib/css/property-descriptors/quotes.js +0 -41
  132. package/dist/lib/css/property-descriptors/rotate.js +0 -27
  133. package/dist/lib/css/property-descriptors/text-align.js +0 -21
  134. package/dist/lib/css/property-descriptors/text-decoration-color.js +0 -10
  135. package/dist/lib/css/property-descriptors/text-decoration-line.js +0 -28
  136. package/dist/lib/css/property-descriptors/text-decoration-style.js +0 -24
  137. package/dist/lib/css/property-descriptors/text-decoration-thickness.js +0 -26
  138. package/dist/lib/css/property-descriptors/text-overflow.js +0 -18
  139. package/dist/lib/css/property-descriptors/text-shadow.js +0 -46
  140. package/dist/lib/css/property-descriptors/text-transform.js +0 -20
  141. package/dist/lib/css/property-descriptors/text-underline-offset.js +0 -23
  142. package/dist/lib/css/property-descriptors/transform-origin.js +0 -24
  143. package/dist/lib/css/property-descriptors/transform.js +0 -57
  144. package/dist/lib/css/property-descriptors/visibility.js +0 -20
  145. package/dist/lib/css/property-descriptors/webkit-line-clamp.js +0 -26
  146. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +0 -10
  147. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +0 -16
  148. package/dist/lib/css/property-descriptors/white-space.js +0 -32
  149. package/dist/lib/css/property-descriptors/word-break.js +0 -26
  150. package/dist/lib/css/property-descriptors/writing-mode.js +0 -28
  151. package/dist/lib/css/property-descriptors/z-index.js +0 -19
  152. package/dist/lib/css/property-descriptors/zoom.js +0 -18
  153. package/dist/lib/css/syntax/parser.js +0 -141
  154. package/dist/lib/css/syntax/token-constants.js +0 -214
  155. package/dist/lib/css/syntax/token-singletons.js +0 -36
  156. package/dist/lib/css/syntax/token-types.js +0 -10
  157. package/dist/lib/css/syntax/tokenizer.js +0 -502
  158. package/dist/lib/css/type-descriptor.js +0 -2
  159. package/dist/lib/css/types/angle.js +0 -80
  160. package/dist/lib/css/types/color-math.js +0 -25
  161. package/dist/lib/css/types/color-spaces/a98.js +0 -78
  162. package/dist/lib/css/types/color-spaces/p3.js +0 -86
  163. package/dist/lib/css/types/color-spaces/pro-photo.js +0 -83
  164. package/dist/lib/css/types/color-spaces/rec2020.js +0 -85
  165. package/dist/lib/css/types/color-spaces/srgb.js +0 -79
  166. package/dist/lib/css/types/color-utilities.js +0 -342
  167. package/dist/lib/css/types/color.js +0 -400
  168. package/dist/lib/css/types/functions/-prefix-linear-gradient.js +0 -32
  169. package/dist/lib/css/types/functions/-prefix-radial-gradient.js +0 -83
  170. package/dist/lib/css/types/functions/-webkit-gradient.js +0 -59
  171. package/dist/lib/css/types/functions/counter.js +0 -367
  172. package/dist/lib/css/types/functions/gradient.js +0 -163
  173. package/dist/lib/css/types/functions/linear-gradient.js +0 -27
  174. package/dist/lib/css/types/functions/radial-gradient.js +0 -90
  175. package/dist/lib/css/types/functions/repeating-linear-gradient.js +0 -9
  176. package/dist/lib/css/types/image.js +0 -62
  177. package/dist/lib/css/types/index.js +0 -2
  178. package/dist/lib/css/types/length-percentage.js +0 -197
  179. package/dist/lib/css/types/length.js +0 -5
  180. package/dist/lib/css/types/safe-eval.js +0 -80
  181. package/dist/lib/css/types/time.js +0 -17
  182. package/dist/lib/dom/document-cloner.js +0 -618
  183. package/dist/lib/dom/dom-normalizer.js +0 -115
  184. package/dist/lib/dom/element-container.js +0 -71
  185. package/dist/lib/dom/elements/li-element-container.js +0 -11
  186. package/dist/lib/dom/elements/ol-element-container.js +0 -12
  187. package/dist/lib/dom/elements/select-element-container.js +0 -12
  188. package/dist/lib/dom/elements/textarea-element-container.js +0 -11
  189. package/dist/lib/dom/node-parser.js +0 -125
  190. package/dist/lib/dom/node-type-guards.js +0 -81
  191. package/dist/lib/dom/replaced-elements/canvas-element-container.js +0 -13
  192. package/dist/lib/dom/replaced-elements/iframe-element-container.js +0 -38
  193. package/dist/lib/dom/replaced-elements/image-element-container.js +0 -14
  194. package/dist/lib/dom/replaced-elements/index.js +0 -2
  195. package/dist/lib/dom/replaced-elements/input-element-container.js +0 -89
  196. package/dist/lib/dom/replaced-elements/svg-element-container.js +0 -57
  197. package/dist/lib/dom/slot-cloner.js +0 -176
  198. package/dist/lib/dom/text-container.js +0 -35
  199. package/dist/lib/index.js +0 -49
  200. package/dist/lib/options.js +0 -2
  201. package/dist/lib/render/background.js +0 -188
  202. package/dist/lib/render/bezier-curve.js +0 -34
  203. package/dist/lib/render/border.js +0 -104
  204. package/dist/lib/render/bound-curves.js +0 -188
  205. package/dist/lib/render/box-sizing.js +0 -20
  206. package/dist/lib/render/canvas/background-renderer.js +0 -338
  207. package/dist/lib/render/canvas/border-image-renderer.js +0 -153
  208. package/dist/lib/render/canvas/border-renderer.js +0 -184
  209. package/dist/lib/render/canvas/box-shadow-geometry.js +0 -52
  210. package/dist/lib/render/canvas/box-shadow-painter.js +0 -194
  211. package/dist/lib/render/canvas/box-shadow-transform.js +0 -42
  212. package/dist/lib/render/canvas/canvas-path.js +0 -25
  213. package/dist/lib/render/canvas/canvas-renderer.js +0 -610
  214. package/dist/lib/render/canvas/content-renderer.js +0 -270
  215. package/dist/lib/render/canvas/effects-renderer.js +0 -171
  216. package/dist/lib/render/canvas/filter-surface.js +0 -270
  217. package/dist/lib/render/canvas/font-utils.js +0 -46
  218. package/dist/lib/render/canvas/foreignobject-renderer.js +0 -38
  219. package/dist/lib/render/canvas/surface-bounds.js +0 -64
  220. package/dist/lib/render/canvas/text/text-decoration-renderer.js +0 -99
  221. package/dist/lib/render/canvas/text-renderer.js +0 -486
  222. package/dist/lib/render/effects.js +0 -231
  223. package/dist/lib/render/font-metrics.js +0 -53
  224. package/dist/lib/render/object-fit.js +0 -91
  225. package/dist/lib/render/path.js +0 -26
  226. package/dist/lib/render/renderer-interface.js +0 -2
  227. package/dist/lib/render/stacking-context.js +0 -341
  228. package/dist/lib/render/vector.js +0 -16
@@ -1,153 +0,0 @@
1
- "use strict";
2
- /**
3
- * Border Image Renderer
4
- *
5
- * Renders CSS border-image using 9-slice scaling.
6
- * The source image is divided into 9 regions (4 corners, 4 edges, 1 center)
7
- * based on border-image-slice values, then each region is drawn to the
8
- * corresponding area of the element's border box.
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.BorderImageRenderer = void 0;
12
- const border_image_repeat_1 = require("../../css/property-descriptors/border-image-repeat");
13
- class BorderImageRenderer {
14
- constructor(ctx) {
15
- this.ctx = ctx;
16
- }
17
- renderBorderImage(bounds, image, slice, repeat, borderTopWidth, borderRightWidth, borderBottomWidth, borderLeftWidth) {
18
- const imgW = image.naturalWidth || image.width;
19
- const imgH = image.naturalHeight || image.height;
20
- if (imgW <= 0 || imgH <= 0) {
21
- return;
22
- }
23
- // Calculate source slice positions in image pixel space
24
- const sT = Math.min(slice.unit === 'percent' ? (slice.top / 100) * imgH : Math.min(slice.top, imgH), imgH);
25
- const sR = Math.min(slice.unit === 'percent' ? (slice.right / 100) * imgW : Math.min(slice.right, imgW), imgW);
26
- const sB = Math.min(slice.unit === 'percent' ? (slice.bottom / 100) * imgH : Math.min(slice.bottom, imgH), imgH);
27
- const sL = Math.min(slice.unit === 'percent' ? (slice.left / 100) * imgW : Math.min(slice.left, imgW), imgW);
28
- const { left, top, width, height } = bounds;
29
- if (width <= 0 || height <= 0) {
30
- return;
31
- }
32
- // Clamp border widths to available box dimensions
33
- const dT = Math.min(borderTopWidth, height);
34
- const dR = Math.min(borderRightWidth, width);
35
- const dB = Math.min(borderBottomWidth, height - dT);
36
- const dL = Math.min(borderLeftWidth, width - dR);
37
- // Draw corners
38
- this.drawRegion(image, 0, 0, sL, sT, left, top, dL, dT);
39
- this.drawRegion(image, imgW - sR, 0, sR, sT, left + width - dR, top, dR, dT);
40
- this.drawRegion(image, imgW - sR, imgH - sB, sR, sB, left + width - dR, top + height - dB, dR, dB);
41
- this.drawRegion(image, 0, imgH - sB, sL, sB, left, top + height - dB, dL, dB);
42
- // Draw edges
43
- const edges = [
44
- {
45
- sx: sL,
46
- sy: 0,
47
- sw: imgW - sL - sR,
48
- sh: sT,
49
- dx: left + dL,
50
- dy: top,
51
- dw: width - dL - dR,
52
- dh: dT,
53
- repeat: repeat.horizontal
54
- },
55
- {
56
- sx: imgW - sR,
57
- sy: sT,
58
- sw: sR,
59
- sh: imgH - sT - sB,
60
- dx: left + width - dR,
61
- dy: top + dT,
62
- dw: dR,
63
- dh: height - dT - dB,
64
- repeat: repeat.vertical
65
- },
66
- {
67
- sx: sL,
68
- sy: imgH - sB,
69
- sw: imgW - sL - sR,
70
- sh: sB,
71
- dx: left + dL,
72
- dy: top + height - dB,
73
- dw: width - dL - dR,
74
- dh: dB,
75
- repeat: repeat.horizontal
76
- },
77
- {
78
- sx: 0,
79
- sy: sT,
80
- sw: sL,
81
- sh: imgH - sT - sB,
82
- dx: left,
83
- dy: top + dT,
84
- dw: dL,
85
- dh: height - dT - dB,
86
- repeat: repeat.vertical
87
- }
88
- ];
89
- for (const edge of edges) {
90
- if (edge.sw <= 0 || edge.sh <= 0 || edge.dw <= 0 || edge.dh <= 0)
91
- continue;
92
- const isHorizontal = edge.dw >= edge.dh;
93
- if (edge.repeat === border_image_repeat_1.BORDER_IMAGE_REPEAT.STRETCH) {
94
- this.ctx.drawImage(image, edge.sx, edge.sy, edge.sw, edge.sh, edge.dx, edge.dy, edge.dw, edge.dh);
95
- }
96
- else if (edge.repeat === border_image_repeat_1.BORDER_IMAGE_REPEAT.REPEAT || edge.repeat === border_image_repeat_1.BORDER_IMAGE_REPEAT.ROUND) {
97
- this.drawRepeatedEdge(image, edge, isHorizontal, edge.repeat === border_image_repeat_1.BORDER_IMAGE_REPEAT.ROUND);
98
- }
99
- }
100
- // Draw center if fill is specified
101
- if (slice.fill) {
102
- const cx = sL;
103
- const cy = sT;
104
- const cw = imgW - sL - sR;
105
- const ch = imgH - sT - sB;
106
- const tcx = left + dL;
107
- const tcy = top + dT;
108
- const tcw = width - dL - dR;
109
- const tch = height - dT - dB;
110
- this.drawRegion(image, cx, cy, cw, ch, tcx, tcy, tcw, tch);
111
- }
112
- }
113
- drawRegion(image, sx, sy, sw, sh, dx, dy, dw, dh) {
114
- if (sw > 0 && sh > 0 && dw > 0 && dh > 0) {
115
- this.ctx.drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh);
116
- }
117
- }
118
- drawRepeatedEdge(image, edge, isHorizontal, round) {
119
- const srcLength = isHorizontal ? edge.sw : edge.sh;
120
- const tgLength = isHorizontal ? edge.dw : edge.dh;
121
- if (srcLength <= 0 || tgLength <= 0)
122
- return;
123
- let tileSize;
124
- let tileCount;
125
- if (round) {
126
- tileCount = Math.max(1, Math.round(tgLength / srcLength));
127
- tileSize = tgLength / tileCount;
128
- }
129
- else {
130
- tileSize = srcLength;
131
- tileCount = Math.ceil(tgLength / tileSize);
132
- }
133
- this.ctx.save();
134
- this.ctx.beginPath();
135
- this.ctx.rect(edge.dx, edge.dy, edge.dw, edge.dh);
136
- this.ctx.clip();
137
- for (let i = 0; i < tileCount; i++) {
138
- const offset = i * tileSize;
139
- const remaining = tgLength - offset;
140
- const clampedSize = Math.min(tileSize, remaining);
141
- if (clampedSize <= 0)
142
- break;
143
- if (isHorizontal) {
144
- this.ctx.drawImage(image, edge.sx, edge.sy, edge.sw, edge.sh, edge.dx + offset, edge.dy, clampedSize, edge.dh);
145
- }
146
- else {
147
- this.ctx.drawImage(image, edge.sx, edge.sy, edge.sw, edge.sh, edge.dx, edge.dy + offset, edge.dw, clampedSize);
148
- }
149
- }
150
- this.ctx.restore();
151
- }
152
- }
153
- exports.BorderImageRenderer = BorderImageRenderer;
@@ -1,184 +0,0 @@
1
- "use strict";
2
- /**
3
- * Border Renderer
4
- *
5
- * Handles rendering of element borders including:
6
- * - Solid borders
7
- * - Double borders
8
- * - Dashed borders
9
- * - Dotted borders
10
- */
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.BorderRenderer = void 0;
13
- const color_utilities_1 = require("../../css/types/color-utilities");
14
- const border_1 = require("../border");
15
- const bezier_curve_1 = require("../bezier-curve");
16
- const vector_1 = require("../vector");
17
- /**
18
- * Border Renderer
19
- *
20
- * Specialized renderer for element borders.
21
- * Extracted from CanvasRenderer to improve code organization and maintainability.
22
- */
23
- class BorderRenderer {
24
- constructor(deps, pathCallbacks) {
25
- this.ctx = deps.ctx;
26
- this.pathCallbacks = pathCallbacks;
27
- }
28
- /**
29
- * Render a solid border
30
- *
31
- * @param color - Border color
32
- * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)
33
- * @param curvePoints - Border curve points
34
- */
35
- async renderSolidBorder(color, side, curvePoints) {
36
- this.pathCallbacks.path((0, border_1.parsePathForBorder)(curvePoints, side));
37
- this.ctx.fillStyle = (0, color_utilities_1.asString)(color);
38
- this.ctx.fill();
39
- }
40
- /**
41
- * Render a double border
42
- * Falls back to solid border if width is too small
43
- *
44
- * @param color - Border color
45
- * @param width - Border width
46
- * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)
47
- * @param curvePoints - Border curve points
48
- */
49
- async renderDoubleBorder(color, width, side, curvePoints) {
50
- if (width < 3) {
51
- await this.renderSolidBorder(color, side, curvePoints);
52
- return;
53
- }
54
- const outerPaths = (0, border_1.parsePathForBorderDoubleOuter)(curvePoints, side);
55
- this.pathCallbacks.path(outerPaths);
56
- this.ctx.fillStyle = (0, color_utilities_1.asString)(color);
57
- this.ctx.fill();
58
- const innerPaths = (0, border_1.parsePathForBorderDoubleInner)(curvePoints, side);
59
- this.pathCallbacks.path(innerPaths);
60
- this.ctx.fill();
61
- }
62
- /**
63
- * Render a dashed or dotted border
64
- *
65
- * @param color - Border color
66
- * @param width - Border width
67
- * @param side - Border side (0=top, 1=right, 2=bottom, 3=left)
68
- * @param curvePoints - Border curve points
69
- * @param style - Border style (DASHED or DOTTED)
70
- */
71
- async renderDashedDottedBorder(color, width, side, curvePoints, style) {
72
- this.ctx.save();
73
- const strokePaths = (0, border_1.parsePathForBorderStroke)(curvePoints, side);
74
- const boxPaths = (0, border_1.parsePathForBorder)(curvePoints, side);
75
- if (style === 2 /* BORDER_STYLE.DASHED */) {
76
- this.pathCallbacks.path(boxPaths);
77
- this.ctx.clip();
78
- }
79
- // Extract start and end coordinates
80
- let startX, startY, endX, endY;
81
- if ((0, bezier_curve_1.isBezierCurve)(boxPaths[0])) {
82
- startX = boxPaths[0].start.x;
83
- startY = boxPaths[0].start.y;
84
- }
85
- else {
86
- startX = boxPaths[0].x;
87
- startY = boxPaths[0].y;
88
- }
89
- if ((0, bezier_curve_1.isBezierCurve)(boxPaths[1])) {
90
- endX = boxPaths[1].end.x;
91
- endY = boxPaths[1].end.y;
92
- }
93
- else {
94
- endX = boxPaths[1].x;
95
- endY = boxPaths[1].y;
96
- }
97
- // Calculate border length
98
- let length;
99
- if (side === 0 || side === 2) {
100
- length = Math.abs(startX - endX);
101
- }
102
- else {
103
- length = Math.abs(startY - endY);
104
- }
105
- this.ctx.beginPath();
106
- if (style === 3 /* BORDER_STYLE.DOTTED */) {
107
- this.pathCallbacks.formatPath(strokePaths);
108
- }
109
- else {
110
- this.pathCallbacks.formatPath(boxPaths.slice(0, 2));
111
- }
112
- // Calculate dash and space lengths
113
- let dashLength = width < 3 ? width * 3 : width * 2;
114
- let spaceLength = width < 3 ? width * 2 : width;
115
- if (style === 3 /* BORDER_STYLE.DOTTED */) {
116
- dashLength = width;
117
- spaceLength = width;
118
- }
119
- // Adjust dash pattern for border length
120
- let useLineDash = true;
121
- if (length <= dashLength * 2) {
122
- useLineDash = false;
123
- }
124
- else if (length <= dashLength * 2 + spaceLength) {
125
- const multiplier = length / (2 * dashLength + spaceLength);
126
- dashLength *= multiplier;
127
- spaceLength *= multiplier;
128
- }
129
- else {
130
- const numberOfDashes = Math.floor((length + spaceLength) / (dashLength + spaceLength));
131
- const minSpace = (length - numberOfDashes * dashLength) / (numberOfDashes - 1);
132
- const maxSpace = (length - (numberOfDashes + 1) * dashLength) / numberOfDashes;
133
- spaceLength =
134
- maxSpace <= 0 || Math.abs(spaceLength - minSpace) < Math.abs(spaceLength - maxSpace)
135
- ? minSpace
136
- : maxSpace;
137
- }
138
- // Apply line dash pattern
139
- if (useLineDash) {
140
- if (style === 3 /* BORDER_STYLE.DOTTED */) {
141
- this.ctx.setLineDash([0, dashLength + spaceLength]);
142
- }
143
- else {
144
- this.ctx.setLineDash([dashLength, spaceLength]);
145
- }
146
- }
147
- // Set line style and stroke
148
- if (style === 3 /* BORDER_STYLE.DOTTED */) {
149
- this.ctx.lineCap = 'round';
150
- this.ctx.lineWidth = width;
151
- }
152
- else {
153
- this.ctx.lineWidth = width * 2 + 1.1;
154
- }
155
- this.ctx.strokeStyle = (0, color_utilities_1.asString)(color);
156
- this.ctx.stroke();
157
- this.ctx.setLineDash([]);
158
- // Fill dashed round edge gaps
159
- if (style === 2 /* BORDER_STYLE.DASHED */) {
160
- if ((0, bezier_curve_1.isBezierCurve)(boxPaths[0])) {
161
- const path1 = boxPaths[3];
162
- const path2 = boxPaths[0];
163
- this.ctx.beginPath();
164
- this.pathCallbacks.formatPath([
165
- new vector_1.Vector(path1.end.x, path1.end.y),
166
- new vector_1.Vector(path2.start.x, path2.start.y)
167
- ]);
168
- this.ctx.stroke();
169
- }
170
- if ((0, bezier_curve_1.isBezierCurve)(boxPaths[1])) {
171
- const path1 = boxPaths[1];
172
- const path2 = boxPaths[2];
173
- this.ctx.beginPath();
174
- this.pathCallbacks.formatPath([
175
- new vector_1.Vector(path1.end.x, path1.end.y),
176
- new vector_1.Vector(path2.start.x, path2.start.y)
177
- ]);
178
- this.ctx.stroke();
179
- }
180
- }
181
- this.ctx.restore();
182
- }
183
- }
184
- exports.BorderRenderer = BorderRenderer;
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.spreadShadowPath = exports.shadowRadius = void 0;
4
- const bezier_curve_1 = require("../bezier-curve");
5
- const vector_1 = require("../vector");
6
- // CSS Backgrounds 3, 6.1.1: growing a small corner needs the cubic adjustment
7
- // to approach a square continuously as the original radius approaches zero.
8
- const shadowRadius = (radius, spread) => {
9
- const delta = spread > radius ? spread * (1 + Math.pow(radius / spread - 1, 3)) : spread;
10
- return Math.max(0, radius + delta);
11
- };
12
- exports.shadowRadius = shadowRadius;
13
- // Input is the four clockwise border/padding corner segments from BoundCurves.
14
- // Translation alone preserves the old radii and turns a spread circle into a
15
- // rounded square. Resize each quarter ellipse around its box corner instead.
16
- const spreadShadowPath = (paths, spread) => {
17
- if (spread === 0)
18
- return paths;
19
- const corners = paths.map((point, index) => {
20
- if (!(0, bezier_curve_1.isBezierCurve)(point))
21
- return { x: point.x, y: point.y, rx: 0, ry: 0 };
22
- return {
23
- x: index % 2 === 0 ? point.start.x : point.end.x,
24
- y: index % 2 === 0 ? point.end.y : point.start.y,
25
- rx: Math.abs(point.end.x - point.start.x),
26
- ry: Math.abs(point.end.y - point.start.y)
27
- };
28
- });
29
- const width = corners[1].x - corners[0].x + 2 * spread;
30
- const height = corners[3].y - corners[0].y + 2 * spread;
31
- if (width <= 0 || height <= 0)
32
- return [];
33
- const radii = corners.map((c) => ({ x: (0, exports.shadowRadius)(c.rx, spread), y: (0, exports.shadowRadius)(c.ry, spread) }));
34
- const ratio = (size, sum) => (sum > 0 ? size / sum : 1);
35
- const factor = Math.min(1, ratio(width, radii[0].x + radii[1].x), ratio(width, radii[3].x + radii[2].x), ratio(height, radii[0].y + radii[3].y), ratio(height, radii[1].y + radii[2].y));
36
- return paths.map((point, index) => {
37
- const corner = corners[index];
38
- const x = corner.x + (index === 1 || index === 2 ? spread : -spread);
39
- const y = corner.y + (index >= 2 ? spread : -spread);
40
- if (!(0, bezier_curve_1.isBezierCurve)(point))
41
- return new vector_1.Vector(x, y);
42
- const rx = radii[index].x * factor;
43
- const ry = radii[index].y * factor;
44
- if (!rx || !ry)
45
- return new vector_1.Vector(x, y);
46
- const sx = rx / corner.rx;
47
- const sy = ry / corner.ry;
48
- const resize = (v) => new vector_1.Vector(x + (v.x - corner.x) * sx, y + (v.y - corner.y) * sy);
49
- return new bezier_curve_1.BezierCurve(resize(point.start), resize(point.startControl), resize(point.endControl), resize(point.end));
50
- });
51
- };
52
- exports.spreadShadowPath = spreadShadowPath;
@@ -1,194 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.paintBoxShadow = void 0;
4
- const color_utilities_1 = require("../../css/types/color-utilities");
5
- const constants_1 = require("../../core/constants");
6
- const bound_curves_1 = require("../bound-curves");
7
- const box_sizing_1 = require("../box-sizing");
8
- const path_1 = require("../path");
9
- const canvas_path_1 = require("./canvas-path");
10
- const filter_surface_1 = require("./filter-surface");
11
- const surface_bounds_1 = require("./surface-bounds");
12
- const box_shadow_geometry_1 = require("./box-shadow-geometry");
13
- const box_shadow_transform_1 = require("./box-shadow-transform");
14
- // Separate closed subpaths plus even-odd filling avoid reversing only the order
15
- // of corner Beziers, which does not reverse the curves themselves.
16
- const complement = (ctx, rect, hole) => {
17
- ctx.beginPath();
18
- ctx.rect(rect.left, rect.top, rect.width, rect.height);
19
- if (hole.length) {
20
- (0, canvas_path_1.formatCanvasPath)(ctx, hole);
21
- ctx.closePath();
22
- }
23
- };
24
- const insetHole = (paint, shadow) => {
25
- const spread = shadow.spread.number;
26
- const box = (0, box_sizing_1.paddingBox)(paint.container);
27
- if (box.width - 2 * spread <= 0 || box.height - 2 * spread <= 0)
28
- return [];
29
- return (0, box_shadow_geometry_1.spreadShadowPath)((0, bound_curves_1.calculatePaddingBoxPath)(paint.curves), -spread);
30
- };
31
- // Rasterize in local coordinates, blur once, and then let the destination CTM
32
- // transform the complete shadow. This also preserves anisotropic/sheared blur.
33
- const paintShadowSurface = async (ctx, paint, shadow, options, budget, space) => {
34
- const padding = (0, box_sizing_1.paddingBox)(paint.container);
35
- const blur = shadow.blur.number / 2;
36
- const margin = Math.ceil(3 * blur) + 2;
37
- const spread = shadow.spread.number;
38
- const area = shadow.inset
39
- ? padding
40
- : paint.container.bounds.add(shadow.offsetX.number - spread, shadow.offsetY.number - spread, 2 * spread, 2 * spread);
41
- const bounds = (0, surface_bounds_1.cropSurface)(area.add(-margin, -margin, 2 * margin, 2 * margin), space.viewport, margin, space.scale);
42
- if (!bounds.width || !bounds.height)
43
- return true;
44
- const width = Math.ceil(bounds.width * space.scale);
45
- const height = Math.ceil(bounds.height * space.scale);
46
- const reserved = (0, surface_bounds_1.reserveSurface)(budget, width, height);
47
- if (!reserved)
48
- return false;
49
- let source;
50
- let filtered;
51
- try {
52
- source = ctx.canvas.ownerDocument.createElement('canvas');
53
- source.width = width;
54
- source.height = height;
55
- const sourceCtx = source.getContext('2d');
56
- if (!sourceCtx)
57
- return false;
58
- sourceCtx.scale(space.scale, space.scale);
59
- sourceCtx.translate(-bounds.left, -bounds.top);
60
- const silhouette = shadow.inset
61
- ? insetHole(paint, shadow)
62
- : (0, box_shadow_geometry_1.spreadShadowPath)((0, bound_curves_1.calculateBorderBoxPath)(paint.curves), spread);
63
- const path = (0, path_1.transformPath)(silhouette, shadow.offsetX.number, shadow.offsetY.number, 0, 0);
64
- if (shadow.inset)
65
- complement(sourceCtx, bounds, path);
66
- else
67
- (0, canvas_path_1.createCanvasPath)(sourceCtx, path);
68
- sourceCtx.fillStyle = (0, color_utilities_1.asString)(shadow.color);
69
- sourceCtx.fill(shadow.inset ? 'evenodd' : 'nonzero');
70
- filtered = await (0, filter_surface_1.renderFilterSurface)(source, { blur }, 1, space.scale, options.signal);
71
- ctx.save();
72
- try {
73
- if (shadow.inset) {
74
- (0, canvas_path_1.createCanvasPath)(ctx, (0, bound_curves_1.calculatePaddingBoxPath)(paint.curves));
75
- ctx.clip();
76
- }
77
- else {
78
- complement(ctx, space.viewport, (0, bound_curves_1.calculateBorderBoxPath)(paint.curves));
79
- ctx.clip('evenodd');
80
- }
81
- ctx.drawImage(filtered, bounds.left, bounds.top, filtered.width / space.scale, filtered.height / space.scale);
82
- }
83
- finally {
84
- ctx.restore();
85
- }
86
- return true;
87
- }
88
- catch (error) {
89
- if (!(error instanceof filter_surface_1.FilterSurfaceError))
90
- throw error;
91
- return false;
92
- }
93
- finally {
94
- if (filtered && filtered !== source)
95
- (0, filter_surface_1.releaseSurface)(filtered);
96
- if (source)
97
- (0, filter_surface_1.releaseSurface)(source);
98
- budget.pixels -= reserved;
99
- }
100
- };
101
- const paintBoxShadow = async (ctx, paint, shadow, options, budget) => {
102
- if (options.signal?.aborted)
103
- throw new DOMException('The operation was aborted.', 'AbortError');
104
- if ((0, color_utilities_1.isTransparent)(shadow.color))
105
- return;
106
- const spread = shadow.spread.number;
107
- if (!shadow.inset &&
108
- (paint.container.bounds.width + 2 * spread <= 0 || paint.container.bounds.height + 2 * spread <= 0))
109
- return;
110
- // getTransform includes capture scale, CSS transforms and their origins.
111
- // Without it the CTM is unknown: approximate it with the capture transform
112
- // and only ever move the mask relative to the real CTM (see below).
113
- const knownTransform = typeof ctx.getTransform === 'function';
114
- const matrix = knownTransform
115
- ? ctx.getTransform()
116
- : {
117
- a: options.scale,
118
- b: 0,
119
- c: 0,
120
- d: options.scale,
121
- e: -options.x * options.scale,
122
- f: -options.y * options.scale
123
- };
124
- const space = (0, box_shadow_transform_1.shadowSpace)(matrix, ctx.canvas.width, ctx.canvas.height);
125
- // Singular transforms have zero painted area; never attempt to invert them.
126
- if (!space)
127
- return;
128
- const { viewport } = space;
129
- if (shadow.blur.number > 0 &&
130
- (shadow.inset || !space.uniform) &&
131
- (await paintShadowSurface(ctx, paint, shadow, options, budget, space)))
132
- return;
133
- const padding = (0, box_sizing_1.paddingBox)(paint.container);
134
- ctx.save();
135
- try {
136
- if (shadow.inset && shadow.blur.number === 0) {
137
- (0, canvas_path_1.createCanvasPath)(ctx, (0, bound_curves_1.calculatePaddingBoxPath)(paint.curves));
138
- ctx.clip();
139
- complement(ctx, padding, (0, path_1.transformPath)(insetHole(paint, shadow), shadow.offsetX.number, shadow.offsetY.number, 0, 0));
140
- ctx.fillStyle = (0, color_utilities_1.asString)(shadow.color);
141
- ctx.fill('evenodd');
142
- return;
143
- }
144
- const margin = Math.ceil(shadow.blur.number * 2 +
145
- Math.abs(spread) +
146
- Math.abs(shadow.offsetX.number) +
147
- Math.abs(shadow.offsetY.number)) + 2;
148
- // Displace in OUTPUT pixels, not along a CSS axis. A rotated or reflected
149
- // local x axis need not point off the left edge of the output bitmap.
150
- const sourceBounds = shadow.inset
151
- ? padding.add(-margin, -margin, 2 * margin, 2 * margin)
152
- : paint.container.bounds.add(-spread, -spread, 2 * spread, 2 * spread);
153
- const { a, b, c, d, e, f } = matrix;
154
- const right = sourceBounds.left + sourceBounds.width;
155
- const bottom = sourceBounds.top + sourceBounds.height;
156
- const maxX = Math.max(a * sourceBounds.left + c * sourceBounds.top + e, a * right + c * sourceBounds.top + e, a * right + c * bottom + e, a * sourceBounds.left + c * bottom + e);
157
- const displacement = Math.max(constants_1.SHADOW_MASK_OFFSET, maxX + margin * space.scale + 2);
158
- if (shadow.inset) {
159
- (0, canvas_path_1.createCanvasPath)(ctx, (0, bound_curves_1.calculatePaddingBoxPath)(paint.curves));
160
- ctx.clip();
161
- }
162
- else {
163
- complement(ctx, viewport, (0, bound_curves_1.calculateBorderBoxPath)(paint.curves));
164
- ctx.clip('evenodd');
165
- }
166
- // Current paths retain their device coordinates across transform changes.
167
- // setTransform with an approximate matrix would discard CSS transforms
168
- // on the real CTM, so the legacy path translates relative to it instead.
169
- if (knownTransform)
170
- ctx.setTransform(a, b, c, d, e - displacement, f);
171
- else
172
- ctx.translate(-displacement / a, 0);
173
- if (shadow.inset)
174
- complement(ctx, sourceBounds, insetHole(paint, shadow));
175
- else
176
- (0, canvas_path_1.createCanvasPath)(ctx, (0, box_shadow_geometry_1.spreadShadowPath)((0, bound_curves_1.calculateBorderBoxPath)(paint.curves), spread));
177
- if (knownTransform)
178
- ctx.setTransform(a, b, c, d, e, f);
179
- else
180
- ctx.translate(displacement / a, 0);
181
- ctx.shadowOffsetX = displacement + a * shadow.offsetX.number + c * shadow.offsetY.number;
182
- ctx.shadowOffsetY = b * shadow.offsetX.number + d * shadow.offsetY.number;
183
- // Allocation/filter-failure fallback remains bounded-memory. Its blur is
184
- // isotropic under nonuniform transforms, but positioning stays correct.
185
- ctx.shadowBlur = shadow.blur.number * space.scale;
186
- ctx.shadowColor = (0, color_utilities_1.asString)(shadow.color);
187
- ctx.fillStyle = 'rgb(0, 0, 0)';
188
- ctx.fill(shadow.inset ? 'evenodd' : 'nonzero');
189
- }
190
- finally {
191
- ctx.restore();
192
- }
193
- };
194
- exports.paintBoxShadow = paintBoxShadow;
@@ -1,42 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.shadowSpace = void 0;
4
- const bounds_1 = require("../../css/layout/bounds");
5
- // Map the output bitmap back into the current user space. Capture x/y are not
6
- // in this space once CSS transforms (including ancestor transforms) are active.
7
- // An AABB of all four inverse-transformed corners is conservative under rotation.
8
- const shadowSpace = (matrix, width, height) => {
9
- const { a, b, c, d, e, f } = matrix;
10
- if (![a, b, c, d, e, f, width, height].every(Number.isFinite))
11
- return null;
12
- const determinant = a * d - b * c;
13
- if (!Number.isFinite(determinant) || determinant === 0)
14
- return null;
15
- const inversePoint = (x, y) => ({
16
- x: (d * (x - e) - c * (y - f)) / determinant,
17
- y: (-b * (x - e) + a * (y - f)) / determinant
18
- });
19
- const corners = [inversePoint(0, 0), inversePoint(width, 0), inversePoint(width, height), inversePoint(0, height)];
20
- if (!corners.every((point) => Number.isFinite(point.x) && Number.isFinite(point.y)))
21
- return null;
22
- const left = Math.min(...corners.map((point) => point.x));
23
- const top = Math.min(...corners.map((point) => point.y));
24
- const right = Math.max(...corners.map((point) => point.x));
25
- const bottom = Math.max(...corners.map((point) => point.y));
26
- // Largest singular value: enough local raster resolution for either output
27
- // axis. A scalar Canvas shadow blur is exact only for similarity transforms.
28
- const xx = a * a + b * b;
29
- const yy = c * c + d * d;
30
- const xy = a * c + b * d;
31
- const scale = Math.sqrt((xx + yy + Math.hypot(xx - yy, 2 * xy)) / 2);
32
- if (!Number.isFinite(scale) || scale <= 0)
33
- return null;
34
- const tolerance = 1e-10 * Math.max(xx, yy);
35
- return {
36
- matrix,
37
- viewport: new bounds_1.Bounds(left, top, right - left, bottom - top),
38
- scale,
39
- uniform: Math.abs(xx - yy) <= tolerance && Math.abs(xy) <= tolerance
40
- };
41
- };
42
- exports.shadowSpace = shadowSpace;
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createCanvasPath = exports.formatCanvasPath = void 0;
4
- const bezier_curve_1 = require("../bezier-curve");
5
- const formatCanvasPath = (ctx, paths) => {
6
- paths.forEach((point, index) => {
7
- const start = (0, bezier_curve_1.isBezierCurve)(point) ? point.start : point;
8
- if (index === 0) {
9
- ctx.moveTo(start.x, start.y);
10
- }
11
- else {
12
- ctx.lineTo(start.x, start.y);
13
- }
14
- if ((0, bezier_curve_1.isBezierCurve)(point)) {
15
- ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);
16
- }
17
- });
18
- };
19
- exports.formatCanvasPath = formatCanvasPath;
20
- const createCanvasPath = (ctx, paths) => {
21
- ctx.beginPath();
22
- (0, exports.formatCanvasPath)(ctx, paths);
23
- ctx.closePath();
24
- };
25
- exports.createCanvasPath = createCanvasPath;