@react-x11/components 0.9.0 → 0.11.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 (579) hide show
  1. package/README.md +10 -4
  2. package/dist/charts/node.d.ts +11 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +44 -14
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +27 -24
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/index.d.ts +1 -1
  24. package/dist/code-language/index.d.ts.map +1 -1
  25. package/dist/code-language/index.js +1 -1
  26. package/dist/code-language/index.js.map +1 -1
  27. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  28. package/dist/code-language/languages/glsl.js +10 -2
  29. package/dist/code-language/languages/glsl.js.map +1 -1
  30. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  31. package/dist/code-language/languages/javascript.js +18 -3
  32. package/dist/code-language/languages/javascript.js.map +1 -1
  33. package/dist/code-language/languages/json.d.ts.map +1 -1
  34. package/dist/code-language/languages/json.js +10 -2
  35. package/dist/code-language/languages/json.js.map +1 -1
  36. package/dist/code-language/languages/shell.d.ts.map +1 -1
  37. package/dist/code-language/languages/shell.js +10 -2
  38. package/dist/code-language/languages/shell.js.map +1 -1
  39. package/dist/code-language/languages/sql.d.ts.map +1 -1
  40. package/dist/code-language/languages/sql.js +20 -2
  41. package/dist/code-language/languages/sql.js.map +1 -1
  42. package/dist/code-language/runs.d.ts +31 -0
  43. package/dist/code-language/runs.d.ts.map +1 -1
  44. package/dist/code-language/runs.js +105 -0
  45. package/dist/code-language/runs.js.map +1 -1
  46. package/dist/code-language/stream.d.ts +22 -0
  47. package/dist/code-language/stream.d.ts.map +1 -1
  48. package/dist/code-language/stream.js +259 -9
  49. package/dist/code-language/stream.js.map +1 -1
  50. package/dist/code-language/types.d.ts +5 -4
  51. package/dist/code-language/types.d.ts.map +1 -1
  52. package/dist/codeblock/index.d.ts +26 -2
  53. package/dist/codeblock/index.d.ts.map +1 -1
  54. package/dist/codeblock/index.js +57 -4
  55. package/dist/codeblock/index.js.map +1 -1
  56. package/dist/flow/draw.d.ts +50 -0
  57. package/dist/flow/draw.d.ts.map +1 -1
  58. package/dist/flow/draw.js +132 -33
  59. package/dist/flow/draw.js.map +1 -1
  60. package/dist/flow/gl/color.d.ts +13 -0
  61. package/dist/flow/gl/color.d.ts.map +1 -0
  62. package/dist/flow/gl/color.js +82 -0
  63. package/dist/flow/gl/color.js.map +1 -0
  64. package/dist/flow/gl/index.d.ts +60 -0
  65. package/dist/flow/gl/index.d.ts.map +1 -0
  66. package/dist/flow/gl/index.js +283 -0
  67. package/dist/flow/gl/index.js.map +1 -0
  68. package/dist/flow/gl/pack.d.ts +133 -0
  69. package/dist/flow/gl/pack.d.ts.map +1 -0
  70. package/dist/flow/gl/pack.js +408 -0
  71. package/dist/flow/gl/pack.js.map +1 -0
  72. package/dist/flow/gl/renderer.d.ts +95 -0
  73. package/dist/flow/gl/renderer.d.ts.map +1 -0
  74. package/dist/flow/gl/renderer.js +459 -0
  75. package/dist/flow/gl/renderer.js.map +1 -0
  76. package/dist/flow/gl/shaders.d.ts +79 -0
  77. package/dist/flow/gl/shaders.d.ts.map +1 -0
  78. package/dist/flow/gl/shaders.js +346 -0
  79. package/dist/flow/gl/shaders.js.map +1 -0
  80. package/dist/flow/gl/text.d.ts +318 -0
  81. package/dist/flow/gl/text.d.ts.map +1 -0
  82. package/dist/flow/gl/text.js +1103 -0
  83. package/dist/flow/gl/text.js.map +1 -0
  84. package/dist/flow/index.d.ts +1 -1
  85. package/dist/flow/index.d.ts.map +1 -1
  86. package/dist/flow/index.js +619 -64
  87. package/dist/flow/index.js.map +1 -1
  88. package/dist/flow/node.d.ts +621 -72
  89. package/dist/flow/node.d.ts.map +1 -1
  90. package/dist/flow/node.js +2253 -1018
  91. package/dist/flow/node.js.map +1 -1
  92. package/dist/flow/paint.d.ts +35 -0
  93. package/dist/flow/paint.d.ts.map +1 -0
  94. package/dist/flow/paint.js +393 -0
  95. package/dist/flow/paint.js.map +1 -0
  96. package/dist/flow/paths.d.ts +14 -0
  97. package/dist/flow/paths.d.ts.map +1 -1
  98. package/dist/flow/paths.js +45 -19
  99. package/dist/flow/paths.js.map +1 -1
  100. package/dist/flow/scene.d.ts +584 -0
  101. package/dist/flow/scene.d.ts.map +1 -0
  102. package/dist/flow/scene.js +1453 -0
  103. package/dist/flow/scene.js.map +1 -0
  104. package/dist/flow/types.d.ts +111 -1
  105. package/dist/flow/types.d.ts.map +1 -1
  106. package/dist/html/controls.d.ts +28 -0
  107. package/dist/html/controls.d.ts.map +1 -1
  108. package/dist/html/controls.js +52 -2
  109. package/dist/html/controls.js.map +1 -1
  110. package/dist/html/css/calc.d.ts +14 -0
  111. package/dist/html/css/calc.d.ts.map +1 -0
  112. package/dist/html/css/calc.js +344 -0
  113. package/dist/html/css/calc.js.map +1 -0
  114. package/dist/html/css/cascade.d.ts +262 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1373 -67
  117. package/dist/html/css/cascade.js.map +1 -1
  118. package/dist/html/css/color.d.ts +23 -0
  119. package/dist/html/css/color.d.ts.map +1 -0
  120. package/dist/html/css/color.js +740 -0
  121. package/dist/html/css/color.js.map +1 -0
  122. package/dist/html/css/content.d.ts +92 -0
  123. package/dist/html/css/content.d.ts.map +1 -0
  124. package/dist/html/css/content.js +388 -0
  125. package/dist/html/css/content.js.map +1 -0
  126. package/dist/html/css/counter-styles.d.ts +76 -0
  127. package/dist/html/css/counter-styles.d.ts.map +1 -0
  128. package/dist/html/css/counter-styles.js +893 -0
  129. package/dist/html/css/counter-styles.js.map +1 -0
  130. package/dist/html/css/decode.d.ts +12 -0
  131. package/dist/html/css/decode.d.ts.map +1 -0
  132. package/dist/html/css/decode.js +116 -0
  133. package/dist/html/css/decode.js.map +1 -0
  134. package/dist/html/css/parse.d.ts +110 -10
  135. package/dist/html/css/parse.d.ts.map +1 -1
  136. package/dist/html/css/parse.js +1473 -180
  137. package/dist/html/css/parse.js.map +1 -1
  138. package/dist/html/css/style.d.ts +501 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3729 -206
  141. package/dist/html/css/style.js.map +1 -1
  142. package/dist/html/css/ua.d.ts.map +1 -1
  143. package/dist/html/css/ua.js +65 -16
  144. package/dist/html/css/ua.js.map +1 -1
  145. package/dist/html/css/values.d.ts +37 -3
  146. package/dist/html/css/values.d.ts.map +1 -1
  147. package/dist/html/css/values.js +122 -48
  148. package/dist/html/css/values.js.map +1 -1
  149. package/dist/html/css/vars.d.ts +52 -0
  150. package/dist/html/css/vars.d.ts.map +1 -0
  151. package/dist/html/css/vars.js +358 -0
  152. package/dist/html/css/vars.js.map +1 -0
  153. package/dist/html/dom.d.ts +30 -4
  154. package/dist/html/dom.d.ts.map +1 -1
  155. package/dist/html/dom.js +278 -17
  156. package/dist/html/dom.js.map +1 -1
  157. package/dist/html/fonts.d.ts +106 -0
  158. package/dist/html/fonts.d.ts.map +1 -0
  159. package/dist/html/fonts.js +565 -0
  160. package/dist/html/fonts.js.map +1 -0
  161. package/dist/html/gif.d.ts +15 -0
  162. package/dist/html/gif.d.ts.map +1 -0
  163. package/dist/html/gif.js +229 -0
  164. package/dist/html/gif.js.map +1 -0
  165. package/dist/html/index.d.ts +50 -11
  166. package/dist/html/index.d.ts.map +1 -1
  167. package/dist/html/index.js +115 -9
  168. package/dist/html/index.js.map +1 -1
  169. package/dist/html/layout/block.d.ts +226 -3
  170. package/dist/html/layout/block.d.ts.map +1 -1
  171. package/dist/html/layout/block.js +3077 -219
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +367 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1742 -182
  176. package/dist/html/layout/boxes.js.map +1 -1
  177. package/dist/html/layout/cache.d.ts +58 -0
  178. package/dist/html/layout/cache.d.ts.map +1 -0
  179. package/dist/html/layout/cache.js +224 -0
  180. package/dist/html/layout/cache.js.map +1 -0
  181. package/dist/html/layout/collapse.d.ts +45 -0
  182. package/dist/html/layout/collapse.d.ts.map +1 -0
  183. package/dist/html/layout/collapse.js +246 -0
  184. package/dist/html/layout/collapse.js.map +1 -0
  185. package/dist/html/layout/css-grid.d.ts +7 -0
  186. package/dist/html/layout/css-grid.d.ts.map +1 -0
  187. package/dist/html/layout/css-grid.js +900 -0
  188. package/dist/html/layout/css-grid.js.map +1 -0
  189. package/dist/html/layout/flex.d.ts.map +1 -1
  190. package/dist/html/layout/flex.js +1025 -89
  191. package/dist/html/layout/flex.js.map +1 -1
  192. package/dist/html/layout/floats.d.ts +45 -6
  193. package/dist/html/layout/floats.d.ts.map +1 -1
  194. package/dist/html/layout/floats.js +113 -14
  195. package/dist/html/layout/floats.js.map +1 -1
  196. package/dist/html/layout/grid-lines.d.ts +39 -0
  197. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  198. package/dist/html/layout/grid-lines.js +119 -0
  199. package/dist/html/layout/grid-lines.js.map +1 -0
  200. package/dist/html/layout/grid.d.ts +53 -0
  201. package/dist/html/layout/grid.d.ts.map +1 -0
  202. package/dist/html/layout/grid.js +153 -0
  203. package/dist/html/layout/grid.js.map +1 -0
  204. package/dist/html/layout/inline.d.ts +154 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3598 -175
  207. package/dist/html/layout/inline.js.map +1 -1
  208. package/dist/html/layout/shaping.d.ts +6 -0
  209. package/dist/html/layout/shaping.d.ts.map +1 -0
  210. package/dist/html/layout/shaping.js +100 -0
  211. package/dist/html/layout/shaping.js.map +1 -0
  212. package/dist/html/layout/table.d.ts +3 -0
  213. package/dist/html/layout/table.d.ts.map +1 -1
  214. package/dist/html/layout/table.js +681 -175
  215. package/dist/html/layout/table.js.map +1 -1
  216. package/dist/html/layout/tracks.d.ts +44 -0
  217. package/dist/html/layout/tracks.d.ts.map +1 -0
  218. package/dist/html/layout/tracks.js +349 -0
  219. package/dist/html/layout/tracks.js.map +1 -0
  220. package/dist/html/node.d.ts +169 -4
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1429 -137
  223. package/dist/html/node.js.map +1 -1
  224. package/dist/html/paint.d.ts +92 -3
  225. package/dist/html/paint.d.ts.map +1 -1
  226. package/dist/html/paint.js +3635 -107
  227. package/dist/html/paint.js.map +1 -1
  228. package/dist/html/resources.d.ts +60 -14
  229. package/dist/html/resources.d.ts.map +1 -1
  230. package/dist/html/resources.js +122 -36
  231. package/dist/html/resources.js.map +1 -1
  232. package/dist/html/surfaces.d.ts +23 -0
  233. package/dist/html/surfaces.d.ts.map +1 -0
  234. package/dist/html/surfaces.js +68 -0
  235. package/dist/html/surfaces.js.map +1 -0
  236. package/dist/html/svg.d.ts +80 -0
  237. package/dist/html/svg.d.ts.map +1 -0
  238. package/dist/html/svg.js +442 -0
  239. package/dist/html/svg.js.map +1 -0
  240. package/dist/html/url.d.ts +23 -0
  241. package/dist/html/url.d.ts.map +1 -0
  242. package/dist/html/url.js +80 -0
  243. package/dist/html/url.js.map +1 -0
  244. package/dist/index.d.ts +1 -1
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js.map +1 -1
  247. package/dist/internal/codelines.d.ts +42 -0
  248. package/dist/internal/codelines.d.ts.map +1 -0
  249. package/dist/internal/codelines.js +170 -0
  250. package/dist/internal/codelines.js.map +1 -0
  251. package/dist/internal/collate.d.ts +3 -0
  252. package/dist/internal/collate.d.ts.map +1 -0
  253. package/dist/internal/collate.js +11 -0
  254. package/dist/internal/collate.js.map +1 -0
  255. package/dist/internal/markdown/ast.d.ts +11 -0
  256. package/dist/internal/markdown/ast.d.ts.map +1 -1
  257. package/dist/internal/markdown/parse.d.ts.map +1 -1
  258. package/dist/internal/markdown/parse.js +109 -8
  259. package/dist/internal/markdown/parse.js.map +1 -1
  260. package/dist/internal/prewarm.d.ts +18 -0
  261. package/dist/internal/prewarm.d.ts.map +1 -0
  262. package/dist/internal/prewarm.js +42 -0
  263. package/dist/internal/prewarm.js.map +1 -0
  264. package/dist/internal/sdf.d.ts +20 -0
  265. package/dist/internal/sdf.d.ts.map +1 -0
  266. package/dist/internal/sdf.js +216 -0
  267. package/dist/internal/sdf.js.map +1 -0
  268. package/dist/internal/splice.d.ts +12 -0
  269. package/dist/internal/splice.d.ts.map +1 -0
  270. package/dist/internal/splice.js +23 -0
  271. package/dist/internal/splice.js.map +1 -0
  272. package/dist/internal/window.d.ts +12 -0
  273. package/dist/internal/window.d.ts.map +1 -1
  274. package/dist/internal/window.js +23 -6
  275. package/dist/internal/window.js.map +1 -1
  276. package/dist/maps/anchors.d.ts +6 -1
  277. package/dist/maps/anchors.d.ts.map +1 -1
  278. package/dist/maps/anchors.js +260 -1
  279. package/dist/maps/anchors.js.map +1 -1
  280. package/dist/maps/controller.d.ts +57 -0
  281. package/dist/maps/controller.d.ts.map +1 -1
  282. package/dist/maps/controller.js +97 -18
  283. package/dist/maps/controller.js.map +1 -1
  284. package/dist/maps/gl/buckets.d.ts +5 -1
  285. package/dist/maps/gl/buckets.d.ts.map +1 -1
  286. package/dist/maps/gl/buckets.js +5 -2
  287. package/dist/maps/gl/buckets.js.map +1 -1
  288. package/dist/maps/gl/build-worker.d.ts +2 -0
  289. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  290. package/dist/maps/gl/build-worker.js +1 -1
  291. package/dist/maps/gl/build-worker.js.map +1 -1
  292. package/dist/maps/gl/cover.d.ts +23 -4
  293. package/dist/maps/gl/cover.d.ts.map +1 -1
  294. package/dist/maps/gl/cover.js +61 -48
  295. package/dist/maps/gl/cover.js.map +1 -1
  296. package/dist/maps/gl/placement.d.ts +21 -8
  297. package/dist/maps/gl/placement.d.ts.map +1 -1
  298. package/dist/maps/gl/placement.js +133 -58
  299. package/dist/maps/gl/placement.js.map +1 -1
  300. package/dist/maps/gl/renderer.d.ts +36 -4
  301. package/dist/maps/gl/renderer.d.ts.map +1 -1
  302. package/dist/maps/gl/renderer.js +81 -24
  303. package/dist/maps/gl/renderer.js.map +1 -1
  304. package/dist/maps/gl/shaders.d.ts +18 -17
  305. package/dist/maps/gl/shaders.d.ts.map +1 -1
  306. package/dist/maps/gl/shaders.js +34 -32
  307. package/dist/maps/gl/shaders.js.map +1 -1
  308. package/dist/maps/gl/store.d.ts +10 -0
  309. package/dist/maps/gl/store.d.ts.map +1 -1
  310. package/dist/maps/gl/store.js +47 -4
  311. package/dist/maps/gl/store.js.map +1 -1
  312. package/dist/maps/gl/text.d.ts +153 -24
  313. package/dist/maps/gl/text.d.ts.map +1 -1
  314. package/dist/maps/gl/text.js +379 -63
  315. package/dist/maps/gl/text.js.map +1 -1
  316. package/dist/maps/gl/view.d.ts +293 -2
  317. package/dist/maps/gl/view.d.ts.map +1 -1
  318. package/dist/maps/gl/view.js +317 -82
  319. package/dist/maps/gl/view.js.map +1 -1
  320. package/dist/maps/icons.d.ts +32 -0
  321. package/dist/maps/icons.d.ts.map +1 -0
  322. package/dist/maps/icons.js +151 -0
  323. package/dist/maps/icons.js.map +1 -0
  324. package/dist/maps/index.d.ts +2 -0
  325. package/dist/maps/index.d.ts.map +1 -1
  326. package/dist/maps/index.js +2 -0
  327. package/dist/maps/index.js.map +1 -1
  328. package/dist/maps/labels.d.ts +56 -4
  329. package/dist/maps/labels.d.ts.map +1 -1
  330. package/dist/maps/labels.js +213 -46
  331. package/dist/maps/labels.js.map +1 -1
  332. package/dist/maps/node.d.ts +17 -0
  333. package/dist/maps/node.d.ts.map +1 -1
  334. package/dist/maps/node.js +64 -30
  335. package/dist/maps/node.js.map +1 -1
  336. package/dist/maps/proj.d.ts +48 -0
  337. package/dist/maps/proj.d.ts.map +1 -1
  338. package/dist/maps/proj.js +73 -0
  339. package/dist/maps/proj.js.map +1 -1
  340. package/dist/maps/sources.d.ts +5 -3
  341. package/dist/maps/sources.d.ts.map +1 -1
  342. package/dist/maps/sources.js +5 -3
  343. package/dist/maps/sources.js.map +1 -1
  344. package/dist/maps/style.d.ts +35 -0
  345. package/dist/maps/style.d.ts.map +1 -1
  346. package/dist/maps/style.js.map +1 -1
  347. package/dist/maps/styles.d.ts +12 -0
  348. package/dist/maps/styles.d.ts.map +1 -1
  349. package/dist/maps/styles.js +120 -6
  350. package/dist/maps/styles.js.map +1 -1
  351. package/dist/maps/tiles.d.ts +31 -11
  352. package/dist/maps/tiles.d.ts.map +1 -1
  353. package/dist/maps/tiles.js +61 -27
  354. package/dist/maps/tiles.js.map +1 -1
  355. package/dist/maps/types.d.ts +28 -4
  356. package/dist/maps/types.d.ts.map +1 -1
  357. package/dist/markdown/index.d.ts.map +1 -1
  358. package/dist/markdown/index.js +209 -68
  359. package/dist/markdown/index.js.map +1 -1
  360. package/dist/markdown/spans.d.ts.map +1 -1
  361. package/dist/markdown/spans.js +6 -0
  362. package/dist/markdown/spans.js.map +1 -1
  363. package/dist/qml/containers.d.ts.map +1 -1
  364. package/dist/qml/containers.js +6 -1
  365. package/dist/qml/containers.js.map +1 -1
  366. package/dist/qml/interaction.d.ts.map +1 -1
  367. package/dist/qml/interaction.js +38 -5
  368. package/dist/qml/interaction.js.map +1 -1
  369. package/dist/qml/layouts.d.ts.map +1 -1
  370. package/dist/qml/layouts.js +21 -6
  371. package/dist/qml/layouts.js.map +1 -1
  372. package/dist/qml/qtquick.d.ts.map +1 -1
  373. package/dist/qml/qtquick.js +9 -2
  374. package/dist/qml/qtquick.js.map +1 -1
  375. package/dist/qml/react.d.ts.map +1 -1
  376. package/dist/qml/react.js +9 -7
  377. package/dist/qml/react.js.map +1 -1
  378. package/dist/reorder/clock.d.ts +7 -0
  379. package/dist/reorder/clock.d.ts.map +1 -0
  380. package/dist/reorder/clock.js +26 -0
  381. package/dist/reorder/clock.js.map +1 -0
  382. package/dist/reorder/index.d.ts +25 -3
  383. package/dist/reorder/index.d.ts.map +1 -1
  384. package/dist/reorder/index.js +64 -19
  385. package/dist/reorder/index.js.map +1 -1
  386. package/dist/rich-text-editor/index.d.ts +0 -11
  387. package/dist/rich-text-editor/index.d.ts.map +1 -1
  388. package/dist/rich-text-editor/index.js +38 -9
  389. package/dist/rich-text-editor/index.js.map +1 -1
  390. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  391. package/dist/rich-text-editor/keymap.js +2 -1
  392. package/dist/rich-text-editor/keymap.js.map +1 -1
  393. package/dist/rich-text-editor/keys.d.ts +17 -6
  394. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  395. package/dist/rich-text-editor/keys.js +135 -26
  396. package/dist/rich-text-editor/keys.js.map +1 -1
  397. package/dist/rich-text-editor/markdown.d.ts.map +1 -1
  398. package/dist/rich-text-editor/markdown.js +30 -1
  399. package/dist/rich-text-editor/markdown.js.map +1 -1
  400. package/dist/rich-text-editor/marks.d.ts +9 -0
  401. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  402. package/dist/rich-text-editor/marks.js +83 -0
  403. package/dist/rich-text-editor/marks.js.map +1 -0
  404. package/dist/rich-text-editor/render.d.ts.map +1 -1
  405. package/dist/rich-text-editor/render.js +28 -10
  406. package/dist/rich-text-editor/render.js.map +1 -1
  407. package/dist/rich-text-editor/replace.d.ts +13 -0
  408. package/dist/rich-text-editor/replace.d.ts.map +1 -0
  409. package/dist/rich-text-editor/replace.js +64 -0
  410. package/dist/rich-text-editor/replace.js.map +1 -0
  411. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  412. package/dist/rich-text-editor/toolbar.js +1 -1
  413. package/dist/rich-text-editor/toolbar.js.map +1 -1
  414. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  415. package/dist/rich-text-editor/virtual.js +17 -0
  416. package/dist/rich-text-editor/virtual.js.map +1 -1
  417. package/dist/richtext/node.d.ts +46 -2
  418. package/dist/richtext/node.d.ts.map +1 -1
  419. package/dist/richtext/node.js +187 -4
  420. package/dist/richtext/node.js.map +1 -1
  421. package/dist/richtext/runs.d.ts +13 -8
  422. package/dist/richtext/runs.d.ts.map +1 -1
  423. package/dist/richtext/runs.js +18 -8
  424. package/dist/richtext/runs.js.map +1 -1
  425. package/dist/table/index.d.ts.map +1 -1
  426. package/dist/table/index.js +23 -0
  427. package/dist/table/index.js.map +1 -1
  428. package/dist/table/rows.d.ts +3 -2
  429. package/dist/table/rows.d.ts.map +1 -1
  430. package/dist/table/rows.js +20 -6
  431. package/dist/table/rows.js.map +1 -1
  432. package/dist/terminal/index.d.ts.map +1 -1
  433. package/dist/terminal/index.js +4 -0
  434. package/dist/terminal/index.js.map +1 -1
  435. package/dist/terminal/vt/pty.d.ts +13 -2
  436. package/dist/terminal/vt/pty.d.ts.map +1 -1
  437. package/dist/terminal/vt/pty.js +18 -3
  438. package/dist/terminal/vt/pty.js.map +1 -1
  439. package/dist/terminal-output/index.d.ts.map +1 -1
  440. package/dist/terminal-output/index.js +103 -23
  441. package/dist/terminal-output/index.js.map +1 -1
  442. package/dist/terminal-output/runs.d.ts +4 -1
  443. package/dist/terminal-output/runs.d.ts.map +1 -1
  444. package/dist/terminal-output/runs.js +5 -1
  445. package/dist/terminal-output/runs.js.map +1 -1
  446. package/dist/three/canvas.d.ts.map +1 -1
  447. package/dist/three/canvas.js +85 -7
  448. package/dist/three/canvas.js.map +1 -1
  449. package/dist/three/events.d.ts +22 -4
  450. package/dist/three/events.d.ts.map +1 -1
  451. package/dist/three/events.js +34 -4
  452. package/dist/three/events.js.map +1 -1
  453. package/dist/tree/index.d.ts.map +1 -1
  454. package/dist/tree/index.js +17 -0
  455. package/dist/tree/index.js.map +1 -1
  456. package/package.json +42 -33
  457. package/src/charts/node.ts +62 -26
  458. package/src/charts/render.ts +120 -30
  459. package/src/code/index.ts +36 -32
  460. package/src/code-editor/completion.ts +3 -2
  461. package/src/code-editor/index.ts +19 -0
  462. package/src/code-editor/node.ts +1574 -184
  463. package/src/code-language/index.ts +1 -1
  464. package/src/code-language/languages/glsl.ts +12 -2
  465. package/src/code-language/languages/javascript.ts +21 -4
  466. package/src/code-language/languages/json.ts +12 -2
  467. package/src/code-language/languages/shell.ts +12 -2
  468. package/src/code-language/languages/sql.ts +22 -2
  469. package/src/code-language/runs.ts +111 -1
  470. package/src/code-language/stream.ts +257 -17
  471. package/src/code-language/types.ts +5 -4
  472. package/src/codeblock/index.ts +68 -4
  473. package/src/flow/draw.ts +167 -41
  474. package/src/flow/gl/color.ts +85 -0
  475. package/src/flow/gl/index.ts +342 -0
  476. package/src/flow/gl/pack.ts +585 -0
  477. package/src/flow/gl/renderer.ts +679 -0
  478. package/src/flow/gl/shaders.ts +371 -0
  479. package/src/flow/gl/text.ts +1295 -0
  480. package/src/flow/index.ts +794 -67
  481. package/src/flow/node.ts +2496 -1256
  482. package/src/flow/paint.ts +511 -0
  483. package/src/flow/paths.ts +80 -15
  484. package/src/flow/scene.ts +2199 -0
  485. package/src/flow/types.ts +113 -1
  486. package/src/html/controls.ts +73 -2
  487. package/src/html/css/calc.ts +385 -0
  488. package/src/html/css/cascade.ts +1481 -62
  489. package/src/html/css/color.ts +755 -0
  490. package/src/html/css/content.ts +417 -0
  491. package/src/html/css/counter-styles.ts +973 -0
  492. package/src/html/css/decode.ts +130 -0
  493. package/src/html/css/parse.ts +1514 -160
  494. package/src/html/css/style.ts +4131 -223
  495. package/src/html/css/ua.ts +66 -17
  496. package/src/html/css/values.ts +150 -50
  497. package/src/html/css/vars.ts +348 -0
  498. package/src/html/dom.ts +284 -17
  499. package/src/html/fonts.ts +641 -0
  500. package/src/html/gif.ts +233 -0
  501. package/src/html/index.ts +180 -20
  502. package/src/html/layout/block.ts +3560 -208
  503. package/src/html/layout/boxes.ts +2141 -190
  504. package/src/html/layout/cache.ts +289 -0
  505. package/src/html/layout/collapse.ts +317 -0
  506. package/src/html/layout/css-grid.ts +1063 -0
  507. package/src/html/layout/flex.ts +1115 -106
  508. package/src/html/layout/floats.ts +128 -14
  509. package/src/html/layout/grid-lines.ts +141 -0
  510. package/src/html/layout/grid.ts +181 -0
  511. package/src/html/layout/inline.ts +4187 -192
  512. package/src/html/layout/shaping.ts +140 -0
  513. package/src/html/layout/table.ts +696 -186
  514. package/src/html/layout/tracks.ts +437 -0
  515. package/src/html/node.ts +1585 -156
  516. package/src/html/paint.ts +4582 -267
  517. package/src/html/resources.ts +161 -50
  518. package/src/html/surfaces.ts +81 -0
  519. package/src/html/svg.ts +504 -0
  520. package/src/html/url.ts +86 -0
  521. package/src/index.ts +2 -0
  522. package/src/internal/codelines.ts +200 -0
  523. package/src/internal/collate.ts +12 -0
  524. package/src/internal/markdown/ast.ts +11 -0
  525. package/src/internal/markdown/parse.ts +154 -11
  526. package/src/internal/prewarm.ts +45 -0
  527. package/src/internal/sdf.ts +227 -0
  528. package/src/internal/splice.ts +25 -0
  529. package/src/internal/window.ts +36 -5
  530. package/src/maps/anchors.ts +307 -1
  531. package/src/maps/controller.ts +116 -31
  532. package/src/maps/gl/buckets.ts +5 -1
  533. package/src/maps/gl/build-worker.ts +13 -2
  534. package/src/maps/gl/cover.ts +79 -44
  535. package/src/maps/gl/placement.ts +221 -69
  536. package/src/maps/gl/renderer.ts +104 -20
  537. package/src/maps/gl/shaders.ts +35 -32
  538. package/src/maps/gl/store.ts +66 -17
  539. package/src/maps/gl/text.ts +444 -71
  540. package/src/maps/gl/view.ts +361 -96
  541. package/src/maps/icons.ts +183 -0
  542. package/src/maps/index.ts +4 -0
  543. package/src/maps/labels.ts +269 -49
  544. package/src/maps/node.ts +82 -49
  545. package/src/maps/proj.ts +87 -0
  546. package/src/maps/sources.ts +5 -3
  547. package/src/maps/style.ts +32 -0
  548. package/src/maps/styles.ts +215 -4
  549. package/src/maps/tiles.ts +64 -31
  550. package/src/maps/types.ts +28 -4
  551. package/src/markdown/index.ts +293 -92
  552. package/src/markdown/spans.ts +5 -0
  553. package/src/qml/containers.tsx +6 -1
  554. package/src/qml/interaction.tsx +42 -5
  555. package/src/qml/layouts.tsx +21 -6
  556. package/src/qml/qtquick.tsx +9 -2
  557. package/src/qml/react.tsx +7 -5
  558. package/src/reorder/clock.ts +27 -0
  559. package/src/reorder/index.ts +100 -27
  560. package/src/rich-text-editor/index.ts +37 -12
  561. package/src/rich-text-editor/keymap.ts +1 -1
  562. package/src/rich-text-editor/keys.ts +135 -26
  563. package/src/rich-text-editor/markdown.ts +36 -1
  564. package/src/rich-text-editor/marks.ts +101 -0
  565. package/src/rich-text-editor/render.ts +49 -12
  566. package/src/rich-text-editor/replace.ts +85 -0
  567. package/src/rich-text-editor/toolbar.ts +1 -1
  568. package/src/rich-text-editor/virtual.ts +25 -0
  569. package/src/richtext/node.ts +235 -14
  570. package/src/richtext/runs.ts +23 -12
  571. package/src/table/index.ts +29 -0
  572. package/src/table/rows.ts +18 -8
  573. package/src/terminal/index.ts +4 -0
  574. package/src/terminal/vt/pty.ts +16 -2
  575. package/src/terminal-output/index.ts +129 -31
  576. package/src/terminal-output/runs.ts +16 -2
  577. package/src/three/canvas.ts +102 -8
  578. package/src/three/events.ts +49 -9
  579. package/src/tree/index.ts +19 -0
