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,7 @@
1
+ import { CSSValue } from './syntax/parser';
2
+ import { Context } from '../core/context';
3
+
4
+ export interface ITypeDescriptor<T> {
5
+ name: string;
6
+ parse: (context: Context, value: CSSValue) => T;
7
+ }
@@ -0,0 +1,147 @@
1
+ import { strictEqual } from 'assert';
2
+ import { color } from '../color';
3
+ import { asString, isTransparent, pack } from '../color-utilities';
4
+ import { Parser } from '../../syntax/parser';
5
+ import { Context } from '../../../core/context';
6
+
7
+ const parse = (value: string) => color.parse({} as Context, Parser.parseValue(value));
8
+
9
+ describe('types', () => {
10
+ describe('<color>', () => {
11
+ describe('parsing', () => {
12
+ it('#000', () => strictEqual(parse('#000'), pack(0, 0, 0, 1)));
13
+ it('#0000', () => strictEqual(parse('#0000'), pack(0, 0, 0, 0)));
14
+ it('#000f', () => strictEqual(parse('#000f'), pack(0, 0, 0, 1)));
15
+ it('#fff', () => strictEqual(parse('#fff'), pack(255, 255, 255, 1)));
16
+ it('#000000', () => strictEqual(parse('#000000'), pack(0, 0, 0, 1)));
17
+ it('#00000000', () => strictEqual(parse('#00000000'), pack(0, 0, 0, 0)));
18
+ it('#ffffff', () => strictEqual(parse('#ffffff'), pack(255, 255, 255, 1)));
19
+ it('#ffffffff', () => strictEqual(parse('#ffffffff'), pack(255, 255, 255, 1)));
20
+ it('#7FFFD4', () => strictEqual(parse('#7FFFD4'), pack(127, 255, 212, 1)));
21
+ it('#f0ffff', () => strictEqual(parse('#f0ffff'), pack(240, 255, 255, 1)));
22
+ it('transparent', () => strictEqual(parse('transparent'), pack(0, 0, 0, 0)));
23
+ it('bisque', () => strictEqual(parse('bisque'), pack(255, 228, 196, 1)));
24
+ it('BLUE', () => strictEqual(parse('BLUE'), pack(0, 0, 255, 1)));
25
+ it('rgb(1, 3, 5)', () => strictEqual(parse('rgb(1, 3, 5)'), pack(1, 3, 5, 1)));
26
+ it('rgb(0% 0% 0%)', () => strictEqual(parse('rgb(0% 0% 0%)'), pack(0, 0, 0, 1)));
27
+ it('rgb(50% 50% 50%)', () => strictEqual(parse('rgb(50% 50% 50%)'), pack(128, 128, 128, 1)));
28
+ it('rgba(50% 50% 50% 50%)', () => strictEqual(parse('rgba(50% 50% 50% 50%)'), pack(128, 128, 128, 0.5)));
29
+ it('rgb(100% 100% 100%)', () => strictEqual(parse('rgb(100% 100% 100%)'), pack(255, 255, 255, 1)));
30
+ it('rgb(222 111 50)', () => strictEqual(parse('rgb(222 111 50)'), pack(222, 111, 50, 1)));
31
+ it('rgba(200, 3, 5, 1)', () => strictEqual(parse('rgba(200, 3, 5, 1)'), pack(200, 3, 5, 1)));
32
+ it('rgba(222, 111, 50, 0.22)', () =>
33
+ strictEqual(parse('rgba(222, 111, 50, 0.22)'), pack(222, 111, 50, 0.22)));
34
+ it('rgba(222 111 50 0.123)', () => strictEqual(parse('rgba(222 111 50 0.123)'), pack(222, 111, 50, 0.123)));
35
+ it('hsl(270,60%,70%)', () => strictEqual(parse('hsl(270,60%,70%)'), parse('rgb(178,132,224)')));
36
+ it('hsl(270, 60%, 70%)', () => strictEqual(parse('hsl(270, 60%, 70%)'), parse('rgb(178,132,224)')));
37
+ it('hsl(270 60% 70%)', () => strictEqual(parse('hsl(270 60% 70%)'), parse('rgb(178,132,224)')));
38
+ it('hsl(270deg, 60%, 70%)', () => strictEqual(parse('hsl(270deg, 60%, 70%)'), parse('rgb(178,132,224)')));
39
+ it('hsl(4.71239rad, 60%, 70%)', () =>
40
+ strictEqual(parse('hsl(4.71239rad, 60%, 70%)'), parse('rgb(178,132,224)')));
41
+ it('hsl(.75turn, 60%, 70%)', () => strictEqual(parse('hsl(.75turn, 60%, 70%)'), parse('rgb(178,132,224)')));
42
+ it('hsla(.75turn, 60%, 70%, 50%)', () =>
43
+ strictEqual(parse('hsl(.75turn, 60%, 70%, 50%)'), parse('rgba(178,132,224, 0.5)')));
44
+ it('oklch(0.93 0.39 28deg)', () => strictEqual(parse('oklch(0.93 0.39 28deg)'), pack(255, 0, 23, 1)));
45
+ it('oklch(0.93 0.39 28)', () => strictEqual(parse('oklch(0.93 0.39 28)'), pack(255, 0, 23, 1)));
46
+ it('oklch(0.63 0.26 27.65)', () => strictEqual(parse('oklch(0.63 0.26 27.65)'), pack(255, 0, 20, 1)));
47
+ it('oklch(0.57 0.23 145.62)', () => strictEqual(parse('oklch(0.57 0.23 145.62)'), pack(0, 151, 0, 1)));
48
+ it('oklch(0.57 0.23 145.62 / 0.5)', () =>
49
+ strictEqual(parse('oklch(0.57 0.23 145.62 / 0.5)'), pack(0, 151, 0, 0.5)));
50
+ it('oklab(0.4 0.11 0.05)', () => strictEqual(parse('oklab(0.4 0.11 0.05)'), pack(124, 37, 37, 1)));
51
+ it('oklab(0.57 -0.19 0.13)', () => strictEqual(parse('oklab(0.57 -0.19 0.13)'), pack(0, 151, 0, 1)));
52
+ it('oklab(0.57 -0.19 0.13 / 50%)', () =>
53
+ strictEqual(parse('oklab(0.57 -0.19 0.13 / 50%)'), pack(0, 151, 0, 0.5)));
54
+ it('lab(53 -66.2 60.96)', () => strictEqual(parse('lab(53 -66.2 60.96)'), pack(0, 151, 0, 1)));
55
+ it('lab(63 -41.52 -25.36)', () => strictEqual(parse('lab(63 -41.52 -25.36)'), pack(0, 173, 196, 1)));
56
+ it('lab(63 -41.52 -25.36 / 0.5)', () =>
57
+ strictEqual(parse('lab(63 -41.52 -25.36 / 0.5)'), pack(0, 173, 196, 0.5)));
58
+ it('lch(29.2345% 44.2 27)', () => strictEqual(parse('lch(29.2345% 44.2 27)'), pack(125, 35, 41, 1)));
59
+ it('lch(52.2345% 72.2 56.2)', () => strictEqual(parse('lch(52.2345% 72.2 56.2)'), pack(198, 93, 6, 1)));
60
+ it('color(srgb 1 0 0)', () => strictEqual(parse('color(srgb 1 0 0)'), pack(255, 0, 0, 1)));
61
+ it('color(srgb 1 0 0 / .5)', () => strictEqual(parse('color(srgb 1 0 0 / .5)'), pack(255, 0, 0, 0.5)));
62
+ it('color(srgb 0.5 0 0.5)', () => strictEqual(parse('color(srgb 0.5 0 0.5)'), pack(128, 0, 128, 1)));
63
+ it('color(xyz 0.11 0.17 0.24)', () =>
64
+ strictEqual(parse('color(xyz 0.11 0.17 0.24)'), pack(0, 130, 131, 1)));
65
+ it('color(xyz-d65 0.11 0.17 0.24)', () =>
66
+ strictEqual(parse('color(xyz-d65 0.11 0.17 0.24)'), pack(0, 130, 131, 1)));
67
+ it('color(xyz-d50 0.11 0.17 0.24)', () =>
68
+ strictEqual(parse('color(xyz-d50 0.11 0.17 0.24)'), pack(0, 131, 150, 1)));
69
+ it('color(srgb-linear 0.23 0.59 0.13)', () =>
70
+ strictEqual(parse('color(srgb-linear 0.23 0.59 0.13)'), pack(132, 202, 101, 1)));
71
+ it('color(display-p3 0.47 0.47 0.47)', () =>
72
+ strictEqual(parse('color(display-p3 0.47 0.47 0.47)'), pack(120, 120, 120, 1)));
73
+ it('color(display-p3 1 1 1)', () => strictEqual(parse('color(display-p3 1 1 1)'), pack(255, 255, 255, 1)));
74
+ it('color(display-p3 -0.1 -0.1 -0.1) ', () =>
75
+ strictEqual(parse('color(display-p3 -0.1 -0.1 -0.1)'), pack(0, 0, 0, 1)));
76
+ it('color(display-p3 0.238 0.532 0.611)', () =>
77
+ strictEqual(parse('color(display-p3 0.238 0.532 0.611)'), pack(5, 138, 158, 1)));
78
+ it('color(display-p3 1 0 0)', () => strictEqual(parse('color(display-p3 1 0 0)'), pack(255, 0, 0, 1)));
79
+ it('color(display-p3 0 1 0)', () => strictEqual(parse('color(display-p3 0 1 0)'), pack(0, 255, 0, 1)));
80
+ it('color(display-p3 0 0 1)', () => strictEqual(parse('color(display-p3 0 0 1)'), pack(0, 0, 255, 1)));
81
+ it('color(a98-rgb 1 0.5 0)', () => strictEqual(parse('color(a98-rgb 1 0.5 0)'), pack(255, 129, 0, 1)));
82
+ it('color(a98-rgb 1 0.22548 0.9854)', () =>
83
+ strictEqual(parse('color(a98-rgb 1 0.22548 0.9854)'), pack(255, 55, 255, 1)));
84
+ it('color(prophoto-rgb 1 0.5 0)', () =>
85
+ strictEqual(parse('color(prophoto-rgb 1 0.5 0)'), pack(255, 99, 0, 1)));
86
+ it('color(rec2020 0.17 0.31 0.5)', () =>
87
+ strictEqual(parse('color(rec2020 0.17 0.31 0.5)'), pack(0, 97, 144, 1)));
88
+ it('color(rec2020 1 0 0)', () => strictEqual(parse('color(rec2020 1 0 0)'), pack(255, 0, 0, 1)));
89
+ it('color(rec2020 0 1 0)', () => strictEqual(parse('color(rec2020 0 1 0)'), pack(0, 255, 0, 1)));
90
+ it('color(rec2020 0 0 1)', () => strictEqual(parse('color(rec2020 0 0 1)'), pack(0, 0, 255, 1)));
91
+ it('color(from #0000FF srgb r g b)', () =>
92
+ strictEqual(parse('color(from #0000FF srgb r b g)'), pack(0, 255, 0, 1)));
93
+ it('color(from #0000FF srgb b 0 0)', () =>
94
+ strictEqual(parse('color(from #0000FF srgb b 0 0)'), pack(255, 0, 0, 1)));
95
+ it('color(from green srgb r g b)', () =>
96
+ strictEqual(parse('color(from green srgb r g b)'), pack(0, 128, 0, 1)));
97
+ it('color(from lime srgb r g b)', () =>
98
+ strictEqual(parse('color(from lime srgb r g b)'), pack(0, 255, 0, 1)));
99
+ it('color(from green srgb r calc(g * 2) b)', () =>
100
+ strictEqual(parse('color(from green srgb r calc(g * 2) b)'), pack(0, 255, 0, 1)));
101
+ it('color(from hsl(0 100% 50%) xyz x y z)', () =>
102
+ strictEqual(parse('color(from hsl(0 100% 50%) xyz x y z)'), pack(255, 0, 0, 1)));
103
+ it('color(from hsl(0 100% 50%) xyz 0.75 0.6554 0.1)', () =>
104
+ strictEqual(parse('color(from hsl(0 100% 50%) xyz 0.75 0.6554 0.1)'), pack(255, 189, 31, 1)));
105
+ it('color(from hsl(0 100% 50%) srgb 0.749938 0 0.609579)', () =>
106
+ strictEqual(parse('color(from hsl(0 100% 50%) srgb 0.749938 0 0.609579)'), pack(191, 0, 155, 1)));
107
+ it('color(from hsl(0 100% 50%) display-p3 r g b)', () =>
108
+ strictEqual(parse('color(from hsl(0 100% 50%) display-p3 r g b)'), pack(255, 0, 0, 1)));
109
+ it('color(from lab(52.14 -26.38 -20.37) display-p3 r g b)', () =>
110
+ strictEqual(parse('color(from lab(52.14 -26.38 -20.37) display-p3 r g b)'), pack(5, 138, 158, 1)));
111
+ it('color(from lab(52.14 -26.38 -20.37) display-p3 r g calc(r / 2))', () =>
112
+ strictEqual(
113
+ parse('color(from lab(52.14 -26.38 -20.37) display-p3 r g calc(r / 2))'),
114
+ pack(5, 138, 0, 1)
115
+ ));
116
+ it('color(from lab(52.14 -26.38 -20.37) a98-rgb r g b)', () =>
117
+ strictEqual(parse('color(from lab(52.14 -26.38 -20.37) a98-rgb r g b)'), pack(5, 138, 158, 1)));
118
+ it('color(from hsl(0 100% 50%) prophoto-rgb r g b)', () =>
119
+ strictEqual(parse('color(from hsl(0 100% 50%) prophoto-rgb r g b)'), pack(255, 0, 0, 1)));
120
+ it('color(from hsl(0 100% 50%) prophoto-rgb calc(r / 2) g b)', () =>
121
+ strictEqual(parse('color(from hsl(0 100% 50%) prophoto-rgb calc(r / 2) g b)'), pack(132, 83, 11, 1)));
122
+ it('color(from lab(52.14 -26.38 -20.37) rec2020 r g b)', () =>
123
+ strictEqual(parse('color(from lab(52.14 -26.38 -20.37) rec2020 r g b)'), pack(5, 138, 158, 1)));
124
+ it('color(from hsl(0 100% 50%) rec2020 calc(r / 2) g 0)', () =>
125
+ strictEqual(parse('color(from hsl(0 100% 50%) rec2020 calc(r / 2) g 0)'), pack(135, 68, 0, 1)));
126
+ });
127
+ describe('util', () => {
128
+ describe('isTransparent', () => {
129
+ it('transparent', () => strictEqual(isTransparent(parse('transparent')), true));
130
+ it('#000', () => strictEqual(isTransparent(parse('#000')), false));
131
+ it('#000f', () => strictEqual(isTransparent(parse('#000f')), false));
132
+ it('#0001', () => strictEqual(isTransparent(parse('#0001')), false));
133
+ it('#0000', () => strictEqual(isTransparent(parse('#0000')), true));
134
+ });
135
+
136
+ describe('toString', () => {
137
+ it('transparent', () => strictEqual(asString(parse('transparent')), 'rgba(0,0,0,0)'));
138
+ it('#000', () => strictEqual(asString(parse('#000')), 'rgb(0,0,0)'));
139
+ it('#000f', () => strictEqual(asString(parse('#000f')), 'rgb(0,0,0)'));
140
+ it('#000f', () => strictEqual(asString(parse('#000c')), 'rgba(0,0,0,0.8)'));
141
+ it('#fff', () => strictEqual(asString(parse('#fff')), 'rgb(255,255,255)'));
142
+ it('#ffff', () => strictEqual(asString(parse('#ffff')), 'rgb(255,255,255)'));
143
+ it('#fffc', () => strictEqual(asString(parse('#fffc')), 'rgba(255,255,255,0.8)'));
144
+ });
145
+ });
146
+ });
147
+ });
@@ -0,0 +1,239 @@
1
+ import { deepStrictEqual } from 'assert';
2
+ import { Parser } from '../../syntax/parser';
3
+ import { CSSImageType, image } from '../image';
4
+ import { color } from '../color';
5
+ import { pack } from '../color-utilities';
6
+ import { FLAG_INTEGER, TokenType } from '../../syntax/tokenizer';
7
+ import { deg } from '../angle';
8
+
9
+ const parse = (context: Context, value: string) => image.parse(context, Parser.parseValue(value));
10
+ const colorParse = (context: Context, value: string) => color.parse(context, Parser.parseValue(value));
11
+
12
+ vi.mock('../../../core/features');
13
+
14
+ vi.mock('../../../core/context');
15
+ import { Context } from '../../../core/context';
16
+
17
+ import { Html2CanvasConfig } from '../../../config';
18
+
19
+ describe('types', () => {
20
+ let context: Context;
21
+ beforeEach(() => {
22
+ const mockWindow = {
23
+ location: { href: 'http://example.com' },
24
+ document: { createElement: () => ({ href: '' }) }
25
+ } as any;
26
+ const config = new Html2CanvasConfig({ window: mockWindow });
27
+ context = new Context({} as any, {} as any, config);
28
+ });
29
+
30
+ describe('<image>', () => {
31
+ describe('parsing', () => {
32
+ describe('url', () => {
33
+ it('url(test.jpg)', () =>
34
+ deepStrictEqual(parse(context, 'url(http://example.com/test.jpg)'), {
35
+ url: 'http://example.com/test.jpg',
36
+ type: CSSImageType.URL
37
+ }));
38
+ it('url("test.jpg")', () =>
39
+ deepStrictEqual(parse(context, 'url("http://example.com/test.jpg")'), {
40
+ url: 'http://example.com/test.jpg',
41
+ type: CSSImageType.URL
42
+ }));
43
+ });
44
+ describe('linear-gradient', () => {
45
+ it('linear-gradient(#f69d3c, #3f87a6)', () =>
46
+ deepStrictEqual(parse(context, 'linear-gradient(#f69d3c, #3f87a6)'), {
47
+ angle: deg(180),
48
+ type: CSSImageType.LINEAR_GRADIENT,
49
+ stops: [
50
+ { color: pack(0xf6, 0x9d, 0x3c, 1), stop: null },
51
+ { color: pack(0x3f, 0x87, 0xa6, 1), stop: null }
52
+ ]
53
+ }));
54
+ it('linear-gradient(yellow, blue)', () =>
55
+ deepStrictEqual(parse(context, 'linear-gradient(yellow, blue)'), {
56
+ angle: deg(180),
57
+ type: CSSImageType.LINEAR_GRADIENT,
58
+ stops: [
59
+ { color: colorParse(context, 'yellow'), stop: null },
60
+ { color: colorParse(context, 'blue'), stop: null }
61
+ ]
62
+ }));
63
+ it('linear-gradient(to bottom, yellow, blue)', () =>
64
+ deepStrictEqual(parse(context, 'linear-gradient(to bottom, yellow, blue)'), {
65
+ angle: deg(180),
66
+ type: CSSImageType.LINEAR_GRADIENT,
67
+ stops: [
68
+ { color: colorParse(context, 'yellow'), stop: null },
69
+ { color: colorParse(context, 'blue'), stop: null }
70
+ ]
71
+ }));
72
+ it('linear-gradient(180deg, yellow, blue)', () =>
73
+ deepStrictEqual(parse(context, 'linear-gradient(180deg, yellow, blue)'), {
74
+ angle: deg(180),
75
+ type: CSSImageType.LINEAR_GRADIENT,
76
+ stops: [
77
+ { color: colorParse(context, 'yellow'), stop: null },
78
+ { color: colorParse(context, 'blue'), stop: null }
79
+ ]
80
+ }));
81
+ it('linear-gradient(to top, blue, yellow)', () =>
82
+ deepStrictEqual(parse(context, 'linear-gradient(to top, blue, yellow)'), {
83
+ angle: 0,
84
+ type: CSSImageType.LINEAR_GRADIENT,
85
+ stops: [
86
+ { color: colorParse(context, 'blue'), stop: null },
87
+ { color: colorParse(context, 'yellow'), stop: null }
88
+ ]
89
+ }));
90
+ it('linear-gradient(to top right, blue, yellow)', () =>
91
+ deepStrictEqual(parse(context, 'linear-gradient(to top right, blue, yellow)'), {
92
+ angle: [
93
+ { type: TokenType.PERCENTAGE_TOKEN, number: 100, flags: 4 },
94
+ { type: TokenType.NUMBER_TOKEN, number: 0, flags: 4 }
95
+ ],
96
+ type: CSSImageType.LINEAR_GRADIENT,
97
+ stops: [
98
+ { color: colorParse(context, 'blue'), stop: null },
99
+ { color: colorParse(context, 'yellow'), stop: null }
100
+ ]
101
+ }));
102
+ it('linear-gradient(to bottom, yellow 0%, blue 100%)', () =>
103
+ deepStrictEqual(parse(context, 'linear-gradient(to bottom, yellow 0%, blue 100%)'), {
104
+ angle: deg(180),
105
+ type: CSSImageType.LINEAR_GRADIENT,
106
+ stops: [
107
+ {
108
+ color: colorParse(context, 'yellow'),
109
+ stop: {
110
+ type: TokenType.PERCENTAGE_TOKEN,
111
+ number: 0,
112
+ flags: FLAG_INTEGER
113
+ }
114
+ },
115
+ {
116
+ color: colorParse(context, 'blue'),
117
+ stop: {
118
+ type: TokenType.PERCENTAGE_TOKEN,
119
+ number: 100,
120
+ flags: FLAG_INTEGER
121
+ }
122
+ }
123
+ ]
124
+ }));
125
+ it('linear-gradient(to top left, lightpink, lightpink 5px, white 5px, white 10px)', () =>
126
+ deepStrictEqual(
127
+ parse(context, 'linear-gradient(to top left, lightpink, lightpink 5px, white 5px, white 10px)'),
128
+ {
129
+ angle: [
130
+ { type: TokenType.PERCENTAGE_TOKEN, number: 100, flags: 4 },
131
+ { type: TokenType.PERCENTAGE_TOKEN, number: 100, flags: 4 }
132
+ ],
133
+ type: CSSImageType.LINEAR_GRADIENT,
134
+ stops: [
135
+ { color: colorParse(context, 'lightpink'), stop: null },
136
+ {
137
+ color: colorParse(context, 'lightpink'),
138
+ stop: {
139
+ type: TokenType.DIMENSION_TOKEN,
140
+ number: 5,
141
+ flags: FLAG_INTEGER,
142
+ unit: 'px'
143
+ }
144
+ },
145
+ {
146
+ color: colorParse(context, 'white'),
147
+ stop: {
148
+ type: TokenType.DIMENSION_TOKEN,
149
+ number: 5,
150
+ flags: FLAG_INTEGER,
151
+ unit: 'px'
152
+ }
153
+ },
154
+ {
155
+ color: colorParse(context, 'white'),
156
+ stop: {
157
+ type: TokenType.DIMENSION_TOKEN,
158
+ number: 10,
159
+ flags: FLAG_INTEGER,
160
+ unit: 'px'
161
+ }
162
+ }
163
+ ]
164
+ }
165
+ ));
166
+ });
167
+ describe('-prefix-linear-gradient', () => {
168
+ it('-webkit-linear-gradient(left, #cedbe9 0%, #aac5de 17%, #3a8bc2 84%, #26558b 100%)', () =>
169
+ deepStrictEqual(
170
+ parse(
171
+ context,
172
+ '-webkit-linear-gradient(left, #cedbe9 0%, #aac5de 17%, #3a8bc2 84%, #26558b 100%)'
173
+ ),
174
+ {
175
+ angle: deg(90),
176
+ type: CSSImageType.LINEAR_GRADIENT,
177
+ stops: [
178
+ {
179
+ color: colorParse(context, '#cedbe9'),
180
+ stop: {
181
+ type: TokenType.PERCENTAGE_TOKEN,
182
+ number: 0,
183
+ flags: FLAG_INTEGER
184
+ }
185
+ },
186
+ {
187
+ color: colorParse(context, '#aac5de'),
188
+ stop: {
189
+ type: TokenType.PERCENTAGE_TOKEN,
190
+ number: 17,
191
+ flags: FLAG_INTEGER
192
+ }
193
+ },
194
+ {
195
+ color: colorParse(context, '#3a8bc2'),
196
+ stop: {
197
+ type: TokenType.PERCENTAGE_TOKEN,
198
+ number: 84,
199
+ flags: FLAG_INTEGER
200
+ }
201
+ },
202
+ {
203
+ color: colorParse(context, '#26558b'),
204
+ stop: {
205
+ type: TokenType.PERCENTAGE_TOKEN,
206
+ number: 100,
207
+ flags: FLAG_INTEGER
208
+ }
209
+ }
210
+ ]
211
+ }
212
+ ));
213
+ it('-moz-linear-gradient(top, #cce5f4 0%, #00263c 100%)', () =>
214
+ deepStrictEqual(parse(context, '-moz-linear-gradient(top, #cce5f4 0%, #00263c 100%)'), {
215
+ angle: deg(180),
216
+ type: CSSImageType.LINEAR_GRADIENT,
217
+ stops: [
218
+ {
219
+ color: colorParse(context, '#cce5f4'),
220
+ stop: {
221
+ type: TokenType.PERCENTAGE_TOKEN,
222
+ number: 0,
223
+ flags: FLAG_INTEGER
224
+ }
225
+ },
226
+ {
227
+ color: colorParse(context, '#00263c'),
228
+ stop: {
229
+ type: TokenType.PERCENTAGE_TOKEN,
230
+ number: 100,
231
+ flags: FLAG_INTEGER
232
+ }
233
+ }
234
+ ]
235
+ }));
236
+ });
237
+ });
238
+ });
239
+ });
@@ -0,0 +1,86 @@
1
+ import { CSSValue, isIdentToken } from '../syntax/parser';
2
+ import { TokenType } from '../syntax/tokenizer';
3
+ import { ITypeDescriptor } from '../type-descriptor';
4
+ import { HUNDRED_PERCENT, ZERO_LENGTH } from './length-percentage';
5
+ import { GradientCorner } from './image';
6
+ import { Context } from '../../core/context';
7
+
8
+ const DEG = 'deg';
9
+ const GRAD = 'grad';
10
+ const RAD = 'rad';
11
+ const TURN = 'turn';
12
+
13
+ export const angle: ITypeDescriptor<number> = {
14
+ name: 'angle',
15
+ parse: (_context: Context, value: CSSValue): number => {
16
+ if (value.type === TokenType.DIMENSION_TOKEN) {
17
+ switch (value.unit) {
18
+ case DEG:
19
+ return (Math.PI * value.number) / 180;
20
+ case GRAD:
21
+ return (Math.PI / 200) * value.number;
22
+ case RAD:
23
+ return value.number;
24
+ case TURN:
25
+ return Math.PI * 2 * value.number;
26
+ }
27
+ }
28
+
29
+ throw new Error(`Unsupported angle type`);
30
+ }
31
+ };
32
+
33
+ export const isAngle = (value: CSSValue): boolean => {
34
+ if (value.type === TokenType.DIMENSION_TOKEN) {
35
+ if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {
36
+ return true;
37
+ }
38
+ }
39
+ return false;
40
+ };
41
+
42
+ export const parseNamedSide = (tokens: CSSValue[]): number | GradientCorner => {
43
+ const sideOrCorner = tokens
44
+ .filter(isIdentToken)
45
+ .map((ident) => ident.value)
46
+ .join(' ');
47
+
48
+ switch (sideOrCorner) {
49
+ case 'to bottom right':
50
+ case 'to right bottom':
51
+ case 'left top':
52
+ case 'top left':
53
+ return [ZERO_LENGTH, ZERO_LENGTH];
54
+ case 'to top':
55
+ case 'bottom':
56
+ return deg(0);
57
+ case 'to bottom left':
58
+ case 'to left bottom':
59
+ case 'right top':
60
+ case 'top right':
61
+ return [ZERO_LENGTH, HUNDRED_PERCENT];
62
+ case 'to right':
63
+ case 'left':
64
+ return deg(90);
65
+ case 'to top left':
66
+ case 'to left top':
67
+ case 'right bottom':
68
+ case 'bottom right':
69
+ return [HUNDRED_PERCENT, HUNDRED_PERCENT];
70
+ case 'to bottom':
71
+ case 'top':
72
+ return deg(180);
73
+ case 'to top right':
74
+ case 'to right top':
75
+ case 'left bottom':
76
+ case 'bottom left':
77
+ return [HUNDRED_PERCENT, ZERO_LENGTH];
78
+ case 'to left':
79
+ case 'right':
80
+ return deg(270);
81
+ }
82
+
83
+ return 0;
84
+ };
85
+
86
+ export const deg = (deg: number): number => (Math.PI * deg) / 180;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Color mathematics utilities
3
+ * Extracted to break circular dependency between srgb.ts and color-utilities.ts
4
+ */
5
+
6
+ /**
7
+ * Clamp a value between min and max
8
+ */
9
+ export const clamp = (value: number, min: number, max: number): number => {
10
+ return Math.min(Math.max(value, min), max);
11
+ };
12
+
13
+ /**
14
+ * Multiply two 3x3 matrices
15
+ */
16
+ export const multiplyMatrices = (A: number[], B: number[]): [number, number, number] => {
17
+ return [
18
+ A[0] * B[0] + A[1] * B[1] + A[2] * B[2],
19
+ A[3] * B[0] + A[4] * B[1] + A[5] * B[2],
20
+ A[6] * B[0] + A[7] * B[1] + A[8] * B[2]
21
+ ];
22
+ };
@@ -0,0 +1,86 @@
1
+ /**
2
+ * A98-RGB related functions
3
+ */
4
+
5
+ import { multiplyMatrices, packSrgbLinear } from '../color-utilities';
6
+ import { xyz2rgbLinear } from './srgb';
7
+
8
+ /**
9
+ * Convert XYZ to a98 linear
10
+ *
11
+ * @param xyz
12
+ */
13
+ export const xyz2a98Linear = (xyz: [number, number, number]): [number, number, number] => {
14
+ return multiplyMatrices(
15
+ [
16
+ 2.0415879038107465, -0.5650069742788596, -0.34473135077832956, -0.9692436362808795, 1.8759675015077202,
17
+ 0.04155505740717557, 0.013444280632031142, -0.11836239223101838, 1.0151749943912054
18
+ ],
19
+ xyz
20
+ );
21
+ };
22
+
23
+ /**
24
+ * Convert XYZ to a98 linear
25
+ *
26
+ * @param a98
27
+ */
28
+ export const a98Linear2xyz = (a98: [number, number, number]): [number, number, number] => {
29
+ return multiplyMatrices(
30
+ [
31
+ 0.5766690429101305, 0.1855582379065463, 0.1882286462349947, 0.29734497525053605, 0.6273635662554661,
32
+ 0.0752914584939978, 0.02703136138641234, 0.07068885253582723, 0.9913375368376388
33
+ ],
34
+ a98
35
+ );
36
+ };
37
+
38
+ /**
39
+ * Convert A98 RGB to rgb linear
40
+ *
41
+ * @param rgb
42
+ */
43
+ export const a982a98Linear = (rgb: [number, number, number]): [number, number, number] => {
44
+ const mapped = rgb.map((c: number) => {
45
+ const sign = c < 0 ? -1 : 1,
46
+ abs = Math.abs(c);
47
+ return sign * abs ** (563 / 256);
48
+ });
49
+
50
+ return [mapped[0], mapped[1], mapped[2]];
51
+ };
52
+
53
+ /**
54
+ * Convert A98 RGB Linear to A98
55
+ *
56
+ * @param rgb
57
+ */
58
+ export const a98Linear2a98 = (rgb: [number, number, number]): [number, number, number] => {
59
+ const mapped = rgb.map((c: number) => {
60
+ const sign = c < 0 ? -1 : 1,
61
+ abs = Math.abs(c);
62
+ return sign * abs ** (256 / 563);
63
+ });
64
+
65
+ return [mapped[0], mapped[1], mapped[2]];
66
+ };
67
+
68
+ /**
69
+ * Convert XYZ to A98
70
+ *
71
+ * @param args
72
+ */
73
+ export const a98FromXYZ = (args: [number, number, number, number]): [number, number, number, number] => {
74
+ const [r, g, b] = a98Linear2a98(xyz2a98Linear([args[0], args[1], args[2]]));
75
+ return [r, g, b, args[3]];
76
+ };
77
+
78
+ /**
79
+ * Convert A98 to XYZ and Pack
80
+ *
81
+ * @param args
82
+ */
83
+ export const convertA98rgb = (args: number[]): number => {
84
+ const srgb_linear = xyz2rgbLinear(a98Linear2xyz(a982a98Linear([args[0], args[1], args[2]])));
85
+ return packSrgbLinear([srgb_linear[0], srgb_linear[1], srgb_linear[2], args[3]]);
86
+ };