html2canvas-pro 2.0.4 → 2.1.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 (632) hide show
  1. package/README.md +8 -6
  2. package/dist/html2canvas-pro.esm.js +10018 -9922
  3. package/dist/html2canvas-pro.esm.js.map +1 -1
  4. package/dist/html2canvas-pro.js +10017 -9922
  5. package/dist/html2canvas-pro.js.map +1 -1
  6. package/dist/html2canvas-pro.min.js +5 -5
  7. package/dist/lib/config.js +3 -4
  8. package/dist/lib/core/bitwise.js +0 -1
  9. package/dist/lib/core/cache-storage.js +34 -48
  10. package/dist/lib/core/context.js +0 -1
  11. package/dist/lib/core/debugger.js +0 -1
  12. package/dist/lib/core/features.js +0 -1
  13. package/dist/lib/core/logger.js +0 -1
  14. package/dist/lib/core/origin-checker.js +0 -1
  15. package/dist/lib/core/performance-monitor.js +1 -24
  16. package/dist/lib/core/render-element.js +210 -0
  17. package/dist/lib/core/util.js +0 -1
  18. package/dist/lib/core/validator.js +0 -1
  19. package/dist/lib/css/index.js +149 -90
  20. package/dist/lib/css/layout/bounds.js +0 -1
  21. package/dist/lib/css/layout/text.js +0 -1
  22. package/dist/lib/css/{ITypeDescriptor.js → property-descriptor.js} +0 -1
  23. package/dist/lib/css/property-descriptors/background-clip.js +0 -1
  24. package/dist/lib/css/property-descriptors/background-color.js +0 -1
  25. package/dist/lib/css/property-descriptors/background-image.js +0 -1
  26. package/dist/lib/css/property-descriptors/background-origin.js +0 -1
  27. package/dist/lib/css/property-descriptors/background-position.js +0 -1
  28. package/dist/lib/css/property-descriptors/background-repeat.js +0 -1
  29. package/dist/lib/css/property-descriptors/background-size.js +0 -1
  30. package/dist/lib/css/property-descriptors/border-color.js +0 -1
  31. package/dist/lib/css/property-descriptors/border-radius.js +0 -1
  32. package/dist/lib/css/property-descriptors/border-style.js +0 -1
  33. package/dist/lib/css/property-descriptors/border-width.js +0 -1
  34. package/dist/lib/css/property-descriptors/box-shadow.js +0 -1
  35. package/dist/lib/css/property-descriptors/clip-path.js +0 -1
  36. package/dist/lib/css/property-descriptors/color.js +0 -1
  37. package/dist/lib/css/property-descriptors/content.js +0 -1
  38. package/dist/lib/css/property-descriptors/counter-increment.js +0 -1
  39. package/dist/lib/css/property-descriptors/counter-reset.js +0 -1
  40. package/dist/lib/css/property-descriptors/direction.js +0 -1
  41. package/dist/lib/css/property-descriptors/display.js +0 -1
  42. package/dist/lib/css/property-descriptors/duration.js +0 -1
  43. package/dist/lib/css/property-descriptors/float.js +0 -1
  44. package/dist/lib/css/property-descriptors/font-family.js +0 -1
  45. package/dist/lib/css/property-descriptors/font-size.js +0 -1
  46. package/dist/lib/css/property-descriptors/font-style.js +0 -1
  47. package/dist/lib/css/property-descriptors/font-variant.js +0 -1
  48. package/dist/lib/css/property-descriptors/font-weight.js +0 -1
  49. package/dist/lib/css/property-descriptors/image-rendering.js +0 -1
  50. package/dist/lib/css/property-descriptors/letter-spacing.js +0 -1
  51. package/dist/lib/css/property-descriptors/line-break.js +0 -1
  52. package/dist/lib/css/property-descriptors/line-height.js +0 -1
  53. package/dist/lib/css/property-descriptors/list-style-image.js +0 -1
  54. package/dist/lib/css/property-descriptors/list-style-position.js +0 -1
  55. package/dist/lib/css/property-descriptors/list-style-type.js +0 -1
  56. package/dist/lib/css/property-descriptors/margin.js +0 -1
  57. package/dist/lib/css/property-descriptors/mix-blend-mode.js +31 -0
  58. package/dist/lib/css/property-descriptors/object-fit.js +0 -1
  59. package/dist/lib/css/property-descriptors/opacity.js +0 -1
  60. package/dist/lib/css/property-descriptors/overflow-wrap.js +0 -1
  61. package/dist/lib/css/property-descriptors/overflow.js +0 -1
  62. package/dist/lib/css/property-descriptors/padding.js +0 -1
  63. package/dist/lib/css/property-descriptors/paint-order.js +0 -1
  64. package/dist/lib/css/property-descriptors/position.js +0 -1
  65. package/dist/lib/css/property-descriptors/quotes.js +0 -1
  66. package/dist/lib/css/property-descriptors/rotate.js +0 -1
  67. package/dist/lib/css/property-descriptors/text-align.js +0 -1
  68. package/dist/lib/css/property-descriptors/text-decoration-color.js +0 -1
  69. package/dist/lib/css/property-descriptors/text-decoration-line.js +0 -1
  70. package/dist/lib/css/property-descriptors/text-decoration-style.js +0 -1
  71. package/dist/lib/css/property-descriptors/text-decoration-thickness.js +0 -1
  72. package/dist/lib/css/property-descriptors/text-overflow.js +0 -1
  73. package/dist/lib/css/property-descriptors/text-shadow.js +0 -1
  74. package/dist/lib/css/property-descriptors/text-transform.js +0 -1
  75. package/dist/lib/css/property-descriptors/text-underline-offset.js +0 -1
  76. package/dist/lib/css/property-descriptors/transform-origin.js +0 -1
  77. package/dist/lib/css/property-descriptors/transform.js +0 -1
  78. package/dist/lib/css/property-descriptors/visibility.js +0 -1
  79. package/dist/lib/css/property-descriptors/webkit-line-clamp.js +0 -1
  80. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js +0 -1
  81. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js +0 -1
  82. package/dist/lib/css/property-descriptors/word-break.js +0 -1
  83. package/dist/lib/css/property-descriptors/writing-mode.js +0 -1
  84. package/dist/lib/css/property-descriptors/z-index.js +0 -1
  85. package/dist/lib/css/syntax/parser.js +0 -1
  86. package/dist/lib/css/syntax/tokenizer.js +14 -1
  87. package/dist/lib/css/{IPropertyDescriptor.js → type-descriptor.js} +0 -1
  88. package/dist/lib/css/types/angle.js +0 -1
  89. package/dist/lib/css/types/color-math.js +0 -1
  90. package/dist/lib/css/types/color-spaces/a98.js +0 -1
  91. package/dist/lib/css/types/color-spaces/p3.js +0 -1
  92. package/dist/lib/css/types/color-spaces/pro-photo.js +0 -1
  93. package/dist/lib/css/types/color-spaces/rec2020.js +0 -1
  94. package/dist/lib/css/types/color-spaces/srgb.js +0 -1
  95. package/dist/lib/css/types/color-utilities.js +0 -1
  96. package/dist/lib/css/types/color.js +0 -1
  97. package/dist/lib/css/types/functions/-prefix-linear-gradient.js +0 -1
  98. package/dist/lib/css/types/functions/-prefix-radial-gradient.js +0 -1
  99. package/dist/lib/css/types/functions/-webkit-gradient.js +0 -1
  100. package/dist/lib/css/types/functions/counter.js +0 -1
  101. package/dist/lib/css/types/functions/gradient.js +0 -1
  102. package/dist/lib/css/types/functions/linear-gradient.js +0 -1
  103. package/dist/lib/css/types/functions/radial-gradient.js +0 -1
  104. package/dist/lib/css/types/image.js +0 -1
  105. package/dist/lib/css/types/index.js +0 -1
  106. package/dist/lib/css/types/length-percentage.js +0 -1
  107. package/dist/lib/css/types/length.js +0 -1
  108. package/dist/lib/css/types/time.js +0 -1
  109. package/dist/lib/dom/document-cloner.js +27 -22
  110. package/dist/lib/dom/dom-normalizer.js +0 -1
  111. package/dist/lib/dom/element-container.js +7 -6
  112. package/dist/lib/dom/elements/li-element-container.js +0 -1
  113. package/dist/lib/dom/elements/ol-element-container.js +0 -1
  114. package/dist/lib/dom/elements/select-element-container.js +0 -1
  115. package/dist/lib/dom/elements/textarea-element-container.js +0 -1
  116. package/dist/lib/dom/node-parser.js +37 -53
  117. package/dist/lib/dom/node-type-guards.js +62 -25
  118. package/dist/lib/dom/replaced-elements/canvas-element-container.js +0 -1
  119. package/dist/lib/dom/replaced-elements/iframe-element-container.js +0 -1
  120. package/dist/lib/dom/replaced-elements/image-element-container.js +0 -1
  121. package/dist/lib/dom/replaced-elements/index.js +0 -1
  122. package/dist/lib/dom/replaced-elements/input-element-container.js +0 -1
  123. package/dist/lib/dom/replaced-elements/pseudo-elements.js +0 -1
  124. package/dist/lib/dom/replaced-elements/svg-element-container.js +0 -1
  125. package/dist/lib/dom/text-container.js +0 -1
  126. package/dist/lib/index.js +32 -210
  127. package/dist/lib/invariant.js +0 -1
  128. package/dist/lib/options.js +2 -0
  129. package/dist/lib/render/background.js +0 -1
  130. package/dist/lib/render/bezier-curve.js +0 -1
  131. package/dist/lib/render/border.js +0 -1
  132. package/dist/lib/render/bound-curves.js +0 -1
  133. package/dist/lib/render/box-sizing.js +0 -1
  134. package/dist/lib/render/canvas/background-renderer.js +2 -24
  135. package/dist/lib/render/canvas/border-renderer.js +0 -1
  136. package/dist/lib/render/canvas/canvas-path.js +25 -0
  137. package/dist/lib/render/canvas/canvas-renderer.js +23 -96
  138. package/dist/lib/render/canvas/effects-renderer.js +3 -1
  139. package/dist/lib/render/canvas/foreignobject-renderer.js +8 -16
  140. package/dist/lib/render/canvas/text-renderer.js +61 -117
  141. package/dist/lib/render/effects.js +11 -2
  142. package/dist/lib/render/font-metrics.js +0 -1
  143. package/dist/lib/render/object-fit.js +87 -0
  144. package/dist/lib/render/path.js +0 -1
  145. package/dist/lib/render/renderer-interface.js +0 -1
  146. package/dist/lib/render/stacking-context.js +16 -8
  147. package/dist/lib/render/vector.js +0 -1
  148. package/dist/types/core/cache-storage.d.ts +5 -6
  149. package/dist/types/core/performance-monitor.d.ts +0 -11
  150. package/dist/types/core/render-element.d.ts +3 -0
  151. package/dist/types/css/index.d.ts +3 -0
  152. package/dist/types/css/property-descriptors/background-clip.d.ts +1 -1
  153. package/dist/types/css/property-descriptors/background-color.d.ts +1 -1
  154. package/dist/types/css/property-descriptors/background-image.d.ts +1 -1
  155. package/dist/types/css/property-descriptors/background-origin.d.ts +1 -1
  156. package/dist/types/css/property-descriptors/background-position.d.ts +1 -1
  157. package/dist/types/css/property-descriptors/background-repeat.d.ts +1 -1
  158. package/dist/types/css/property-descriptors/background-size.d.ts +1 -1
  159. package/dist/types/css/property-descriptors/border-color.d.ts +1 -1
  160. package/dist/types/css/property-descriptors/border-radius.d.ts +1 -1
  161. package/dist/types/css/property-descriptors/border-style.d.ts +1 -1
  162. package/dist/types/css/property-descriptors/border-width.d.ts +1 -1
  163. package/dist/types/css/property-descriptors/box-shadow.d.ts +1 -1
  164. package/dist/types/css/property-descriptors/clip-path.d.ts +1 -1
  165. package/dist/types/css/property-descriptors/color.d.ts +1 -1
  166. package/dist/types/css/property-descriptors/content.d.ts +1 -1
  167. package/dist/types/css/property-descriptors/counter-increment.d.ts +1 -1
  168. package/dist/types/css/property-descriptors/counter-reset.d.ts +1 -1
  169. package/dist/types/css/property-descriptors/direction.d.ts +1 -1
  170. package/dist/types/css/property-descriptors/display.d.ts +1 -1
  171. package/dist/types/css/property-descriptors/duration.d.ts +1 -1
  172. package/dist/types/css/property-descriptors/float.d.ts +1 -1
  173. package/dist/types/css/property-descriptors/font-family.d.ts +1 -1
  174. package/dist/types/css/property-descriptors/font-size.d.ts +1 -1
  175. package/dist/types/css/property-descriptors/font-style.d.ts +1 -1
  176. package/dist/types/css/property-descriptors/font-variant.d.ts +1 -1
  177. package/dist/types/css/property-descriptors/font-weight.d.ts +1 -1
  178. package/dist/types/css/property-descriptors/image-rendering.d.ts +1 -1
  179. package/dist/types/css/property-descriptors/letter-spacing.d.ts +1 -1
  180. package/dist/types/css/property-descriptors/line-break.d.ts +1 -1
  181. package/dist/types/css/property-descriptors/line-height.d.ts +1 -1
  182. package/dist/types/css/property-descriptors/list-style-image.d.ts +1 -1
  183. package/dist/types/css/property-descriptors/list-style-position.d.ts +1 -1
  184. package/dist/types/css/property-descriptors/list-style-type.d.ts +1 -1
  185. package/dist/types/css/property-descriptors/margin.d.ts +1 -1
  186. package/dist/types/css/property-descriptors/mix-blend-mode.d.ts +21 -0
  187. package/dist/types/css/property-descriptors/object-fit.d.ts +1 -1
  188. package/dist/types/css/property-descriptors/opacity.d.ts +1 -1
  189. package/dist/types/css/property-descriptors/overflow-wrap.d.ts +1 -1
  190. package/dist/types/css/property-descriptors/overflow.d.ts +1 -1
  191. package/dist/types/css/property-descriptors/padding.d.ts +1 -1
  192. package/dist/types/css/property-descriptors/paint-order.d.ts +1 -1
  193. package/dist/types/css/property-descriptors/position.d.ts +1 -1
  194. package/dist/types/css/property-descriptors/quotes.d.ts +1 -1
  195. package/dist/types/css/property-descriptors/rotate.d.ts +1 -1
  196. package/dist/types/css/property-descriptors/text-align.d.ts +1 -1
  197. package/dist/types/css/property-descriptors/text-decoration-color.d.ts +1 -1
  198. package/dist/types/css/property-descriptors/text-decoration-line.d.ts +1 -1
  199. package/dist/types/css/property-descriptors/text-decoration-style.d.ts +1 -1
  200. package/dist/types/css/property-descriptors/text-decoration-thickness.d.ts +1 -1
  201. package/dist/types/css/property-descriptors/text-overflow.d.ts +1 -1
  202. package/dist/types/css/property-descriptors/text-shadow.d.ts +1 -1
  203. package/dist/types/css/property-descriptors/text-transform.d.ts +1 -1
  204. package/dist/types/css/property-descriptors/text-underline-offset.d.ts +1 -1
  205. package/dist/types/css/property-descriptors/transform-origin.d.ts +1 -1
  206. package/dist/types/css/property-descriptors/transform.d.ts +1 -1
  207. package/dist/types/css/property-descriptors/visibility.d.ts +1 -1
  208. package/dist/types/css/property-descriptors/webkit-line-clamp.d.ts +1 -1
  209. package/dist/types/css/property-descriptors/webkit-text-stroke-color.d.ts +1 -1
  210. package/dist/types/css/property-descriptors/webkit-text-stroke-width.d.ts +1 -1
  211. package/dist/types/css/property-descriptors/word-break.d.ts +1 -1
  212. package/dist/types/css/property-descriptors/writing-mode.d.ts +1 -1
  213. package/dist/types/css/property-descriptors/z-index.d.ts +1 -1
  214. package/dist/types/css/syntax/tokenizer.d.ts +5 -0
  215. package/dist/types/css/types/angle.d.ts +1 -1
  216. package/dist/types/css/types/color.d.ts +1 -1
  217. package/dist/types/css/types/image.d.ts +1 -1
  218. package/dist/types/css/types/time.d.ts +1 -1
  219. package/dist/types/dom/element-container.d.ts +4 -11
  220. package/dist/types/dom/node-parser.d.ts +2 -15
  221. package/dist/types/dom/node-type-guards.d.ts +21 -22
  222. package/dist/types/index.d.ts +28 -48
  223. package/dist/types/options.d.ts +51 -0
  224. package/dist/types/render/canvas/background-renderer.d.ts +0 -6
  225. package/dist/types/render/canvas/canvas-path.d.ts +3 -0
  226. package/dist/types/render/canvas/canvas-renderer.d.ts +4 -2
  227. package/dist/types/render/canvas/foreignobject-renderer.d.ts +2 -3
  228. package/dist/types/render/canvas/text-renderer.d.ts +5 -0
  229. package/dist/types/render/effects.d.ts +9 -1
  230. package/dist/types/render/object-fit.d.ts +18 -0
  231. package/package.json +43 -35
  232. package/src/__tests__/index.ts +99 -0
  233. package/src/config.ts +107 -0
  234. package/src/core/__mocks__/cache-storage.ts +1 -0
  235. package/src/core/__mocks__/context.ts +19 -0
  236. package/{dist/lib/core/__mocks__/features.js → src/core/__mocks__/features.ts} +1 -5
  237. package/src/core/__mocks__/logger.ts +17 -0
  238. package/{dist/lib/core/__tests__/cache-storage.test.js → src/core/__tests__/cache-storage.test.ts} +95 -48
  239. package/{dist/lib/core/__tests__/cache-storage.js → src/core/__tests__/cache-storage.ts} +117 -64
  240. package/{dist/lib/core/__tests__/logger.js → src/core/__tests__/logger.ts} +10 -8
  241. package/{dist/lib/core/__tests__/validator.js → src/core/__tests__/validator.ts} +161 -98
  242. package/src/core/bitwise.ts +1 -0
  243. package/src/core/cache-storage.ts +315 -0
  244. package/src/core/context.ts +31 -0
  245. package/src/core/debugger.ts +32 -0
  246. package/src/core/features.ts +222 -0
  247. package/src/core/logger.ts +64 -0
  248. package/src/core/origin-checker.ts +57 -0
  249. package/src/core/performance-monitor.ts +241 -0
  250. package/src/core/render-element.ts +272 -0
  251. package/src/core/util.ts +1 -0
  252. package/src/core/validator.ts +593 -0
  253. package/src/css/index.ts +427 -0
  254. package/src/css/layout/__mocks__/bounds.ts +6 -0
  255. package/src/css/layout/bounds.ts +79 -0
  256. package/src/css/layout/text.ts +161 -0
  257. package/src/css/property-descriptor.ts +49 -0
  258. package/src/css/property-descriptors/__tests__/background-tests.ts +65 -0
  259. package/src/css/property-descriptors/__tests__/clip-path.test.ts +280 -0
  260. package/src/css/property-descriptors/__tests__/font-family.ts +25 -0
  261. package/src/css/property-descriptors/__tests__/image-rendering-integration.test.ts +153 -0
  262. package/{dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js → src/css/property-descriptors/__tests__/image-rendering-performance.test.ts} +74 -66
  263. package/src/css/property-descriptors/__tests__/image-rendering.test.ts +72 -0
  264. package/src/css/property-descriptors/__tests__/paint-order.ts +87 -0
  265. package/src/css/property-descriptors/__tests__/text-shadow.ts +94 -0
  266. package/src/css/property-descriptors/__tests__/transform-tests.ts +18 -0
  267. package/src/css/property-descriptors/background-clip.ts +30 -0
  268. package/src/css/property-descriptors/background-color.ts +9 -0
  269. package/src/css/property-descriptors/background-image.ts +27 -0
  270. package/src/css/property-descriptors/background-origin.ts +31 -0
  271. package/src/css/property-descriptors/background-position.ts +38 -0
  272. package/src/css/property-descriptors/background-repeat.ts +44 -0
  273. package/src/css/property-descriptors/background-size.ts +27 -0
  274. package/src/css/property-descriptors/border-color.ts +13 -0
  275. package/src/css/property-descriptors/border-radius.ts +19 -0
  276. package/src/css/property-descriptors/border-style.ts +34 -0
  277. package/src/css/property-descriptors/border-width.ts +20 -0
  278. package/src/css/property-descriptors/box-shadow.ts +60 -0
  279. package/src/css/property-descriptors/clip-path.ts +271 -0
  280. package/src/css/property-descriptors/color.ts +9 -0
  281. package/src/css/property-descriptors/content.ts +26 -0
  282. package/src/css/property-descriptors/counter-increment.ts +43 -0
  283. package/src/css/property-descriptors/counter-reset.ts +36 -0
  284. package/src/css/property-descriptors/direction.ts +23 -0
  285. package/src/css/property-descriptors/display.ts +117 -0
  286. package/src/css/property-descriptors/duration.ts +14 -0
  287. package/src/css/property-descriptors/float.ts +29 -0
  288. package/src/css/property-descriptors/font-family.ts +38 -0
  289. package/src/css/property-descriptors/font-size.ts +9 -0
  290. package/src/css/property-descriptors/font-style.ts +25 -0
  291. package/src/css/property-descriptors/font-variant.ts +12 -0
  292. package/src/css/property-descriptors/font-weight.ts +26 -0
  293. package/src/css/property-descriptors/image-rendering.ts +33 -0
  294. package/src/css/property-descriptors/letter-spacing.ts +25 -0
  295. package/src/css/property-descriptors/line-break.ts +22 -0
  296. package/src/css/property-descriptors/line-height.ts +22 -0
  297. package/src/css/property-descriptors/list-style-image.ts +19 -0
  298. package/src/css/property-descriptors/list-style-position.ts +22 -0
  299. package/src/css/property-descriptors/list-style-type.ts +179 -0
  300. package/src/css/property-descriptors/margin.ts +13 -0
  301. package/src/css/property-descriptors/mix-blend-mode.ts +35 -0
  302. package/src/css/property-descriptors/object-fit.ts +39 -0
  303. package/src/css/property-descriptors/opacity.ts +15 -0
  304. package/src/css/property-descriptors/overflow-wrap.ts +22 -0
  305. package/src/css/property-descriptors/overflow.ts +34 -0
  306. package/src/css/property-descriptors/padding.ts +14 -0
  307. package/src/css/property-descriptors/paint-order.ts +42 -0
  308. package/src/css/property-descriptors/position.ts +30 -0
  309. package/src/css/property-descriptors/quotes.ts +57 -0
  310. package/src/css/property-descriptors/rotate.ts +34 -0
  311. package/src/css/property-descriptors/text-align.ts +26 -0
  312. package/src/css/property-descriptors/text-decoration-color.ts +9 -0
  313. package/src/css/property-descriptors/text-decoration-line.ts +38 -0
  314. package/src/css/property-descriptors/text-decoration-style.ts +32 -0
  315. package/src/css/property-descriptors/text-decoration-thickness.ts +30 -0
  316. package/src/css/property-descriptors/text-overflow.ts +23 -0
  317. package/src/css/property-descriptors/text-shadow.ts +52 -0
  318. package/src/css/property-descriptors/text-transform.ts +27 -0
  319. package/src/css/property-descriptors/text-underline-offset.ts +27 -0
  320. package/src/css/property-descriptors/transform-origin.ts +29 -0
  321. package/src/css/property-descriptors/transform.ts +74 -0
  322. package/src/css/property-descriptors/visibility.ts +25 -0
  323. package/src/css/property-descriptors/webkit-line-clamp.ts +30 -0
  324. package/src/css/property-descriptors/webkit-text-stroke-color.ts +8 -0
  325. package/src/css/property-descriptors/webkit-text-stroke-width.ts +15 -0
  326. package/src/css/property-descriptors/word-break.ts +25 -0
  327. package/src/css/property-descriptors/writing-mode.ts +37 -0
  328. package/src/css/property-descriptors/z-index.ts +27 -0
  329. package/src/css/syntax/__tests__/tokernizer-tests.ts +29 -0
  330. package/src/css/syntax/parser.ts +188 -0
  331. package/src/css/syntax/tokenizer.ts +822 -0
  332. package/src/css/type-descriptor.ts +7 -0
  333. package/src/css/types/__tests__/color-tests.ts +147 -0
  334. package/src/css/types/__tests__/image-tests.ts +239 -0
  335. package/src/css/types/angle.ts +86 -0
  336. package/src/css/types/color-math.ts +22 -0
  337. package/src/css/types/color-spaces/a98.ts +86 -0
  338. package/src/css/types/color-spaces/p3.ts +92 -0
  339. package/src/css/types/color-spaces/pro-photo.ts +87 -0
  340. package/src/css/types/color-spaces/rec2020.ts +90 -0
  341. package/src/css/types/color-spaces/srgb.ts +87 -0
  342. package/src/css/types/color-utilities.ts +452 -0
  343. package/src/css/types/color.ts +485 -0
  344. package/src/css/types/functions/-prefix-linear-gradient.ts +35 -0
  345. package/src/css/types/functions/-prefix-radial-gradient.ts +106 -0
  346. package/src/css/types/functions/-webkit-gradient.ts +69 -0
  347. package/src/css/types/functions/__tests__/radial-gradient.ts +69 -0
  348. package/src/css/types/functions/counter.ts +511 -0
  349. package/src/css/types/functions/gradient.ts +206 -0
  350. package/src/css/types/functions/linear-gradient.ts +28 -0
  351. package/src/css/types/functions/radial-gradient.ts +101 -0
  352. package/src/css/types/image.ts +120 -0
  353. package/src/css/types/index.ts +1 -0
  354. package/src/css/types/length-percentage.ts +137 -0
  355. package/src/css/types/length.ts +7 -0
  356. package/src/css/types/time.ts +20 -0
  357. package/src/dom/__mocks__/document-cloner.ts +22 -0
  358. package/{dist/lib/dom/__tests__/dom-normalizer.test.js → src/dom/__tests__/dom-normalizer.test.ts} +64 -44
  359. package/src/dom/__tests__/element-container.test.ts +129 -0
  360. package/src/dom/document-cloner.ts +929 -0
  361. package/src/dom/dom-normalizer.ts +133 -0
  362. package/src/dom/element-container.ts +75 -0
  363. package/src/dom/elements/li-element-container.ts +10 -0
  364. package/src/dom/elements/ol-element-container.ts +12 -0
  365. package/src/dom/elements/select-element-container.ts +10 -0
  366. package/src/dom/elements/textarea-element-container.ts +9 -0
  367. package/src/dom/node-parser.ts +177 -0
  368. package/src/dom/node-type-guards.ts +70 -0
  369. package/src/dom/replaced-elements/canvas-element-container.ts +15 -0
  370. package/src/dom/replaced-elements/iframe-element-container.ts +55 -0
  371. package/src/dom/replaced-elements/image-element-container.ts +16 -0
  372. package/src/dom/replaced-elements/index.ts +5 -0
  373. package/src/dom/replaced-elements/input-element-container.ts +105 -0
  374. package/src/dom/replaced-elements/pseudo-elements.ts +0 -0
  375. package/src/dom/replaced-elements/svg-element-container.ts +23 -0
  376. package/src/dom/text-container.ts +42 -0
  377. package/src/global.d.ts +19 -0
  378. package/src/index.ts +82 -0
  379. package/src/invariant.ts +5 -0
  380. package/src/options.ts +55 -0
  381. package/src/render/__tests__/object-fit.test.ts +85 -0
  382. package/src/render/background.ts +298 -0
  383. package/src/render/bezier-curve.ts +47 -0
  384. package/src/render/border.ts +165 -0
  385. package/src/render/bound-curves.ts +388 -0
  386. package/src/render/box-sizing.ts +31 -0
  387. package/{dist/lib/render/canvas/__tests__/background-renderer.test.js → src/render/canvas/__tests__/background-renderer.test.ts} +32 -25
  388. package/src/render/canvas/__tests__/border-renderer.test.ts +24 -0
  389. package/src/render/canvas/__tests__/effects-renderer.test.ts +32 -0
  390. package/src/render/canvas/__tests__/text-renderer.test.ts +471 -0
  391. package/src/render/canvas/background-renderer.ts +271 -0
  392. package/src/render/canvas/border-renderer.ts +224 -0
  393. package/src/render/canvas/canvas-path.ts +31 -0
  394. package/src/render/canvas/canvas-renderer.ts +641 -0
  395. package/src/render/canvas/effects-renderer.ts +130 -0
  396. package/src/render/canvas/foreignobject-renderer.ts +53 -0
  397. package/src/render/canvas/text-renderer.ts +700 -0
  398. package/src/render/effects.ts +75 -0
  399. package/src/render/font-metrics.ts +72 -0
  400. package/src/render/object-fit.ts +100 -0
  401. package/src/render/path.ts +37 -0
  402. package/src/render/renderer-interface.ts +28 -0
  403. package/src/render/stacking-context.ts +386 -0
  404. package/src/render/vector.ts +19 -0
  405. package/demo/image-smoothing-demo.html +0 -256
  406. package/demo/refactoring-test.html +0 -602
  407. package/dist/lib/__tests__/index.js +0 -85
  408. package/dist/lib/__tests__/index.js.map +0 -1
  409. package/dist/lib/config.js.map +0 -1
  410. package/dist/lib/core/__mocks__/cache-storage.js +0 -7
  411. package/dist/lib/core/__mocks__/cache-storage.js.map +0 -1
  412. package/dist/lib/core/__mocks__/context.js +0 -19
  413. package/dist/lib/core/__mocks__/context.js.map +0 -1
  414. package/dist/lib/core/__mocks__/features.js.map +0 -1
  415. package/dist/lib/core/__mocks__/logger.js +0 -16
  416. package/dist/lib/core/__mocks__/logger.js.map +0 -1
  417. package/dist/lib/core/__tests__/cache-storage.js.map +0 -1
  418. package/dist/lib/core/__tests__/cache-storage.test.js.map +0 -1
  419. package/dist/lib/core/__tests__/logger.js.map +0 -1
  420. package/dist/lib/core/__tests__/validator.js.map +0 -1
  421. package/dist/lib/core/bitwise.js.map +0 -1
  422. package/dist/lib/core/cache-storage.js.map +0 -1
  423. package/dist/lib/core/context.js.map +0 -1
  424. package/dist/lib/core/debugger.js.map +0 -1
  425. package/dist/lib/core/features.js.map +0 -1
  426. package/dist/lib/core/logger.js.map +0 -1
  427. package/dist/lib/core/origin-checker.js.map +0 -1
  428. package/dist/lib/core/performance-monitor.js.map +0 -1
  429. package/dist/lib/core/util.js.map +0 -1
  430. package/dist/lib/core/validator.js.map +0 -1
  431. package/dist/lib/css/IPropertyDescriptor.js.map +0 -1
  432. package/dist/lib/css/ITypeDescriptor.js.map +0 -1
  433. package/dist/lib/css/index.js.map +0 -1
  434. package/dist/lib/css/layout/__mocks__/bounds.js +0 -9
  435. package/dist/lib/css/layout/__mocks__/bounds.js.map +0 -1
  436. package/dist/lib/css/layout/bounds.js.map +0 -1
  437. package/dist/lib/css/layout/text.js.map +0 -1
  438. package/dist/lib/css/property-descriptors/__tests__/background-tests.js +0 -49
  439. package/dist/lib/css/property-descriptors/__tests__/background-tests.js.map +0 -1
  440. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js +0 -273
  441. package/dist/lib/css/property-descriptors/__tests__/clip-path.test.js.map +0 -1
  442. package/dist/lib/css/property-descriptors/__tests__/font-family.js +0 -19
  443. package/dist/lib/css/property-descriptors/__tests__/font-family.js.map +0 -1
  444. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js +0 -143
  445. package/dist/lib/css/property-descriptors/__tests__/image-rendering-integration.test.js.map +0 -1
  446. package/dist/lib/css/property-descriptors/__tests__/image-rendering-performance.test.js.map +0 -1
  447. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js +0 -61
  448. package/dist/lib/css/property-descriptors/__tests__/image-rendering.test.js.map +0 -1
  449. package/dist/lib/css/property-descriptors/__tests__/paint-order.js +0 -66
  450. package/dist/lib/css/property-descriptors/__tests__/paint-order.js.map +0 -1
  451. package/dist/lib/css/property-descriptors/__tests__/text-shadow.js +0 -82
  452. package/dist/lib/css/property-descriptors/__tests__/text-shadow.js.map +0 -1
  453. package/dist/lib/css/property-descriptors/__tests__/transform-tests.js +0 -14
  454. package/dist/lib/css/property-descriptors/__tests__/transform-tests.js.map +0 -1
  455. package/dist/lib/css/property-descriptors/background-clip.js.map +0 -1
  456. package/dist/lib/css/property-descriptors/background-color.js.map +0 -1
  457. package/dist/lib/css/property-descriptors/background-image.js.map +0 -1
  458. package/dist/lib/css/property-descriptors/background-origin.js.map +0 -1
  459. package/dist/lib/css/property-descriptors/background-position.js.map +0 -1
  460. package/dist/lib/css/property-descriptors/background-repeat.js.map +0 -1
  461. package/dist/lib/css/property-descriptors/background-size.js.map +0 -1
  462. package/dist/lib/css/property-descriptors/border-color.js.map +0 -1
  463. package/dist/lib/css/property-descriptors/border-radius.js.map +0 -1
  464. package/dist/lib/css/property-descriptors/border-style.js.map +0 -1
  465. package/dist/lib/css/property-descriptors/border-width.js.map +0 -1
  466. package/dist/lib/css/property-descriptors/box-shadow.js.map +0 -1
  467. package/dist/lib/css/property-descriptors/clip-path.js.map +0 -1
  468. package/dist/lib/css/property-descriptors/color.js.map +0 -1
  469. package/dist/lib/css/property-descriptors/content.js.map +0 -1
  470. package/dist/lib/css/property-descriptors/counter-increment.js.map +0 -1
  471. package/dist/lib/css/property-descriptors/counter-reset.js.map +0 -1
  472. package/dist/lib/css/property-descriptors/direction.js.map +0 -1
  473. package/dist/lib/css/property-descriptors/display.js.map +0 -1
  474. package/dist/lib/css/property-descriptors/duration.js.map +0 -1
  475. package/dist/lib/css/property-descriptors/float.js.map +0 -1
  476. package/dist/lib/css/property-descriptors/font-family.js.map +0 -1
  477. package/dist/lib/css/property-descriptors/font-size.js.map +0 -1
  478. package/dist/lib/css/property-descriptors/font-style.js.map +0 -1
  479. package/dist/lib/css/property-descriptors/font-variant.js.map +0 -1
  480. package/dist/lib/css/property-descriptors/font-weight.js.map +0 -1
  481. package/dist/lib/css/property-descriptors/image-rendering.js.map +0 -1
  482. package/dist/lib/css/property-descriptors/letter-spacing.js.map +0 -1
  483. package/dist/lib/css/property-descriptors/line-break.js.map +0 -1
  484. package/dist/lib/css/property-descriptors/line-height.js.map +0 -1
  485. package/dist/lib/css/property-descriptors/list-style-image.js.map +0 -1
  486. package/dist/lib/css/property-descriptors/list-style-position.js.map +0 -1
  487. package/dist/lib/css/property-descriptors/list-style-type.js.map +0 -1
  488. package/dist/lib/css/property-descriptors/margin.js.map +0 -1
  489. package/dist/lib/css/property-descriptors/object-fit.js.map +0 -1
  490. package/dist/lib/css/property-descriptors/opacity.js.map +0 -1
  491. package/dist/lib/css/property-descriptors/overflow-wrap.js.map +0 -1
  492. package/dist/lib/css/property-descriptors/overflow.js.map +0 -1
  493. package/dist/lib/css/property-descriptors/padding.js.map +0 -1
  494. package/dist/lib/css/property-descriptors/paint-order.js.map +0 -1
  495. package/dist/lib/css/property-descriptors/position.js.map +0 -1
  496. package/dist/lib/css/property-descriptors/quotes.js.map +0 -1
  497. package/dist/lib/css/property-descriptors/rotate.js.map +0 -1
  498. package/dist/lib/css/property-descriptors/text-align.js.map +0 -1
  499. package/dist/lib/css/property-descriptors/text-decoration-color.js.map +0 -1
  500. package/dist/lib/css/property-descriptors/text-decoration-line.js.map +0 -1
  501. package/dist/lib/css/property-descriptors/text-decoration-style.js.map +0 -1
  502. package/dist/lib/css/property-descriptors/text-decoration-thickness.js.map +0 -1
  503. package/dist/lib/css/property-descriptors/text-overflow.js.map +0 -1
  504. package/dist/lib/css/property-descriptors/text-shadow.js.map +0 -1
  505. package/dist/lib/css/property-descriptors/text-transform.js.map +0 -1
  506. package/dist/lib/css/property-descriptors/text-underline-offset.js.map +0 -1
  507. package/dist/lib/css/property-descriptors/transform-origin.js.map +0 -1
  508. package/dist/lib/css/property-descriptors/transform.js.map +0 -1
  509. package/dist/lib/css/property-descriptors/visibility.js.map +0 -1
  510. package/dist/lib/css/property-descriptors/webkit-line-clamp.js.map +0 -1
  511. package/dist/lib/css/property-descriptors/webkit-text-stroke-color.js.map +0 -1
  512. package/dist/lib/css/property-descriptors/webkit-text-stroke-width.js.map +0 -1
  513. package/dist/lib/css/property-descriptors/word-break.js.map +0 -1
  514. package/dist/lib/css/property-descriptors/writing-mode.js.map +0 -1
  515. package/dist/lib/css/property-descriptors/z-index.js.map +0 -1
  516. package/dist/lib/css/syntax/__tests__/tokernizer-tests.js +0 -26
  517. package/dist/lib/css/syntax/__tests__/tokernizer-tests.js.map +0 -1
  518. package/dist/lib/css/syntax/parser.js.map +0 -1
  519. package/dist/lib/css/syntax/tokenizer.js.map +0 -1
  520. package/dist/lib/css/types/__tests__/color-tests.js +0 -111
  521. package/dist/lib/css/types/__tests__/color-tests.js.map +0 -1
  522. package/dist/lib/css/types/__tests__/image-tests.js +0 -215
  523. package/dist/lib/css/types/__tests__/image-tests.js.map +0 -1
  524. package/dist/lib/css/types/angle.js.map +0 -1
  525. package/dist/lib/css/types/color-math.js.map +0 -1
  526. package/dist/lib/css/types/color-spaces/a98.js.map +0 -1
  527. package/dist/lib/css/types/color-spaces/p3.js.map +0 -1
  528. package/dist/lib/css/types/color-spaces/pro-photo.js.map +0 -1
  529. package/dist/lib/css/types/color-spaces/rec2020.js.map +0 -1
  530. package/dist/lib/css/types/color-spaces/srgb.js.map +0 -1
  531. package/dist/lib/css/types/color-utilities.js.map +0 -1
  532. package/dist/lib/css/types/color.js.map +0 -1
  533. package/dist/lib/css/types/functions/-prefix-linear-gradient.js.map +0 -1
  534. package/dist/lib/css/types/functions/-prefix-radial-gradient.js.map +0 -1
  535. package/dist/lib/css/types/functions/-webkit-gradient.js.map +0 -1
  536. package/dist/lib/css/types/functions/__tests__/radial-gradient.js +0 -63
  537. package/dist/lib/css/types/functions/__tests__/radial-gradient.js.map +0 -1
  538. package/dist/lib/css/types/functions/counter.js.map +0 -1
  539. package/dist/lib/css/types/functions/gradient.js.map +0 -1
  540. package/dist/lib/css/types/functions/linear-gradient.js.map +0 -1
  541. package/dist/lib/css/types/functions/radial-gradient.js.map +0 -1
  542. package/dist/lib/css/types/image.js.map +0 -1
  543. package/dist/lib/css/types/index.js.map +0 -1
  544. package/dist/lib/css/types/length-percentage.js.map +0 -1
  545. package/dist/lib/css/types/length.js.map +0 -1
  546. package/dist/lib/css/types/time.js.map +0 -1
  547. package/dist/lib/dom/__mocks__/document-cloner.js +0 -23
  548. package/dist/lib/dom/__mocks__/document-cloner.js.map +0 -1
  549. package/dist/lib/dom/__tests__/dom-normalizer.test.js.map +0 -1
  550. package/dist/lib/dom/__tests__/element-container.test.js +0 -109
  551. package/dist/lib/dom/__tests__/element-container.test.js.map +0 -1
  552. package/dist/lib/dom/document-cloner.js.map +0 -1
  553. package/dist/lib/dom/dom-normalizer.js.map +0 -1
  554. package/dist/lib/dom/element-container.js.map +0 -1
  555. package/dist/lib/dom/elements/li-element-container.js.map +0 -1
  556. package/dist/lib/dom/elements/ol-element-container.js.map +0 -1
  557. package/dist/lib/dom/elements/select-element-container.js.map +0 -1
  558. package/dist/lib/dom/elements/textarea-element-container.js.map +0 -1
  559. package/dist/lib/dom/node-parser.js.map +0 -1
  560. package/dist/lib/dom/node-type-guards.js.map +0 -1
  561. package/dist/lib/dom/replaced-elements/canvas-element-container.js.map +0 -1
  562. package/dist/lib/dom/replaced-elements/iframe-element-container.js.map +0 -1
  563. package/dist/lib/dom/replaced-elements/image-element-container.js.map +0 -1
  564. package/dist/lib/dom/replaced-elements/index.js.map +0 -1
  565. package/dist/lib/dom/replaced-elements/input-element-container.js.map +0 -1
  566. package/dist/lib/dom/replaced-elements/pseudo-elements.js.map +0 -1
  567. package/dist/lib/dom/replaced-elements/svg-element-container.js.map +0 -1
  568. package/dist/lib/dom/text-container.js.map +0 -1
  569. package/dist/lib/index.js.map +0 -1
  570. package/dist/lib/invariant.js.map +0 -1
  571. package/dist/lib/render/background.js.map +0 -1
  572. package/dist/lib/render/bezier-curve.js.map +0 -1
  573. package/dist/lib/render/border.js.map +0 -1
  574. package/dist/lib/render/bound-curves.js.map +0 -1
  575. package/dist/lib/render/box-sizing.js.map +0 -1
  576. package/dist/lib/render/canvas/__tests__/background-renderer.test.js.map +0 -1
  577. package/dist/lib/render/canvas/__tests__/border-renderer.test.js +0 -23
  578. package/dist/lib/render/canvas/__tests__/border-renderer.test.js.map +0 -1
  579. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js +0 -30
  580. package/dist/lib/render/canvas/__tests__/effects-renderer.test.js.map +0 -1
  581. package/dist/lib/render/canvas/__tests__/text-renderer.test.js +0 -402
  582. package/dist/lib/render/canvas/__tests__/text-renderer.test.js.map +0 -1
  583. package/dist/lib/render/canvas/background-renderer.js.map +0 -1
  584. package/dist/lib/render/canvas/border-renderer.js.map +0 -1
  585. package/dist/lib/render/canvas/canvas-renderer.js.map +0 -1
  586. package/dist/lib/render/canvas/effects-renderer.js.map +0 -1
  587. package/dist/lib/render/canvas/foreignobject-renderer.js.map +0 -1
  588. package/dist/lib/render/canvas/text-renderer.js.map +0 -1
  589. package/dist/lib/render/effects.js.map +0 -1
  590. package/dist/lib/render/font-metrics.js.map +0 -1
  591. package/dist/lib/render/path.js.map +0 -1
  592. package/dist/lib/render/renderer-interface.js.map +0 -1
  593. package/dist/lib/render/renderer.js +0 -11
  594. package/dist/lib/render/renderer.js.map +0 -1
  595. package/dist/lib/render/stacking-context.js.map +0 -1
  596. package/dist/lib/render/vector.js.map +0 -1
  597. package/dist/types/__tests__/index.d.ts +0 -1
  598. package/dist/types/core/__mocks__/cache-storage.d.ts +0 -2
  599. package/dist/types/core/__mocks__/context.d.ts +0 -9
  600. package/dist/types/core/__mocks__/features.d.ts +0 -8
  601. package/dist/types/core/__mocks__/logger.d.ts +0 -9
  602. package/dist/types/core/__tests__/cache-storage.d.ts +0 -1
  603. package/dist/types/core/__tests__/cache-storage.test.d.ts +0 -1
  604. package/dist/types/core/__tests__/logger.d.ts +0 -1
  605. package/dist/types/core/__tests__/validator.d.ts +0 -1
  606. package/dist/types/css/layout/__mocks__/bounds.d.ts +0 -2
  607. package/dist/types/css/property-descriptors/__tests__/background-tests.d.ts +0 -1
  608. package/dist/types/css/property-descriptors/__tests__/clip-path.test.d.ts +0 -1
  609. package/dist/types/css/property-descriptors/__tests__/font-family.d.ts +0 -1
  610. package/dist/types/css/property-descriptors/__tests__/image-rendering-integration.test.d.ts +0 -1
  611. package/dist/types/css/property-descriptors/__tests__/image-rendering-performance.test.d.ts +0 -1
  612. package/dist/types/css/property-descriptors/__tests__/image-rendering.test.d.ts +0 -1
  613. package/dist/types/css/property-descriptors/__tests__/paint-order.d.ts +0 -1
  614. package/dist/types/css/property-descriptors/__tests__/text-shadow.d.ts +0 -1
  615. package/dist/types/css/property-descriptors/__tests__/transform-tests.d.ts +0 -1
  616. package/dist/types/css/syntax/__tests__/tokernizer-tests.d.ts +0 -1
  617. package/dist/types/css/types/__tests__/color-tests.d.ts +0 -1
  618. package/dist/types/css/types/__tests__/image-tests.d.ts +0 -1
  619. package/dist/types/css/types/functions/__tests__/radial-gradient.d.ts +0 -1
  620. package/dist/types/dom/__mocks__/document-cloner.d.ts +0 -6
  621. package/dist/types/dom/__tests__/dom-normalizer.test.d.ts +0 -1
  622. package/dist/types/dom/__tests__/element-container.test.d.ts +0 -1
  623. package/dist/types/render/canvas/__tests__/background-renderer.test.d.ts +0 -1
  624. package/dist/types/render/canvas/__tests__/border-renderer.test.d.ts +0 -1
  625. package/dist/types/render/canvas/__tests__/effects-renderer.test.d.ts +0 -1
  626. package/dist/types/render/canvas/__tests__/text-renderer.test.d.ts +0 -1
  627. package/dist/types/render/renderer.d.ts +0 -7
  628. package/eslint.config.js +0 -35
  629. package/jest.config.cjs +0 -5
  630. package/karma.conf.cjs +0 -300
  631. /package/dist/types/css/{IPropertyDescriptor.d.ts → property-descriptor.d.ts} +0 -0
  632. /package/dist/types/css/{ITypeDescriptor.d.ts → type-descriptor.d.ts} +0 -0