@@ -0,0 +1,348 @@
1
+ // Custom properties and `var()` (CSS Custom Properties 1). A `--name`
2
+ // declaration is kept as written, per element and inherited; a `var()` in
3
+ // any other declaration is replaced by it before the declaration is read,
4
+ // so a shorthand, a `calc()` or a colour function sees the value it names.
5
+ //
6
+ // A document with none of either pays nothing: the cascade asks only when
7
+ // some declaration has one (`Declaration.custom`, `Declaration.vars`).
8
+
9
+ /**
10
+ * An element's custom properties: its own over those it inherits, with
11
+ * every `var()` in them already replaced. A chain rather than a copy: an
12
+ * element that sets two properties over a theme of three hundred holds
13
+ * two, where a copy made every such element pay for the theme.
14
+ */
15
+ export class CustomProps {
16
+ /** Its own, where `null` is none over an inherited one (`initial`). */
17
+ readonly own: Map<string, string | null>;
18
+ readonly parent: CustomProps | null;
19
+ private readonly depth: number;
20
+
21
+ constructor(parent: CustomProps | null) {
22
+ // a lookup walks the chain, so a long one is folded into one map
23
+ if (parent && parent.depth >= FOLD_DEPTH) parent = parent.folded();
24
+ this.own = new Map();
25
+ this.parent = parent;
26
+ this.depth = parent ? parent.depth + 1 : 0;
27
+ }
28
+
29
+ get(name: string): string | undefined {
30
+ for (let at: CustomProps | null = this; at; at = at.parent) {
31
+ const value = at.own.get(name);
32
+ if (value !== undefined) return value ?? undefined;
33
+ }
34
+ return undefined;
35
+ }
36
+
37
+ /** The whole chain as one link, with the same answers. */
38
+ private folded(): CustomProps {
39
+ const out = new CustomProps(null);
40
+ const links: CustomProps[] = [];
41
+ for (let at: CustomProps | null = this; at; at = at.parent) links.push(at);
42
+ for (let i = links.length - 1; i >= 0; i -= 1) {
43
+ for (const [name, value] of links[i].own) {
44
+ if (value === null) out.own.delete(name);
45
+ else out.own.set(name, value);
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ }
51
+
52
+ const FOLD_DEPTH = 16;
53
+
54
+ /**
55
+ * The custom properties an element has: `own`, its declarations in cascade
56
+ * order, over `parent`'s. A `var()` in one of its own is resolved against
57
+ * the rest, and one that names a property in a cycle with it, or none with
58
+ * no fallback, leaves it no value at all (CSS Custom Properties 1 2.3, 3).
59
+ */
60
+ export function customProperties(
61
+ own: ReadonlyMap<string, string>,
62
+ parent: CustomProps | null,
63
+ ): CustomProps {
64
+ const out = new CustomProps(parent);
65
+ for (const [name, value] of own) {
66
+ const keyword = value.trim().toLowerCase();
67
+ if (keyword === 'initial') {
68
+ out.own.set(name, null);
69
+ } else if (
70
+ keyword === 'inherit' ||
71
+ keyword === 'unset' ||
72
+ keyword === 'revert' ||
73
+ keyword === 'revert-layer'
74
+ ) {
75
+ // a custom property inherits, so each of these is its parent's
76
+ out.own.set(name, parent?.get(name) ?? null);
77
+ } else {
78
+ out.own.set(name, value);
79
+ }
80
+ }
81
+ const state = new Map<string, boolean>();
82
+ const stack: string[] = [];
83
+ const cyclic = new Set<string>();
84
+ const visit = (name: string): string | undefined => {
85
+ // an inherited one was resolved where it was declared
86
+ if (!own.has(name)) return parent?.get(name);
87
+ const done = state.get(name);
88
+ if (done === false) {
89
+ // on the stack: a cycle, and nothing in it has a value, whatever
90
+ // its fallbacks say
91
+ for (let i = stack.lastIndexOf(name); i < stack.length; i += 1) {
92
+ cyclic.add(stack[i]);
93
+ }
94
+ return undefined;
95
+ }
96
+ if (done === true) return out.own.get(name) ?? undefined;
97
+ state.set(name, false);
98
+ stack.push(name);
99
+ const raw = out.own.get(name);
100
+ if (raw && hasVar(raw)) {
101
+ const value = substitute(raw, visit);
102
+ out.own.set(name, value === null || cyclic.has(name) ? null : value);
103
+ }
104
+ stack.pop();
105
+ state.set(name, true);
106
+ return out.own.get(name) ?? undefined;
107
+ };
108
+ for (const name of own.keys()) visit(name);
109
+ return out;
110
+ }
111
+
112
+ /**
113
+ * `substitute`, remembered for the properties it was asked against: the
114
+ * elements under one that sets custom properties share its `CustomProps`,
115
+ * so a `var()` a utility class writes is replaced once for all of them.
116
+ * What is remembered goes with the properties. With none, there is nothing
117
+ * to key it on that would go, and only fallbacks to read.
118
+ */
119
+ export function substituteIn(
120
+ value: string,
121
+ props: CustomProps | null,
122
+ ): string | null {
123
+ if (!props) return substitute(value, null);
124
+ let memo = SUBSTITUTED.get(props);
125
+ if (!memo) {
126
+ memo = new Map();
127
+ SUBSTITUTED.set(props, memo);
128
+ }
129
+ const hit = memo.get(value);
130
+ if (hit !== undefined) return hit;
131
+ const out = substitute(value, props);
132
+ memo.set(value, out);
133
+ return out;
134
+ }
135
+
136
+ const SUBSTITUTED = new WeakMap<CustomProps, Map<string, string | null>>();
137
+
138
+ /** Whether a value has a `var()` in it. */
139
+ export function hasVar(value: string): boolean {
140
+ return VAR.test(value);
141
+ }
142
+
143
+ /**
144
+ * Whether each `var()` in a value is one: closed, naming a custom property,
145
+ * and with a fallback, if it has one, that could be a declaration's value —
146
+ * no `;` or `!` outside its brackets, no string a newline cuts off. One that
147
+ * is not makes its declaration invalid as it is parsed, not as it is used,
148
+ * so the declaration before it stands (CSS Custom Properties 1 3).
149
+ */
150
+ export function validVars(value: string): boolean {
151
+ let i = 0;
152
+ for (;;) {
153
+ const at = findVar(value, i);
154
+ if (at < 0) return true;
155
+ const open = at + 4;
156
+ const close = closingParen(value, open);
157
+ if (close < 0) return false;
158
+ const inner = value.slice(open, close);
159
+ const comma = topLevelComma(inner);
160
+ const name = (comma < 0 ? inner : inner.slice(0, comma)).trim();
161
+ if (!NAME.test(name)) return false;
162
+ if (comma >= 0) {
163
+ const fallback = inner.slice(comma + 1);
164
+ if (topLevel(fallback, ';') >= 0 || topLevel(fallback, '!') >= 0) {
165
+ return false;
166
+ }
167
+ if (hasVar(fallback) && !validVars(fallback)) return false;
168
+ }
169
+ i = close + 1;
170
+ }
171
+ }
172
+
173
+ /** A name a `var()` may give: two dashes, and name characters. `--` alone
174
+ * names nothing a declaration can set, and so falls back. */
175
+ const NAME =
176
+ /^--(?:[\w-]|[^\x00-\x7f]|\\[0-9a-f]{1,6}[ \t\n\r\f]?|\\[^0-9a-f\n\r\f])*$/i;
177
+
178
+ /** A name with its escapes read: `--\30 ` is `--0`. */
179
+ function unescapeName(name: string): string {
180
+ if (!name.includes('\\')) return name;
181
+ return name.replace(
182
+ /\\(?:([0-9a-f]{1,6})[ \t\n\r\f]?|([\s\S]))/gi,
183
+ (_, hex: string | undefined, ch: string | undefined) => {
184
+ if (!hex) return ch ?? '';
185
+ // nothing, a surrogate or past Unicode is the replacement character,
186
+ // as CSS reads it, where `fromCodePoint` would throw
187
+ const code = parseInt(hex, 16);
188
+ const valid =
189
+ code > 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff);
190
+ return String.fromCodePoint(valid ? code : 0xfffd);
191
+ },
192
+ );
193
+ }
194
+
195
+ const VAR = /(?:^|[^\w-])var\(/i;
196
+
197
+ /**
198
+ * `value` with each `var()` in it replaced by the custom property it names,
199
+ * or by its fallback where there is none — or null where there is neither,
200
+ * which makes the declaration invalid at computed-value time. A value is
201
+ * put in with a space either side, so what the tokenizer would not join
202
+ * is not joined: `var(--size)px` is no length.
203
+ */
204
+ export function substitute(
205
+ value: string,
206
+ lookup: CustomProps | ((name: string) => string | undefined) | null,
207
+ ): string | null {
208
+ const get =
209
+ typeof lookup === 'function' ? lookup : (name: string) => lookup?.get(name);
210
+ let out = '';
211
+ let i = 0;
212
+ for (;;) {
213
+ const at = findVar(value, i);
214
+ if (at < 0) break;
215
+ const open = at + 4;
216
+ const close = closingParen(value, open);
217
+ if (close < 0) return null;
218
+ const inner = value.slice(open, close);
219
+ const comma = topLevelComma(inner);
220
+ const name = (comma < 0 ? inner : inner.slice(0, comma)).trim();
221
+ if (!NAME.test(name)) return null;
222
+ let replacement = get(unescapeName(name));
223
+ if (replacement === undefined) {
224
+ if (comma < 0) return null;
225
+ const fallback = inner.slice(comma + 1);
226
+ const resolved = hasVar(fallback) ? substitute(fallback, get) : fallback;
227
+ if (resolved === null) return null;
228
+ replacement = resolved;
229
+ }
230
+ out += `${value.slice(i, at)} ${replacement.trim()} `;
231
+ i = close + 1;
232
+ }
233
+ return (out + value.slice(i)).trim();
234
+ }
235
+
236
+ /** Where the next `var(` that is a function of its own starts, from `from`. */
237
+ function findVar(value: string, from: number): number {
238
+ const lower = value.toLowerCase();
239
+ let at = lower.indexOf('var(', from);
240
+ while (at > 0 && /[\w-]/.test(value[at - 1])) {
241
+ at = lower.indexOf('var(', at + 4);
242
+ }
243
+ return at;
244
+ }
245
+
246
+ /** The `)` that closes a bracket opened just before `from`, strings and
247
+ * brackets inside it passed over; -1 where none does. */
248
+ function closingParen(value: string, from: number): number {
249
+ let depth = 0;
250
+ for (let i = from; i < value.length; i += 1) {
251
+ const c = value[i];
252
+ if (c === '\\') {
253
+ i += 1;
254
+ } else if (c === '"' || c === "'") {
255
+ const end = stringEnd(value, i);
256
+ if (end < 0) return -1;
257
+ i = end;
258
+ } else if (c === '(' || c === '[' || c === '{') {
259
+ depth += 1;
260
+ } else if (c === ')' || c === ']' || c === '}') {
261
+ if (depth === 0) return c === ')' ? i : -1;
262
+ depth -= 1;
263
+ }
264
+ }
265
+ // the end of a style sheet closes what it leaves open (CSS Syntax 3 5.4)
266
+ return value.length;
267
+ }
268
+
269
+ /** Where a string opened at `at` closes: its quote, or the end, which
270
+ * closes it too — or -1 where a newline cuts it off, a bad string. */
271
+ function stringEnd(value: string, at: number): number {
272
+ const quote = value[at];
273
+ for (let i = at + 1; i < value.length; i += 1) {
274
+ const c = value[i];
275
+ if (c === '\\') i += 1;
276
+ else if (c === quote) return i;
277
+ else if (c === '\n' || c === '\r' || c === '\f') return -1;
278
+ }
279
+ return value.length;
280
+ }
281
+
282
+ /** Whether a bracket closes that nothing opened, which no value holds. */
283
+ export function unbalanced(value: string): boolean {
284
+ const open: string[] = [];
285
+ for (let i = 0; i < value.length; i += 1) {
286
+ const c = value[i];
287
+ if (c === '\\') {
288
+ i += 1;
289
+ } else if (c === '"' || c === "'") {
290
+ const end = stringEnd(value, i);
291
+ if (end < 0) return true;
292
+ i = end;
293
+ } else if (c === '(' || c === '[' || c === '{') {
294
+ open.push(c === '(' ? ')' : c === '[' ? ']' : '}');
295
+ } else if (c === ')' || c === ']' || c === '}') {
296
+ if (open.pop() !== c) return true;
297
+ }
298
+ }
299
+ return false;
300
+ }
301
+
302
+ /** The first `ch` outside brackets and strings, or -1. */
303
+ function topLevel(value: string, ch: string): number {
304
+ let depth = 0;
305
+ for (let i = 0; i < value.length; i += 1) {
306
+ const c = value[i];
307
+ if (c === '\\') {
308
+ i += 1;
309
+ } else if (c === '"' || c === "'") {
310
+ const end = stringEnd(value, i);
311
+ if (end < 0) return -1;
312
+ i = end;
313
+ } else if (c === '(' || c === '[' || c === '{') {
314
+ depth += 1;
315
+ } else if (c === ')' || c === ']' || c === '}') {
316
+ depth -= 1;
317
+ } else if (c === ch && depth === 0) {
318
+ // `<!--` is a token of its own, and no `!`
319
+ if (ch === '!' && value[i - 1] === '<' && value.startsWith('--', i + 1)) {
320
+ continue;
321
+ }
322
+ return i;
323
+ }
324
+ }
325
+ return -1;
326
+ }
327
+
328
+ /** The first comma not inside a bracket or a string, or -1. */
329
+ function topLevelComma(value: string): number {
330
+ let depth = 0;
331
+ for (let i = 0; i < value.length; i += 1) {
332
+ const c = value[i];
333
+ if (c === '\\') {
334
+ i += 1;
335
+ } else if (c === '"' || c === "'") {
336
+ const end = value.indexOf(c, i + 1);
337
+ if (end < 0) return -1;
338
+ i = end;
339
+ } else if (c === '(' || c === '[' || c === '{') {
340
+ depth += 1;
341
+ } else if (c === ')' || c === ']' || c === '}') {
342
+ depth -= 1;
343
+ } else if (c === ',' && depth === 0) {
344
+ return i;
345
+ }
346
+ }
347
+ return -1;
348
+ }
package/src/html/dom.ts CHANGED
@@ -36,27 +36,74 @@ export { Element, Text, Comment } from 'domhandler';
36
36
  * set is here because the box builder has to skip the same ones. */
37
37
  const RAW_TEXT = new Set(['script', 'style', 'textarea', 'title']);
38
38
 
39
- /** Never rendered, whatever the stylesheet says. `<script>` and `<style>`
40
- * are consumed by the seams instead; the rest have no visual box in the
41
- * subset this renders. */
42
- export const NON_RENDERED = new Set([
43
- 'script',
44
- 'style',
45
- 'head',
39
+ /** Never rendered, whatever the stylesheet says: a `<template>`'s
40
+ * content is inert. The rest of what has no box of its own — `<head>` and
41
+ * what is in it, `<script>`, `<style>` — is `display: none` by the UA
42
+ * sheet, and shown where an author's sheet says otherwise, as a browser
43
+ * shows it: `head, meta { display: block }` makes a `<meta>`'s `::before`
44
+ * a line of the page. */
45
+ export const NON_RENDERED = new Set(['template']);
46
+
47
+ /** What the HTML parser puts in `<head>`. Where the markup has no `<head>`
48
+ * around it, at the top of the document, it is still the head's, which a
49
+ * browser implies and the UA sheet hides: `* { display: block }` shows no
50
+ * `<title>` or `<style>` there (`inImpliedHead`). */
51
+ const HEAD_CONTENT = new Set([
52
+ 'title',
46
53
  'meta',
47
54
  'link',
48
- 'title',
55
+ 'style',
56
+ 'script',
49
57
  'base',
50
- 'template',
58
+ 'basefont',
59
+ 'bgsound',
60
+ 'noframes',
51
61
  'noscript',
62
+ 'template',
52
63
  ]);
53
64
 
65
+ /** Whether an element is head content with no `<head>` around it: at the
66
+ * top of the document or right under `<html>`. */
67
+ export function inImpliedHead(el: Element, tag: string): boolean {
68
+ if (!HEAD_CONTENT.has(tag)) return false;
69
+ const parent = el.parent;
70
+ return !parent || !isElement(parent) || tagOf(parent) === 'html';
71
+ }
72
+
54
73
  /** An element's tag name, lowercased — htmlparser2 already lowercases in
55
- * HTML mode, so this is the assertion rather than the work. */
74
+ * HTML mode, so this is the assertion rather than the work. An SVG root
75
+ * under a prefix (`isSvgRoot`) is `svg`, which is what a type selector and
76
+ * everything else here that asks for the tag sees. */
56
77
  export function tagOf(node: AnyNode): string {
57
- return node.type === 'tag' || node.type === 'script' || node.type === 'style'
58
- ? (node as Element).name.toLowerCase()
59
- : '';
78
+ if (node.type !== 'tag' && node.type !== 'script' && node.type !== 'style') {
79
+ return '';
80
+ }
81
+ const name = (node as Element).name.toLowerCase();
82
+ return name.endsWith(':svg') && isSvgRoot(node as Element) ? 'svg' : name;
83
+ }
84
+
85
+ const SVG_NS = 'http://www.w3.org/2000/svg';
86
+
87
+ /**
88
+ * Whether an element is the root of an SVG drawing. The HTML parser names
89
+ * an inline `<svg>` plainly; XHTML may bind a prefix to the SVG namespace
90
+ * (`<svg:svg xmlns:svg="http://www.w3.org/2000/svg">`), which is the same
91
+ * element to an XML parser, and is honoured where the prefix is declared.
92
+ * Only SVG's: a Word document's `<o:p>` under `xmlns:o` is not a paragraph,
93
+ * to this any more than to a browser reading it as HTML.
94
+ */
95
+ export function isSvgRoot(el: Element): boolean {
96
+ const name = el.name.toLowerCase();
97
+ if (name === 'svg') return true;
98
+ if (!name.endsWith(':svg')) return false;
99
+ const declaration = `xmlns:${name.slice(0, -4)}`;
100
+ for (let node: Element | null = el; node;) {
101
+ const bound = node.attribs[declaration];
102
+ if (bound !== undefined) return bound === SVG_NS;
103
+ const parent: ParentNode | null = node.parent;
104
+ node = parent && parent.type === 'tag' ? (parent as Element) : null;
105
+ }
106
+ return false;
60
107
  }
61
108
 
62
109
  export function isElement(node: AnyNode | null | undefined): node is Element {
@@ -84,6 +131,20 @@ export function attr(el: Element, name: string): string | undefined {
84
131
  return el.attribs?.[name];
85
132
  }
86
133
 
134
+ /** Where an image element's image is: an `<img>`'s `src`, an `<object>`'s
135
+ * `data` — which is shown as an image when it is one (HTML's "the object
136
+ * element"), and as the element's fallback content otherwise — an
137
+ * `<embed>`'s `src` the same, and a `<video>`'s `poster`, the frame it
138
+ * shows until it plays, which here it does not. */
139
+ export function imageUrlOf(el: Element): string | undefined {
140
+ const tag = tagOf(el);
141
+ return tag === 'object'
142
+ ? attr(el, 'data')
143
+ : tag === 'video'
144
+ ? attr(el, 'poster')
145
+ : attr(el, 'src');
146
+ }
147
+
87
148
  /** The text under a node, uncollapsed — what `<style>` hands the CSS parser
88
149
  * and what a `<script>` seam is given. */
89
150
  export function rawTextOf(node: AnyNode): string {
@@ -141,6 +202,9 @@ export interface DocumentFacts {
141
202
  resources: Element[];
142
203
  /** `<title>`, when the document had one. */
143
204
  title: string | null;
205
+ /** The first `<base>` with an `href`, as written: the document's base URL
206
+ * wherever in the document it stands (HTML 2.5.3). */
207
+ base: string | null;
144
208
  }
145
209
 
146
210
  export type SheetRef =
@@ -273,10 +337,19 @@ export class HtmlSource {
273
337
  }
274
338
  } else if (tag === 'script') {
275
339
  facts.scripts.push(el);
276
- } else if (tag === 'img' || tag === 'image') {
277
- if (attr(el, 'src')) facts.resources.push(el);
340
+ } else if (
341
+ tag === 'img' ||
342
+ tag === 'image' ||
343
+ tag === 'object' ||
344
+ tag === 'embed' ||
345
+ tag === 'video'
346
+ ) {
347
+ if (imageUrlOf(el)) facts.resources.push(el);
278
348
  } else if (tag === 'title' && facts.title === null) {
279
349
  facts.title = rawTextOf(el).trim();
350
+ } else if (tag === 'base' && facts.base === null) {
351
+ const href = attr(el, 'href');
352
+ if (href !== undefined) facts.base = href;
280
353
  }
281
354
  }
282
355
  this._facts = facts;
@@ -296,11 +369,205 @@ interface ScannedFacts extends DocumentFacts {
296
369
  }
297
370
 
298
371
  function freshFacts(): ScannedFacts {
299
- return { sheets: [], scripts: [], resources: [], title: null, scanned: -1 };
372
+ return {
373
+ sheets: [],
374
+ scripts: [],
375
+ resources: [],
376
+ title: null,
377
+ base: null,
378
+ scanned: -1,
379
+ };
380
+ }
381
+
382
+ /**
383
+ * domhandler's handler, with the one rule of HTML's tree construction about
384
+ * text that htmlparser2 leaves out: a newline straight after the start tag
385
+ * of a `<pre>`, a `<listing>` or a `<textarea>` is not content (HTML
386
+ * 13.2.6.4.7, "newlines at the start of pre blocks are ignored as an
387
+ * authoring convenience"). Without it every code block written `<pre>` and
388
+ * a line break began with an empty line. A chunk of a stream that ends
389
+ * between the tag and the newline keeps the rule, since the handler does.
390
+ */
391
+ class Handler extends DomHandler {
392
+ private _afterPre = false;
393
+ /** A written `<html>` at the top of the document, and the document's
394
+ * body, written or implied: where HTML's parser puts content the markup
395
+ * leaves outside them. */
396
+ private _html: Element | null = null;
397
+ private _body: Element | null = null;
398
+
399
+ /**
400
+ * Past `MAX_DEPTH` open elements, what is opened goes into the element at
401
+ * that depth rather than into the one open, still open itself so its end
402
+ * tag closes it: Chrome's parser does the same past 512. Everything that
403
+ * walks a document here — the cascade, the box builder, layout, paint —
404
+ * goes a call deeper for each level, and a page of a few hundred unclosed
405
+ * `<div>`s, which a broken generator writes, ran the stack out.
406
+ */
407
+ protected override addNode(node: ChildNode): void {
408
+ const stack = this.tagStack;
409
+ if (stack.length <= MAX_DEPTH) {
410
+ super.addNode(node);
411
+ return;
412
+ }
413
+ const parent = stack[MAX_DEPTH - 1];
414
+ const previous = parent.children[parent.children.length - 1];
415
+ parent.children.push(node);
416
+ if (previous) {
417
+ node.prev = previous;
418
+ previous.next = node;
419
+ }
420
+ node.parent = parent;
421
+ this.lastNode = null;
422
+ }
423
+
424
+ /**
425
+ * HTML's parser puts a document's content in a `<body>` whether or not
426
+ * the markup wrote one, and htmlparser2's puts it where it stands. So
427
+ * with a written `<html>`, the first thing that is not head content opens
428
+ * the body it goes in (HTML 13.2.6.4.6, "after head"); without one, a
429
+ * `<body>` written after content takes that content in, which HTML's
430
+ * parser had put in the body it implied; and what comes after the body
431
+ * has ended goes back into it ("after body"), as does a second
432
+ * `<body>`'s attributes. Without it the root box stood in for a body
433
+ * around the `<html>`, and a first paragraph's margin stood below the
434
+ * body's rather than collapsing with it. A fragment — no `<html>`, no
435
+ * `<body>` — is left as it was written, and the root box stands in.
436
+ */
437
+ override onopentag(name: string, attribs: Record<string, string>): void {
438
+ if (name === 'body' && this._body) {
439
+ // a second body is its attributes, on the first; the parser will end
440
+ // it, so what it ends is the body outside one, or else what is open
441
+ for (const key in attribs) this._body.attribs[key] ??= attribs[key];
442
+ const stack = this.tagStack;
443
+ if (this._outsideBody()) this._reopen();
444
+ else stack.push(stack[stack.length - 1]);
445
+ this._afterPre = false;
446
+ return;
447
+ }
448
+ if (this._outsideBody()) {
449
+ if (this._body) {
450
+ if (name !== 'html') this._reopen();
451
+ } else if (this._html && inBody(name)) this._reopen();
452
+ }
453
+ super.onopentag(name, attribs);
454
+ const opened = this.tagStack[this.tagStack.length - 1] as Element;
455
+ if (name === 'html' && !this._html && opened.parent === this.root) {
456
+ this._html = opened;
457
+ } else if (name === 'body' && !this._body) {
458
+ if (opened.parent === this._html) this._body = opened;
459
+ else if (!this._html && opened.parent === this.root) {
460
+ this._body = opened;
461
+ this._adopt(opened);
462
+ }
463
+ }
464
+ this._afterPre =
465
+ name === 'pre' || name === 'listing' || name === 'textarea';
466
+ }
467
+
468
+ /** Whether what is open is the top of the document, or the written
469
+ * `<html>`: where content is outside any body. */
470
+ private _outsideBody(): boolean {
471
+ const top = this.tagStack[this.tagStack.length - 1];
472
+ return top === this.root || (top === this._html && top !== null);
473
+ }
474
+
475
+ /** Open the `<html>` and its body again, or the body for the first time.
476
+ * The parser never saw them open, so it closes them in the place of what
477
+ * it did open — which is where they would end anyway. */
478
+ private _reopen(): void {
479
+ const stack = this.tagStack;
480
+ if (stack[stack.length - 1] === this.root && this._html) {
481
+ stack.push(this._html);
482
+ }
483
+ if (this._body) stack.push(this._body);
484
+ else {
485
+ super.onopentag('body', {});
486
+ this._body = stack[stack.length - 1] as Element;
487
+ }
488
+ this.lastNode = null;
489
+ }
490
+
491
+ /** Move into a `<body>` written at the top of the document what went
492
+ * before it there from the first thing that is not head content on. */
493
+ private _adopt(body: Element): void {
494
+ const kids = this.root.children;
495
+ const end = kids.length - 1;
496
+ let start = 0;
497
+ while (start < end && !startsBody(kids[start])) start += 1;
498
+ if (start === end) return;
499
+ const moved = kids.splice(start, end - start);
500
+ const before = kids[start - 1] ?? null;
501
+ body.prev = before;
502
+ if (before) before.next = body;
503
+ moved[0].prev = null;
504
+ moved[moved.length - 1].next = null;
505
+ for (const node of moved) node.parent = body;
506
+ body.children.unshift(...moved);
507
+ if (body.children.length > moved.length) {
508
+ const first = body.children[moved.length];
509
+ first.prev = moved[moved.length - 1];
510
+ moved[moved.length - 1].next = first;
511
+ }
512
+ }
513
+
514
+ override onclosetag(): void {
515
+ this._afterPre = false;
516
+ super.onclosetag();
517
+ }
518
+
519
+ override oncomment(data: string): void {
520
+ this._afterPre = false;
521
+ super.oncomment(data);
522
+ }
523
+
524
+ override ontext(data: string): void {
525
+ if (
526
+ (this._html || this._body) &&
527
+ NOT_SPACE.test(data) &&
528
+ this._outsideBody()
529
+ ) {
530
+ this._reopen();
531
+ }
532
+ if (this._afterPre) {
533
+ this._afterPre = false;
534
+ const skip = data.startsWith('\r\n') ? 2 : data.startsWith('\n') ? 1 : 0;
535
+ if (skip) {
536
+ if (data.length === skip) return;
537
+ data = data.slice(skip);
538
+ }
539
+ }
540
+ super.ontext(data);
541
+ }
542
+ }
543
+
544
+ /** How deep a document's elements nest (`Handler.addNode`). */
545
+ const MAX_DEPTH = 256;
546
+
547
+ /** Text that is not all the white space HTML's parser leaves in the head. */
548
+ const NOT_SPACE = /[^ \t\n\f\r]/;
549
+
550
+ /** Whether an element opened before the body goes in the body HTML's
551
+ * parser implies, rather than in the head or the `<html>` itself. */
552
+ function inBody(name: string): boolean {
553
+ return (
554
+ name !== 'body' &&
555
+ name !== 'frameset' &&
556
+ name !== 'head' &&
557
+ name !== 'html' &&
558
+ !HEAD_CONTENT.has(name)
559
+ );
560
+ }
561
+
562
+ /** Whether a node at the top of a document is where HTML's parser would
563
+ * have opened the body: an element that goes in one, or text. */
564
+ function startsBody(node: ChildNode): boolean {
565
+ if (node instanceof Element) return inBody(node.name);
566
+ return node instanceof Text && NOT_SPACE.test(node.data);
300
567
  }
301
568
 
302
569
  function createParser(): { parser: Parser; handler: DomHandler } {
303
- const handler = new DomHandler(null, {
570
+ const handler = new Handler(null, {
304
571
  // Positions cost time and memory per node and nothing here reads them.
305
572
  withStartIndices: false,
306
573
  withEndIndices: false,