@@ -0,0 +1,427 @@
1
+ import { CSSPropertyDescriptor, PropertyDescriptorParsingType } from './property-descriptor';
2
+ import { backgroundClip } from './property-descriptors/background-clip';
3
+ import { backgroundColor } from './property-descriptors/background-color';
4
+ import { backgroundImage } from './property-descriptors/background-image';
5
+ import { backgroundOrigin } from './property-descriptors/background-origin';
6
+ import { backgroundPosition } from './property-descriptors/background-position';
7
+ import { backgroundRepeat } from './property-descriptors/background-repeat';
8
+ import { backgroundSize } from './property-descriptors/background-size';
9
+ import {
10
+ borderBottomColor,
11
+ borderLeftColor,
12
+ borderRightColor,
13
+ borderTopColor
14
+ } from './property-descriptors/border-color';
15
+ import {
16
+ borderBottomLeftRadius,
17
+ borderBottomRightRadius,
18
+ borderTopLeftRadius,
19
+ borderTopRightRadius
20
+ } from './property-descriptors/border-radius';
21
+ import {
22
+ borderBottomStyle,
23
+ borderLeftStyle,
24
+ borderRightStyle,
25
+ borderTopStyle
26
+ } from './property-descriptors/border-style';
27
+ import {
28
+ borderBottomWidth,
29
+ borderLeftWidth,
30
+ borderRightWidth,
31
+ borderTopWidth
32
+ } from './property-descriptors/border-width';
33
+ import { clipPath, ClipPathValue } from './property-descriptors/clip-path';
34
+ import { color } from './property-descriptors/color';
35
+ import { direction } from './property-descriptors/direction';
36
+ import { display, DISPLAY } from './property-descriptors/display';
37
+ import { float, FLOAT } from './property-descriptors/float';
38
+ import { letterSpacing } from './property-descriptors/letter-spacing';
39
+ import { lineBreak } from './property-descriptors/line-break';
40
+ import { lineHeight } from './property-descriptors/line-height';
41
+ import { listStyleImage } from './property-descriptors/list-style-image';
42
+ import { listStylePosition } from './property-descriptors/list-style-position';
43
+ import { listStyleType } from './property-descriptors/list-style-type';
44
+ import { marginBottom, marginLeft, marginRight, marginTop } from './property-descriptors/margin';
45
+ import { overflow, OVERFLOW } from './property-descriptors/overflow';
46
+ import { overflowWrap } from './property-descriptors/overflow-wrap';
47
+ import { paddingBottom, paddingLeft, paddingRight, paddingTop } from './property-descriptors/padding';
48
+ import { textAlign } from './property-descriptors/text-align';
49
+ import { position, POSITION } from './property-descriptors/position';
50
+ import { textShadow } from './property-descriptors/text-shadow';
51
+ import { textTransform } from './property-descriptors/text-transform';
52
+ import { transform } from './property-descriptors/transform';
53
+ import { transformOrigin } from './property-descriptors/transform-origin';
54
+ import { rotate } from './property-descriptors/rotate';
55
+ import { visibility, VISIBILITY } from './property-descriptors/visibility';
56
+ import { wordBreak } from './property-descriptors/word-break';
57
+ import { writingMode } from './property-descriptors/writing-mode';
58
+ import { zIndex } from './property-descriptors/z-index';
59
+ import { CSSValue, isIdentToken, Parser } from './syntax/parser';
60
+ import { Tokenizer } from './syntax/tokenizer';
61
+ import { Color, color as colorType } from './types/color';
62
+ import { isTransparent } from './types/color-utilities';
63
+ import { angle } from './types/angle';
64
+ import { image } from './types/image';
65
+ import { time } from './types/time';
66
+ import { opacity } from './property-descriptors/opacity';
67
+ import { textDecorationColor } from './property-descriptors/text-decoration-color';
68
+ import { textDecorationLine } from './property-descriptors/text-decoration-line';
69
+ import { textDecorationStyle } from './property-descriptors/text-decoration-style';
70
+ import { textDecorationThickness } from './property-descriptors/text-decoration-thickness';
71
+ import { textUnderlineOffset } from './property-descriptors/text-underline-offset';
72
+ import { isLengthPercentage, LengthPercentage, ZERO_LENGTH } from './types/length-percentage';
73
+ import { fontFamily } from './property-descriptors/font-family';
74
+ import { fontSize } from './property-descriptors/font-size';
75
+ import { isLength } from './types/length';
76
+ import { fontWeight } from './property-descriptors/font-weight';
77
+ import { fontVariant } from './property-descriptors/font-variant';
78
+ import { fontStyle } from './property-descriptors/font-style';
79
+ import { contains } from '../core/bitwise';
80
+ import { content } from './property-descriptors/content';
81
+ import { counterIncrement } from './property-descriptors/counter-increment';
82
+ import { counterReset } from './property-descriptors/counter-reset';
83
+ import { duration } from './property-descriptors/duration';
84
+ import { quotes } from './property-descriptors/quotes';
85
+ import { boxShadow } from './property-descriptors/box-shadow';
86
+ import { paintOrder } from './property-descriptors/paint-order';
87
+ import { webkitTextStrokeColor } from './property-descriptors/webkit-text-stroke-color';
88
+ import { webkitTextStrokeWidth } from './property-descriptors/webkit-text-stroke-width';
89
+ import { webkitLineClamp } from './property-descriptors/webkit-line-clamp';
90
+ import { Context } from '../core/context';
91
+ import { objectFit } from './property-descriptors/object-fit';
92
+ import { textOverflow } from './property-descriptors/text-overflow';
93
+ import { imageRendering } from './property-descriptors/image-rendering';
94
+ import { mixBlendMode, MixBlendMode } from './property-descriptors/mix-blend-mode';
95
+
96
+ export class CSSParsedDeclaration {
97
+ animationDuration!: ReturnType<typeof duration.parse>;
98
+ backgroundClip!: ReturnType<typeof backgroundClip.parse>;
99
+ backgroundColor!: Color;
100
+ backgroundImage!: ReturnType<typeof backgroundImage.parse>;
101
+ backgroundOrigin!: ReturnType<typeof backgroundOrigin.parse>;
102
+ backgroundPosition!: ReturnType<typeof backgroundPosition.parse>;
103
+ backgroundRepeat!: ReturnType<typeof backgroundRepeat.parse>;
104
+ backgroundSize!: ReturnType<typeof backgroundSize.parse>;
105
+ borderTopColor!: Color;
106
+ borderRightColor!: Color;
107
+ borderBottomColor!: Color;
108
+ borderLeftColor!: Color;
109
+ borderTopLeftRadius!: ReturnType<typeof borderTopLeftRadius.parse>;
110
+ borderTopRightRadius!: ReturnType<typeof borderTopRightRadius.parse>;
111
+ borderBottomRightRadius!: ReturnType<typeof borderBottomRightRadius.parse>;
112
+ borderBottomLeftRadius!: ReturnType<typeof borderBottomLeftRadius.parse>;
113
+ borderTopStyle!: ReturnType<typeof borderTopStyle.parse>;
114
+ borderRightStyle!: ReturnType<typeof borderRightStyle.parse>;
115
+ borderBottomStyle!: ReturnType<typeof borderBottomStyle.parse>;
116
+ borderLeftStyle!: ReturnType<typeof borderLeftStyle.parse>;
117
+ borderTopWidth!: ReturnType<typeof borderTopWidth.parse>;
118
+ borderRightWidth!: ReturnType<typeof borderRightWidth.parse>;
119
+ borderBottomWidth!: ReturnType<typeof borderBottomWidth.parse>;
120
+ borderLeftWidth!: ReturnType<typeof borderLeftWidth.parse>;
121
+ boxShadow!: ReturnType<typeof boxShadow.parse>;
122
+ clipPath!: ClipPathValue;
123
+ color!: Color;
124
+ direction!: ReturnType<typeof direction.parse>;
125
+ display!: ReturnType<typeof display.parse>;
126
+ float!: ReturnType<typeof float.parse>;
127
+ fontFamily!: ReturnType<typeof fontFamily.parse>;
128
+ fontSize!: LengthPercentage;
129
+ fontStyle!: ReturnType<typeof fontStyle.parse>;
130
+ fontVariant!: ReturnType<typeof fontVariant.parse>;
131
+ fontWeight!: ReturnType<typeof fontWeight.parse>;
132
+ letterSpacing!: ReturnType<typeof letterSpacing.parse>;
133
+ lineBreak!: ReturnType<typeof lineBreak.parse>;
134
+ lineHeight!: CSSValue;
135
+ listStyleImage!: ReturnType<typeof listStyleImage.parse>;
136
+ listStylePosition!: ReturnType<typeof listStylePosition.parse>;
137
+ listStyleType!: ReturnType<typeof listStyleType.parse>;
138
+ marginTop!: CSSValue;
139
+ marginRight!: CSSValue;
140
+ marginBottom!: CSSValue;
141
+ marginLeft!: CSSValue;
142
+ opacity!: ReturnType<typeof opacity.parse>;
143
+ overflowX!: OVERFLOW;
144
+ overflowY!: OVERFLOW;
145
+ overflowWrap!: ReturnType<typeof overflowWrap.parse>;
146
+ paddingTop!: LengthPercentage;
147
+ paddingRight!: LengthPercentage;
148
+ paddingBottom!: LengthPercentage;
149
+ paddingLeft!: LengthPercentage;
150
+ paintOrder!: ReturnType<typeof paintOrder.parse>;
151
+ position!: ReturnType<typeof position.parse>;
152
+ textAlign!: ReturnType<typeof textAlign.parse>;
153
+ textDecorationColor!: Color;
154
+ textDecorationLine!: ReturnType<typeof textDecorationLine.parse>;
155
+ textDecorationStyle!: ReturnType<typeof textDecorationStyle.parse>;
156
+ textDecorationThickness!: ReturnType<typeof textDecorationThickness.parse>;
157
+ textUnderlineOffset!: ReturnType<typeof textUnderlineOffset.parse>;
158
+ textShadow!: ReturnType<typeof textShadow.parse>;
159
+ textTransform!: ReturnType<typeof textTransform.parse>;
160
+ textOverflow!: ReturnType<typeof textOverflow.parse>;
161
+ transform!: ReturnType<typeof transform.parse>;
162
+ transformOrigin!: ReturnType<typeof transformOrigin.parse>;
163
+ rotate!: ReturnType<typeof rotate.parse>;
164
+ visibility!: ReturnType<typeof visibility.parse>;
165
+ webkitTextStrokeColor!: Color;
166
+ webkitTextStrokeWidth!: ReturnType<typeof webkitTextStrokeWidth.parse>;
167
+ webkitLineClamp!: ReturnType<typeof webkitLineClamp.parse>;
168
+ wordBreak!: ReturnType<typeof wordBreak.parse>;
169
+ writingMode!: ReturnType<typeof writingMode.parse>;
170
+ zIndex!: ReturnType<typeof zIndex.parse>;
171
+ objectFit!: ReturnType<typeof objectFit.parse>;
172
+ imageRendering!: ReturnType<typeof imageRendering.parse>;
173
+ mixBlendMode!: MixBlendMode;
174
+
175
+ private static readonly standardProps: [keyof CSSParsedDeclaration, CSSPropertyDescriptor<unknown>, string][] = [
176
+ ['animationDuration', duration, 'animationDuration'],
177
+ ['backgroundClip', backgroundClip, 'backgroundClip'],
178
+ ['backgroundColor', backgroundColor, 'backgroundColor'],
179
+ ['backgroundImage', backgroundImage, 'backgroundImage'],
180
+ ['backgroundOrigin', backgroundOrigin, 'backgroundOrigin'],
181
+ ['backgroundPosition', backgroundPosition, 'backgroundPosition'],
182
+ ['backgroundRepeat', backgroundRepeat, 'backgroundRepeat'],
183
+ ['backgroundSize', backgroundSize, 'backgroundSize'],
184
+ ['borderTopColor', borderTopColor, 'borderTopColor'],
185
+ ['borderRightColor', borderRightColor, 'borderRightColor'],
186
+ ['borderBottomColor', borderBottomColor, 'borderBottomColor'],
187
+ ['borderLeftColor', borderLeftColor, 'borderLeftColor'],
188
+ ['borderTopLeftRadius', borderTopLeftRadius, 'borderTopLeftRadius'],
189
+ ['borderTopRightRadius', borderTopRightRadius, 'borderTopRightRadius'],
190
+ ['borderBottomRightRadius', borderBottomRightRadius, 'borderBottomRightRadius'],
191
+ ['borderBottomLeftRadius', borderBottomLeftRadius, 'borderBottomLeftRadius'],
192
+ ['borderTopStyle', borderTopStyle, 'borderTopStyle'],
193
+ ['borderRightStyle', borderRightStyle, 'borderRightStyle'],
194
+ ['borderBottomStyle', borderBottomStyle, 'borderBottomStyle'],
195
+ ['borderLeftStyle', borderLeftStyle, 'borderLeftStyle'],
196
+ ['borderTopWidth', borderTopWidth, 'borderTopWidth'],
197
+ ['borderRightWidth', borderRightWidth, 'borderRightWidth'],
198
+ ['borderBottomWidth', borderBottomWidth, 'borderBottomWidth'],
199
+ ['borderLeftWidth', borderLeftWidth, 'borderLeftWidth'],
200
+ ['boxShadow', boxShadow, 'boxShadow'],
201
+ ['clipPath', clipPath, 'clipPath'],
202
+ ['color', color, 'color'],
203
+ ['direction', direction, 'direction'],
204
+ ['display', display, 'display'],
205
+ ['fontFamily', fontFamily, 'fontFamily'],
206
+ ['fontSize', fontSize, 'fontSize'],
207
+ ['fontStyle', fontStyle, 'fontStyle'],
208
+ ['fontVariant', fontVariant, 'fontVariant'],
209
+ ['fontWeight', fontWeight, 'fontWeight'],
210
+ ['letterSpacing', letterSpacing, 'letterSpacing'],
211
+ ['lineBreak', lineBreak, 'lineBreak'],
212
+ ['lineHeight', lineHeight, 'lineHeight'],
213
+ ['listStyleImage', listStyleImage, 'listStyleImage'],
214
+ ['listStylePosition', listStylePosition, 'listStylePosition'],
215
+ ['listStyleType', listStyleType, 'listStyleType'],
216
+ ['marginTop', marginTop, 'marginTop'],
217
+ ['marginRight', marginRight, 'marginRight'],
218
+ ['marginBottom', marginBottom, 'marginBottom'],
219
+ ['marginLeft', marginLeft, 'marginLeft'],
220
+ ['opacity', opacity, 'opacity'],
221
+ ['overflowWrap', overflowWrap, 'overflowWrap'],
222
+ ['paddingTop', paddingTop, 'paddingTop'],
223
+ ['paddingRight', paddingRight, 'paddingRight'],
224
+ ['paddingBottom', paddingBottom, 'paddingBottom'],
225
+ ['paddingLeft', paddingLeft, 'paddingLeft'],
226
+ ['paintOrder', paintOrder, 'paintOrder'],
227
+ ['position', position, 'position'],
228
+ ['textAlign', textAlign, 'textAlign'],
229
+ ['textDecorationStyle', textDecorationStyle, 'textDecorationStyle'],
230
+ ['textDecorationThickness', textDecorationThickness, 'textDecorationThickness'],
231
+ ['textUnderlineOffset', textUnderlineOffset, 'textUnderlineOffset'],
232
+ ['textShadow', textShadow, 'textShadow'],
233
+ ['textTransform', textTransform, 'textTransform'],
234
+ ['textOverflow', textOverflow, 'textOverflow'],
235
+ ['transform', transform, 'transform'],
236
+ ['transformOrigin', transformOrigin, 'transformOrigin'],
237
+ ['rotate', rotate, 'rotate'],
238
+ ['visibility', visibility, 'visibility'],
239
+ ['webkitTextStrokeColor', webkitTextStrokeColor, 'webkitTextStrokeColor'],
240
+ ['webkitTextStrokeWidth', webkitTextStrokeWidth, 'webkitTextStrokeWidth'],
241
+ ['webkitLineClamp', webkitLineClamp, 'webkitLineClamp'],
242
+ ['wordBreak', wordBreak, 'wordBreak'],
243
+ ['writingMode', writingMode, 'writingMode'],
244
+ ['zIndex', zIndex, 'zIndex'],
245
+ ['objectFit', objectFit, 'objectFit'],
246
+ ['imageRendering', imageRendering, 'imageRendering'],
247
+ ['mixBlendMode', mixBlendMode, 'mixBlendMode']
248
+ ];
249
+
250
+ constructor(context: Context, declaration: CSSStyleDeclaration) {
251
+ const standardProps = CSSParsedDeclaration.standardProps;
252
+
253
+ // Fast path: display:none elements are invisible and their descendants
254
+ // are never rendered. Parse only initial values instead of full computed styles.
255
+ if (declaration.display === 'none') {
256
+ this.display = DISPLAY.NONE;
257
+ for (const [key, descriptor] of standardProps) {
258
+ if (key !== 'display') {
259
+ (this as Record<string, unknown>)[key] = parse(context, descriptor, undefined);
260
+ }
261
+ }
262
+ this.float = parse(context, float, undefined);
263
+ this.textDecorationColor = parse(context, textDecorationColor, undefined);
264
+ this.textDecorationLine = parse(context, textDecorationLine, undefined);
265
+ const overflowTuple = parse(context, overflow, undefined);
266
+ this.overflowX = overflowTuple[0];
267
+ this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];
268
+ return;
269
+ }
270
+
271
+ for (const [key, descriptor, cssProp] of standardProps) {
272
+ (this as Record<string, unknown>)[key] = parse(
273
+ context,
274
+ descriptor,
275
+ (declaration as unknown as Record<string, string | undefined>)[cssProp]
276
+ );
277
+ }
278
+
279
+ // Special cases that need different CSS property names or fallback values
280
+ this.float = parse(context, float, declaration.cssFloat);
281
+ this.textDecorationColor = parse(
282
+ context,
283
+ textDecorationColor,
284
+ declaration.textDecorationColor ?? declaration.color
285
+ );
286
+ this.textDecorationLine = parse(
287
+ context,
288
+ textDecorationLine,
289
+ declaration.textDecorationLine ?? declaration.textDecoration
290
+ );
291
+
292
+ // overflow returns a tuple that must be split into X/Y
293
+ const overflowTuple = parse(context, overflow, declaration.overflow);
294
+ this.overflowX = overflowTuple[0];
295
+ this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];
296
+ }
297
+
298
+ isVisible(): boolean {
299
+ return this.display > 0 && this.opacity > 0 && this.visibility === VISIBILITY.VISIBLE;
300
+ }
301
+
302
+ isTransparent(): boolean {
303
+ return isTransparent(this.backgroundColor);
304
+ }
305
+
306
+ isTransformed(): boolean {
307
+ return this.transform !== null || this.rotate !== null;
308
+ }
309
+
310
+ isPositioned(): boolean {
311
+ return this.position !== POSITION.STATIC;
312
+ }
313
+
314
+ isPositionedWithZIndex(): boolean {
315
+ return this.isPositioned() && !this.zIndex.auto;
316
+ }
317
+
318
+ isFloating(): boolean {
319
+ return this.float !== FLOAT.NONE;
320
+ }
321
+
322
+ isInlineLevel(): boolean {
323
+ return (
324
+ contains(this.display, DISPLAY.INLINE) ||
325
+ contains(this.display, DISPLAY.INLINE_BLOCK) ||
326
+ contains(this.display, DISPLAY.INLINE_FLEX) ||
327
+ contains(this.display, DISPLAY.INLINE_GRID) ||
328
+ contains(this.display, DISPLAY.INLINE_LIST_ITEM) ||
329
+ contains(this.display, DISPLAY.INLINE_TABLE)
330
+ );
331
+ }
332
+ }
333
+
334
+ export class CSSParsedPseudoDeclaration {
335
+ content: ReturnType<typeof content.parse>;
336
+ quotes: ReturnType<typeof quotes.parse>;
337
+
338
+ constructor(context: Context, declaration: CSSStyleDeclaration) {
339
+ this.content = parse(context, content, declaration.content);
340
+ this.quotes = parse(context, quotes, declaration.quotes);
341
+ }
342
+ }
343
+
344
+ export class CSSParsedCounterDeclaration {
345
+ counterIncrement: ReturnType<typeof counterIncrement.parse>;
346
+ counterReset: ReturnType<typeof counterReset.parse>;
347
+
348
+ constructor(context: Context, declaration: CSSStyleDeclaration) {
349
+ this.counterIncrement = parse(context, counterIncrement, declaration.counterIncrement);
350
+ this.counterReset = parse(context, counterReset, declaration.counterReset);
351
+ }
352
+ }
353
+
354
+ const parseCache = new Map<CSSPropertyDescriptor<any>, Map<string, unknown>>();
355
+ const PARSE_CACHE_MAX_PER_DESCRIPTOR = 200;
356
+
357
+ const parse = (context: Context, descriptor: CSSPropertyDescriptor<any>, style?: string | null) => {
358
+ const rawValue = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;
359
+
360
+ let valueCache = parseCache.get(descriptor);
361
+ if (valueCache) {
362
+ const cached = valueCache.get(rawValue);
363
+ if (cached !== undefined) {
364
+ return cached;
365
+ }
366
+ }
367
+
368
+ const tokenizer = Tokenizer.get();
369
+ tokenizer.write(rawValue);
370
+ const parser = new Parser(tokenizer.read());
371
+ Tokenizer.release(tokenizer);
372
+
373
+ let result: any;
374
+ switch (descriptor.type) {
375
+ case PropertyDescriptorParsingType.IDENT_VALUE: {
376
+ const token = parser.parseComponentValue();
377
+ result = descriptor.parse(context, isIdentToken(token) ? token.value : descriptor.initialValue);
378
+ break;
379
+ }
380
+ case PropertyDescriptorParsingType.VALUE:
381
+ result = descriptor.parse(context, parser.parseComponentValue());
382
+ break;
383
+ case PropertyDescriptorParsingType.LIST:
384
+ result = descriptor.parse(context, parser.parseComponentValues());
385
+ break;
386
+ case PropertyDescriptorParsingType.TOKEN_VALUE:
387
+ result = parser.parseComponentValue();
388
+ break;
389
+ case PropertyDescriptorParsingType.TYPE_VALUE:
390
+ switch (descriptor.format) {
391
+ case 'angle':
392
+ result = angle.parse(context, parser.parseComponentValue());
393
+ break;
394
+ case 'color':
395
+ result = colorType.parse(context, parser.parseComponentValue());
396
+ break;
397
+ case 'image':
398
+ result = image.parse(context, parser.parseComponentValue());
399
+ break;
400
+ case 'length': {
401
+ const length = parser.parseComponentValue();
402
+ result = isLength(length) ? length : ZERO_LENGTH;
403
+ break;
404
+ }
405
+ case 'length-percentage': {
406
+ const value = parser.parseComponentValue();
407
+ result = isLengthPercentage(value) ? value : ZERO_LENGTH;
408
+ break;
409
+ }
410
+ case 'time':
411
+ result = time.parse(context, parser.parseComponentValue());
412
+ break;
413
+ }
414
+ break;
415
+ }
416
+
417
+ if (!valueCache) {
418
+ valueCache = new Map();
419
+ parseCache.set(descriptor, valueCache);
420
+ }
421
+ if (valueCache.size >= PARSE_CACHE_MAX_PER_DESCRIPTOR) {
422
+ valueCache.clear();
423
+ }
424
+ valueCache.set(rawValue, result);
425
+
426
+ return result;
427
+ };
@@ -0,0 +1,6 @@
1
+ import type { Bounds as BoundsType } from '../bounds';
2
+ const actual = await vi.importActual<typeof import('../bounds')>('../bounds');
3
+ export const { Bounds } = actual;
4
+ export const parseBounds = (): BoundsType => {
5
+ return new Bounds(0, 0, 200, 50);
6
+ };
@@ -0,0 +1,79 @@
1
+ import { Context } from '../../core/context';
2
+
3
+ export class Bounds {
4
+ constructor(
5
+ readonly left: number,
6
+ readonly top: number,
7
+ readonly width: number,
8
+ readonly height: number
9
+ ) {}
10
+
11
+ add(x: number, y: number, w: number, h: number): Bounds {
12
+ return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);
13
+ }
14
+
15
+ static fromClientRect(context: Context, clientRect: ClientRect): Bounds {
16
+ return new Bounds(
17
+ clientRect.left + context.windowBounds.left,
18
+ clientRect.top + context.windowBounds.top,
19
+ clientRect.width,
20
+ clientRect.height
21
+ );
22
+ }
23
+
24
+ static fromDOMRectList(context: Context, domRectList: DOMRectList): Bounds {
25
+ const rects = Array.from(domRectList);
26
+
27
+ // First try to find a rect with non-zero width
28
+ let domRect = rects.find((rect) => rect.width !== 0);
29
+
30
+ // If not found, try to find a rect with non-zero height
31
+ // This handles cases like inline-flex with single child where width might be 0
32
+ if (!domRect) {
33
+ domRect = rects.find((rect) => rect.height !== 0);
34
+ }
35
+
36
+ // If still not found but rects exist, use the first rect
37
+ // Position info (left, top) might still be valid even if dimensions are 0
38
+ if (!domRect && rects.length > 0) {
39
+ domRect = rects[0];
40
+ }
41
+
42
+ return domRect
43
+ ? new Bounds(
44
+ domRect.left + context.windowBounds.left,
45
+ domRect.top + context.windowBounds.top,
46
+ domRect.width,
47
+ domRect.height
48
+ )
49
+ : Bounds.EMPTY;
50
+ }
51
+
52
+ static EMPTY = new Bounds(0, 0, 0, 0);
53
+ }
54
+
55
+ export const parseBounds = (context: Context, node: Element): Bounds => {
56
+ return Bounds.fromClientRect(context, node.getBoundingClientRect());
57
+ };
58
+
59
+ export const parseDocumentSize = (document: Document): Bounds => {
60
+ const body = document.body;
61
+ const documentElement = document.documentElement;
62
+
63
+ if (!body || !documentElement) {
64
+ throw new Error(`Unable to get document size`);
65
+ }
66
+ const width = Math.max(
67
+ Math.max(body.scrollWidth, documentElement.scrollWidth),
68
+ Math.max(body.offsetWidth, documentElement.offsetWidth),
69
+ Math.max(body.clientWidth, documentElement.clientWidth)
70
+ );
71
+
72
+ const height = Math.max(
73
+ Math.max(body.scrollHeight, documentElement.scrollHeight),
74
+ Math.max(body.offsetHeight, documentElement.offsetHeight),
75
+ Math.max(body.clientHeight, documentElement.clientHeight)
76
+ );
77
+
78
+ return new Bounds(0, 0, width, height);
79
+ };
@@ -0,0 +1,161 @@
1
+ import { OVERFLOW_WRAP } from '../property-descriptors/overflow-wrap';
2
+ import { CSSParsedDeclaration } from '../index';
3
+ import { fromCodePoint, LineBreaker, toCodePoints } from 'css-line-break';
4
+ import { splitGraphemes } from 'text-segmentation';
5
+ import { Bounds, parseBounds } from './bounds';
6
+ import { FEATURES } from '../../core/features';
7
+ import { Context } from '../../core/context';
8
+ import { isVerticalWritingMode } from '../property-descriptors/writing-mode';
9
+
10
+ export class TextBounds {
11
+ readonly text: string;
12
+ readonly bounds: Bounds;
13
+
14
+ constructor(text: string, bounds: Bounds) {
15
+ this.text = text;
16
+ this.bounds = bounds;
17
+ }
18
+ }
19
+
20
+ export const parseTextBounds = (
21
+ context: Context,
22
+ value: string,
23
+ styles: CSSParsedDeclaration,
24
+ node: Text
25
+ ): TextBounds[] => {
26
+ const textList = breakText(value, styles);
27
+ const textBounds: TextBounds[] = [];
28
+ let offset = 0;
29
+ textList.forEach((text) => {
30
+ if (styles.textDecorationLine.length || text.trim().length > 0) {
31
+ if (FEATURES.SUPPORT_RANGE_BOUNDS) {
32
+ const clientRects = createRange(node, offset, text.length).getClientRects();
33
+ if (clientRects.length > 1) {
34
+ const subSegments = segmentGraphemes(text);
35
+ let subOffset = 0;
36
+ subSegments.forEach((subSegment) => {
37
+ textBounds.push(
38
+ new TextBounds(
39
+ subSegment,
40
+ Bounds.fromDOMRectList(
41
+ context,
42
+ createRange(node, subOffset + offset, subSegment.length).getClientRects()
43
+ )
44
+ )
45
+ );
46
+ subOffset += subSegment.length;
47
+ });
48
+ } else {
49
+ textBounds.push(new TextBounds(text, Bounds.fromDOMRectList(context, clientRects)));
50
+ }
51
+ } else {
52
+ const replacementNode = node.splitText(text.length);
53
+ textBounds.push(new TextBounds(text, getWrapperBounds(context, node)));
54
+ node = replacementNode;
55
+ }
56
+ } else if (!FEATURES.SUPPORT_RANGE_BOUNDS) {
57
+ node = node.splitText(text.length);
58
+ }
59
+ offset += text.length;
60
+ });
61
+
62
+ return textBounds;
63
+ };
64
+
65
+ const getWrapperBounds = (context: Context, node: Text): Bounds => {
66
+ const ownerDocument = node.ownerDocument;
67
+ if (ownerDocument) {
68
+ const wrapper = ownerDocument.createElement('html2canvaswrapper');
69
+ wrapper.appendChild(node.cloneNode(true));
70
+ const parentNode = node.parentNode;
71
+ if (parentNode) {
72
+ parentNode.replaceChild(wrapper, node);
73
+ const bounds = parseBounds(context, wrapper);
74
+ if (wrapper.firstChild) {
75
+ parentNode.replaceChild(wrapper.firstChild, wrapper);
76
+ }
77
+ return bounds;
78
+ }
79
+ }
80
+
81
+ return Bounds.EMPTY;
82
+ };
83
+
84
+ const createRange = (node: Text, offset: number, length: number): Range => {
85
+ const ownerDocument = node.ownerDocument;
86
+ if (!ownerDocument) {
87
+ throw new Error('Node has no owner document');
88
+ }
89
+ const range = ownerDocument.createRange();
90
+ range.setStart(node, offset);
91
+ range.setEnd(node, offset + length);
92
+ return range;
93
+ };
94
+
95
+ export const segmentGraphemes = (value: string): string[] => {
96
+ if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) {
97
+ const segmenter = new (Intl as any).Segmenter(void 0, { granularity: 'grapheme' });
98
+
99
+ return Array.from(segmenter.segment(value)).map((segment: any) => segment.segment);
100
+ }
101
+
102
+ return splitGraphemes(value);
103
+ };
104
+
105
+ const segmentWords = (value: string, styles: CSSParsedDeclaration): string[] => {
106
+ if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) {
107
+ const segmenter = new (Intl as any).Segmenter(void 0, {
108
+ granularity: 'word'
109
+ });
110
+
111
+ return Array.from(segmenter.segment(value)).map((segment: any) => segment.segment);
112
+ }
113
+
114
+ return breakWords(value, styles);
115
+ };
116
+
117
+ const breakText = (value: string, styles: CSSParsedDeclaration): string[] => {
118
+ if (isVerticalWritingMode(styles.writingMode)) {
119
+ return segmentGraphemes(value);
120
+ }
121
+
122
+ return styles.letterSpacing !== 0 ? segmentGraphemes(value) : segmentWords(value, styles);
123
+ };
124
+
125
+ // https://drafts.csswg.org/css-text/#word-separator
126
+ const wordSeparators = [0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091];
127
+
128
+ const breakWords = (str: string, styles: CSSParsedDeclaration): string[] => {
129
+ const breaker = LineBreaker(str, {
130
+ lineBreak: styles.lineBreak,
131
+ wordBreak: styles.overflowWrap === OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : styles.wordBreak
132
+ });
133
+
134
+ const words = [];
135
+ let bk;
136
+
137
+ while (!(bk = breaker.next()).done) {
138
+ if (bk.value) {
139
+ const value = bk.value.slice();
140
+ const codePoints = toCodePoints(value);
141
+ let word = '';
142
+ codePoints.forEach((codePoint) => {
143
+ if (wordSeparators.indexOf(codePoint) === -1) {
144
+ word += fromCodePoint(codePoint);
145
+ } else {
146
+ if (word.length) {
147
+ words.push(word);
148
+ }
149
+ words.push(fromCodePoint(codePoint));
150
+ word = '';
151
+ }
152
+ });
153
+
154
+ if (word.length) {
155
+ words.push(word);
156
+ }
157
+ }
158
+ }
159
+
160
+ return words;
161
+ };