@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,504 @@
1
+ // SVG, drawn.
2
+ //
3
+ // An inline `<svg>` and an SVG image are drawn by ntk's `SvgView`, over the
4
+ // same 2d context as the rest of the document — the drawing core's own
5
+ // `<svg>` element uses. It is reached through `react-x11/ntk`, which
6
+ // re-exports ntk whole: `SvgView` is a runtime export the subpath's
7
+ // declarations do not name, so it is read off the namespace and probed, the
8
+ // way `resources.ts` reaches `decodeImage`. Without it an SVG is a box of its
9
+ // size with nothing drawn in it, which is what it was before.
10
+ //
11
+ // What is here is the part CSS and SVG own between them: an SVG's intrinsic
12
+ // width, height and ratio, which size its box (CSS 2.1 10.3.2, SVG 2's
13
+ // intrinsic sizing), and its viewport — the `viewBox` scaled into the box
14
+ // as `preserveAspectRatio` says, and clipped to it.
15
+ import { parseDocument } from 'htmlparser2';
16
+ import { Element, Text } from 'domhandler';
17
+ import type { ChildNode } from 'domhandler';
18
+ import * as ntk from 'react-x11/ntk';
19
+ import { isSvgRoot } from './dom.js';
20
+ import { inkColor, isTransparent, parseColor } from './css/values.js';
21
+
22
+ export { isSvgRoot };
23
+
24
+ /** What an image says about its own size, in CSS pixels: a width and a
25
+ * height — a raster image always has both, an SVG those that are absolute
26
+ * lengths — and its ratio, width over height, or 0 where it has none. */
27
+ export interface IntrinsicSize {
28
+ width: number | null;
29
+ height: number | null;
30
+ ratio: number;
31
+ }
32
+
33
+ function svgAttr(el: Element, name: string): string | undefined {
34
+ // an XML parse keeps SVG's camelCase, an HTML one lowercases it
35
+ return el.attribs[name] ?? el.attribs[name.toLowerCase()];
36
+ }
37
+
38
+ /** CSS pixels per unit, for the absolute units. */
39
+ const ABSOLUTE: Record<string, number> = {
40
+ '': 1,
41
+ px: 1,
42
+ pt: 4 / 3,
43
+ pc: 16,
44
+ in: 96,
45
+ cm: 96 / 2.54,
46
+ mm: 96 / 25.4,
47
+ q: 96 / 101.6,
48
+ };
49
+
50
+ const LENGTH = /^\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?)\s*([a-z]*)\s*$/i;
51
+
52
+ /** An SVG `width` or `height` in CSS pixels, where it is an absolute length.
53
+ * A percentage, `auto` and anything unparseable are no length at all, and
54
+ * a negative one is an error, which is the same. */
55
+ function absoluteLength(
56
+ value: string | undefined,
57
+ fontSize: number,
58
+ ): number | null {
59
+ if (value === undefined) return null;
60
+ const m = LENGTH.exec(value);
61
+ if (!m) return null;
62
+ const n = parseFloat(m[1]);
63
+ const unit = m[2].toLowerCase();
64
+ let px: number;
65
+ if (unit in ABSOLUTE) px = n * ABSOLUTE[unit];
66
+ else if (unit === 'em') px = n * fontSize;
67
+ else if (unit === 'ex') px = (n * fontSize) / 2;
68
+ else return null;
69
+ return px >= 0 ? px : null;
70
+ }
71
+
72
+ /**
73
+ * The `width`/`height` of an inline `<svg>` as CSS: they are presentation
74
+ * attributes for the properties of the same names (SVG 2, 5.1.1), so
75
+ * `height="50%"` is a percentage of the containing block like a style's.
76
+ * A bare number is pixels; null for what CSS would not parse.
77
+ */
78
+ export function svgSizeHint(value: string): string | null {
79
+ const v = value.trim();
80
+ if (/^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?%$/i.test(v)) return v;
81
+ const m = LENGTH.exec(v);
82
+ if (!m) return null;
83
+ return m[2] ? v : `${parseFloat(m[1])}px`;
84
+ }
85
+
86
+ function viewBoxParts(el: Element): [number, number, number, number] | null {
87
+ const parts = (svgAttr(el, 'viewBox') ?? '')
88
+ .trim()
89
+ .split(/[\s,]+/)
90
+ .map(Number);
91
+ if (parts.length !== 4 || !parts.every(Number.isFinite)) return null;
92
+ return [parts[0], parts[1], parts[2], parts[3]];
93
+ }
94
+
95
+ function viewBoxOf(el: Element): [number, number, number, number] | null {
96
+ const parts = viewBoxParts(el);
97
+ // a zero or negative extent: as though there were none (see `drawsNothing`)
98
+ return parts && parts[2] > 0 && parts[3] > 0 ? parts : null;
99
+ }
100
+
101
+ /** Whether a `viewBox` with a zero width or height disables the drawing,
102
+ * as SVG has it: a negative one is an error and as though there were no
103
+ * `viewBox`, but a zero one is a drawing of nothing. */
104
+ function drawsNothing(el: Element): boolean {
105
+ const parts = viewBoxParts(el);
106
+ return (
107
+ parts !== null &&
108
+ parts[2] >= 0 &&
109
+ parts[3] >= 0 &&
110
+ (parts[2] === 0 || parts[3] === 0)
111
+ );
112
+ }
113
+
114
+ /**
115
+ * An SVG root's intrinsic size and ratio (SVG 2, "Intrinsic sizing
116
+ * properties of the viewport of SVG images"): its `width` and `height` where
117
+ * they are absolute, and a ratio from those two, or else from its `viewBox`.
118
+ * `fontSize` is what an `em` in them is, in CSS pixels.
119
+ */
120
+ export function svgIntrinsics(el: Element, fontSize = 16): IntrinsicSize {
121
+ const width = absoluteLength(svgAttr(el, 'width'), fontSize);
122
+ const height = absoluteLength(svgAttr(el, 'height'), fontSize);
123
+ let ratio = 0;
124
+ if (width !== null && height !== null && width > 0 && height > 0) {
125
+ ratio = width / height;
126
+ } else {
127
+ const box = viewBoxOf(el);
128
+ if (box) ratio = box[2] / box[3];
129
+ }
130
+ return { width, height, ratio };
131
+ }
132
+
133
+ /** The slice of ntk's `SvgView` this draws with. */
134
+ interface SvgViewLike {
135
+ naturalWidth: number;
136
+ naturalHeight: number;
137
+ setSvgDom(element: Element): unknown;
138
+ draw(
139
+ ctx: unknown,
140
+ x: number,
141
+ y: number,
142
+ w: number,
143
+ h: number,
144
+ opts?: { color?: string },
145
+ ): void;
146
+ }
147
+
148
+ type SvgViewConstructor = new (window: null) => SvgViewLike;
149
+
150
+ function svgViewClass(): SvgViewConstructor | null {
151
+ const ctor = (ntk as unknown as Record<string, unknown>).SvgView;
152
+ return typeof ctor === 'function' ? (ctor as SvgViewConstructor) : null;
153
+ }
154
+
155
+ /** The context slice an SVG needs besides what `SvgView` itself calls. */
156
+ interface ClipContext {
157
+ save(): void;
158
+ restore(): void;
159
+ beginPath?(): void;
160
+ rect?(x: number, y: number, w: number, h: number): void;
161
+ clip?(): void;
162
+ fill?: unknown;
163
+ fillStyle?: unknown;
164
+ fillRect?(x: number, y: number, w: number, h: number): void;
165
+ }
166
+
167
+ const ALIGN = /^x(Min|Mid|Max)Y(Min|Mid|Max)$/;
168
+ const AT: Record<string, number> = { Min: 0, Mid: 0.5, Max: 1 };
169
+
170
+ /**
171
+ * One SVG drawing: an inline `<svg>` element, or an SVG image's document.
172
+ * The `SvgView` is made at the first draw, so a document whose drawings are
173
+ * never scrolled to never pays for them.
174
+ */
175
+ export class SvgDrawing {
176
+ readonly intrinsics: IntrinsicSize;
177
+ private readonly _root: Element;
178
+ private _view: SvgViewLike | null = null;
179
+ /** What the view was last handed the tree for: the root's child count
180
+ * and last child — a streamed document grows an inline drawing after its
181
+ * first paint — and, for a drawing with percentages in it, the viewport
182
+ * they were resolved against. */
183
+ private _seen = -1;
184
+ private _seenLast: ChildNode | null = null;
185
+ private _seenViewport = '';
186
+ /** Whether a length in the tree is a percentage of the viewport; null
187
+ * until the tree is first read. */
188
+ private _percent: boolean | null = null;
189
+ private _failed = false;
190
+ /** An SVG image's own document, rather than an element of this one. */
191
+ private readonly _standalone: boolean;
192
+ /** The background an image's root gives its canvas; undefined until it
193
+ * is first read. */
194
+ private _canvas: string | null | undefined = undefined;
195
+
196
+ constructor(root: Element, intrinsics: IntrinsicSize, standalone = false) {
197
+ this._root = root;
198
+ this.intrinsics = intrinsics;
199
+ this._standalone = standalone;
200
+ }
201
+
202
+ /**
203
+ * Draw into a rectangle — the box's content box, in device pixels —
204
+ * clipped to it. The `viewBox`, where there is one, is fitted to it as
205
+ * `preserveAspectRatio` says; without one a user unit is a CSS pixel,
206
+ * which is `scale` device pixels. `color` is `currentColor`.
207
+ */
208
+ draw(
209
+ ctx: ClipContext,
210
+ x: number,
211
+ y: number,
212
+ w: number,
213
+ h: number,
214
+ scale: number,
215
+ color?: string,
216
+ ): void {
217
+ if (this._failed || !(w > 0 && h > 0)) return;
218
+ // the mock backend has no path API, and SvgView draws paths
219
+ if (!ctx.beginPath || !ctx.rect || !ctx.clip || !ctx.fill) return;
220
+ const root = this._root;
221
+ if (drawsNothing(root)) return;
222
+ if (this._standalone) {
223
+ // the root's background is the canvas's, and an image's canvas is
224
+ // all of the rectangle, wherever its viewport and `viewBox` put the
225
+ // drawing (CSS 2.1 14.2): an inline one's is its box's, painted by
226
+ // the document
227
+ this._canvas ??= canvasBackground(root);
228
+ if (this._canvas && ctx.fillRect) {
229
+ ctx.save();
230
+ ctx.fillStyle = inkColor(this._canvas, color ?? '#000000');
231
+ ctx.fillRect(x, y, w, h);
232
+ ctx.restore();
233
+ }
234
+ // An image's root fills the rectangle it is drawn into, whatever its
235
+ // own `width` and `height` say: they are what its intrinsic size was
236
+ // read from (`svgIntrinsics`), and the rectangle is the concrete size
237
+ // the image was then given — a background's tile, an `<img>`'s box.
238
+ // Blink sizes an SVG embedded as an image to its container the same
239
+ // way. Drawn as two fifths of it, `width="40%"` left the rest of a
240
+ // `background-size: contain` empty. An inline root's percentages are
241
+ // its box's, already (`svgSizeHint`).
242
+ }
243
+ const box = viewBoxOf(root);
244
+ // the viewport in user units, which a percentage is of
245
+ const view = box
246
+ ? this._viewFor(box[2], box[3])
247
+ : this._viewFor(w / scale, h / scale);
248
+ if (!view) return;
249
+ ctx.save();
250
+ try {
251
+ ctx.beginPath();
252
+ ctx.rect(x, y, w, h);
253
+ ctx.clip();
254
+ const opts = color ? { color } : undefined;
255
+ if (!box) {
256
+ view.draw(
257
+ ctx,
258
+ x,
259
+ y,
260
+ view.naturalWidth * scale,
261
+ view.naturalHeight * scale,
262
+ opts,
263
+ );
264
+ } else {
265
+ const fit = (svgAttr(root, 'preserveAspectRatio') ?? '')
266
+ .trim()
267
+ .split(/\s+/);
268
+ if (fit[0] === 'defer') fit.shift();
269
+ if (fit[0] === 'none') {
270
+ view.draw(ctx, x, y, w, h, opts);
271
+ } else {
272
+ const align = ALIGN.exec(fit[0] ?? '') ?? ['xMidYMid', 'Mid', 'Mid'];
273
+ const sx = w / box[2];
274
+ const sy = h / box[3];
275
+ const s = fit[1] === 'slice' ? Math.max(sx, sy) : Math.min(sx, sy);
276
+ const dw = box[2] * s;
277
+ const dh = box[3] * s;
278
+ view.draw(
279
+ ctx,
280
+ x + (w - dw) * AT[align[1]],
281
+ y + (h - dh) * AT[align[2]],
282
+ dw,
283
+ dh,
284
+ opts,
285
+ );
286
+ }
287
+ }
288
+ } catch {
289
+ // a drawing ntk cannot read is left undrawn, once, rather than thrown
290
+ // out of paint on every frame, where nothing could catch it
291
+ this._failed = true;
292
+ } finally {
293
+ ctx.restore();
294
+ }
295
+ }
296
+
297
+ private _viewFor(width: number, height: number): SvgViewLike | null {
298
+ const root = this._root;
299
+ const count = root.children.length;
300
+ const last = root.lastChild;
301
+ const grown = count !== this._seen || last !== this._seenLast;
302
+ if (grown || this._percent === null) this._percent = hasPercent(root);
303
+ const viewport = this._percent ? `${width}x${height}` : '';
304
+ if (this._view && !grown && viewport === this._seenViewport) {
305
+ return this._view;
306
+ }
307
+ const View = svgViewClass();
308
+ if (!View) {
309
+ this._failed = true;
310
+ return null;
311
+ }
312
+ try {
313
+ const view = this._view ?? new View(null);
314
+ view.setSvgDom(
315
+ this._percent || root.name.includes(':')
316
+ ? copyTree(root, this._percent ? [width, height] : null)
317
+ : root,
318
+ );
319
+ this._view = view;
320
+ this._seen = count;
321
+ this._seenLast = last;
322
+ this._seenViewport = viewport;
323
+ return view;
324
+ } catch {
325
+ this._failed = true;
326
+ return null;
327
+ }
328
+ }
329
+ }
330
+
331
+ /**
332
+ * The colour an SVG image's root element sets as its background, in its
333
+ * `style` attribute — the one place an image can say it, since
334
+ * `background-color` is no presentation attribute — or null for none.
335
+ */
336
+ function canvasBackground(root: Element): string | null {
337
+ const style = root.attribs.style;
338
+ if (!style) return null;
339
+ let found: string | null = null;
340
+ for (const declaration of style.split(';')) {
341
+ const colon = declaration.indexOf(':');
342
+ if (colon < 0) continue;
343
+ const name = declaration.slice(0, colon).trim().toLowerCase();
344
+ if (name !== 'background-color' && name !== 'background') continue;
345
+ // a `background` shorthand that is a colour alone, as an image's is
346
+ const color = parseColor(declaration.slice(colon + 1));
347
+ found = color && !isTransparent(color) ? color : null;
348
+ }
349
+ return found;
350
+ }
351
+
352
+ /** Drawings of inline `<svg>` elements, per element: the element is the
353
+ * document's, and outlives the box trees built over it. */
354
+ const INLINE = new WeakMap<Element, SvgDrawing>();
355
+
356
+ /** The drawing of an inline `<svg>`. */
357
+ export function inlineDrawing(el: Element): SvgDrawing {
358
+ let drawing = INLINE.get(el);
359
+ if (!drawing) {
360
+ drawing = new SvgDrawing(el, svgIntrinsics(el));
361
+ INLINE.set(el, drawing);
362
+ }
363
+ return drawing;
364
+ }
365
+
366
+ /** The geometry a percentage of the viewport can give, and of which of its
367
+ * dimensions: its width, its height, or its normalized diagonal (SVG 2,
368
+ * 8.9, "Units"). */
369
+ const PERCENT_OF: Record<string, 'x' | 'y' | 'd'> = {
370
+ x: 'x',
371
+ width: 'x',
372
+ cx: 'x',
373
+ rx: 'x',
374
+ x1: 'x',
375
+ x2: 'x',
376
+ y: 'y',
377
+ height: 'y',
378
+ cy: 'y',
379
+ ry: 'y',
380
+ y1: 'y',
381
+ y2: 'y',
382
+ r: 'd',
383
+ 'stroke-width': 'd',
384
+ };
385
+
386
+ /** What a percentage in it means is not the viewport's: a gradient's are
387
+ * of the box it paints, and `SvgView` reads those itself. */
388
+ const OWN_UNITS = new Set(['lineargradient', 'radialgradient', 'pattern']);
389
+
390
+ function localName(name: string): string {
391
+ const i = name.indexOf(':');
392
+ return (i < 0 ? name : name.slice(i + 1)).toLowerCase();
393
+ }
394
+
395
+ /** Whether a length under the root is a percentage `SvgView` would read as
396
+ * a number: it resolves none against the viewport, so `width="100%"` was
397
+ * a hundred user units. */
398
+ function hasPercent(root: Element): boolean {
399
+ const walk = (el: Element): boolean => {
400
+ for (const child of el.children) {
401
+ if (child.type !== 'tag') continue;
402
+ const tag = child as Element;
403
+ if (OWN_UNITS.has(localName(tag.name))) continue;
404
+ for (const name in tag.attribs) {
405
+ if (PERCENT_OF[name] && tag.attribs[name].trim().endsWith('%')) {
406
+ return true;
407
+ }
408
+ }
409
+ if (walk(tag)) return true;
410
+ }
411
+ return false;
412
+ };
413
+ return walk(root);
414
+ }
415
+
416
+ /**
417
+ * The tree `SvgView` reads, where the document's own will not do: with
418
+ * local names — `SvgView` knows `rect`, not `svg:rect`, and a prefix is
419
+ * dropped only where it is bound to SVG — and with its percentages resolved
420
+ * against a viewport of `[width, height]` user units, where one is given.
421
+ */
422
+ function copyTree(root: Element, viewport: [number, number] | null): Element {
423
+ const colon = root.name.indexOf(':');
424
+ const prefix = colon < 0 ? null : `${root.name.slice(0, colon)}:`;
425
+ const strip = (name: string): string =>
426
+ prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;
427
+ const diagonal = viewport
428
+ ? Math.sqrt((viewport[0] ** 2 + viewport[1] ** 2) / 2)
429
+ : 0;
430
+ const copy = (el: Element, resolve: boolean): Element => {
431
+ const here = resolve && !OWN_UNITS.has(localName(el.name));
432
+ const attribs = { ...el.attribs };
433
+ if (here && viewport && el !== root) {
434
+ for (const name in attribs) {
435
+ const axis = PERCENT_OF[name];
436
+ const value = attribs[name].trim();
437
+ if (!axis || !value.endsWith('%')) continue;
438
+ const pct = parseFloat(value);
439
+ if (!Number.isFinite(pct)) continue;
440
+ const of =
441
+ axis === 'x' ? viewport[0] : axis === 'y' ? viewport[1] : diagonal;
442
+ attribs[name] = String((pct / 100) * of);
443
+ }
444
+ }
445
+ const children: ChildNode[] = [];
446
+ for (const child of el.children) {
447
+ if (child.type === 'tag') children.push(copy(child as Element, here));
448
+ else if (child.type === 'text') children.push(new Text(child.data));
449
+ }
450
+ return new Element(strip(el.name), attribs, children);
451
+ };
452
+ return copy(root, true);
453
+ }
454
+
455
+ /**
456
+ * An SVG image's bytes as a drawing, or null for bytes that are not SVG —
457
+ * which is how a PNG or a JPEG goes on to the image decoder. Nothing names
458
+ * the type, so it is sniffed: markup, with an `<svg>` root.
459
+ */
460
+ export function svgFromBytes(bytes: Uint8Array): SvgDrawing | null {
461
+ let i = bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf ? 3 : 0;
462
+ while (
463
+ bytes[i] === 0x20 ||
464
+ bytes[i] === 0x09 ||
465
+ bytes[i] === 0x0a ||
466
+ bytes[i] === 0x0d
467
+ ) {
468
+ i += 1;
469
+ }
470
+ if (bytes[i] !== 0x3c) return null;
471
+ const text = textOf(bytes);
472
+ if (!/<(?:[a-z0-9_-]+:)?svg[\s>/]/i.test(text)) return null;
473
+ try {
474
+ const doc = parseDocument(text, { xmlMode: true });
475
+ const root = findRoot(doc.children);
476
+ return root ? new SvgDrawing(root, svgIntrinsics(root), true) : null;
477
+ } catch {
478
+ return null;
479
+ }
480
+ }
481
+
482
+ function findRoot(nodes: ChildNode[]): Element | null {
483
+ for (const node of nodes) {
484
+ if (node.type !== 'tag') continue;
485
+ const el = node as Element;
486
+ if (isSvgRoot(el)) return el;
487
+ const inner = findRoot(el.children);
488
+ if (inner) return inner;
489
+ }
490
+ return null;
491
+ }
492
+
493
+ type DecoderConstructor = new (label: string) => {
494
+ decode(input: Uint8Array): string;
495
+ };
496
+
497
+ function textOf(bytes: Uint8Array): string {
498
+ const Decoder = (globalThis as { TextDecoder?: DecoderConstructor })
499
+ .TextDecoder;
500
+ if (Decoder) return new Decoder('utf-8').decode(bytes);
501
+ let out = '';
502
+ for (const b of bytes) out += String.fromCharCode(b);
503
+ return out;
504
+ }
@@ -0,0 +1,86 @@
1
+ // URLs, resolved against a base — when there is one.
2
+ //
3
+ // A document has no base of its own: `<Html>` is handed a string, not a
4
+ // response. The host knows where the string came from, and says so with the
5
+ // `baseUrl` prop; a `<base href>` in the document moves it, as HTML's does.
6
+ // Without either every URL goes to `onResource` and `onLink` exactly as the
7
+ // document wrote it, which is what a host rendering mail or a help page wants
8
+ // and what this component did before it had a base to resolve against.
9
+ //
10
+ // A stylesheet is the other base. `url(../img/a.png)` in `/css/site.css`
11
+ // names `/img/a.png` whichever page linked the sheet, and nothing downstream
12
+ // of the parse knows which sheet a computed value came from — so a sheet
13
+ // whose own URL is known has its `url()`s made absolute as it is parsed
14
+ // (`absoluteUrls` in css/parse.ts), and everything after sees an absolute URL
15
+ // that resolving again leaves as it is.
16
+ //
17
+ // The resolving is WHATWG's, through the runtime's own `URL`: Node, Bun and
18
+ // every browser have one. `types: []` keeps node's declarations out of the
19
+ // build, so it is reached structurally, as `TextDecoder` is in svg.ts.
20
+
21
+ interface UrlLike {
22
+ readonly href: string;
23
+ }
24
+
25
+ type UrlConstructor = new (url: string, base?: string) => UrlLike;
26
+
27
+ /**
28
+ * `url` against `base`, or `url` untouched where there is no base, the
29
+ * runtime has no `URL`, or the pair makes no URL. A `data:` URL is returned
30
+ * as it is rather than put through the parser: it can be a font or an image
31
+ * hundreds of kilobytes long, and it is absolute already.
32
+ */
33
+ export function resolveUrl(
34
+ url: string,
35
+ base: string | null | undefined,
36
+ ): string {
37
+ if (!base) return url;
38
+ // read when asked rather than at import: nothing here runs on load
39
+ const URLClass = (globalThis as { URL?: UrlConstructor }).URL;
40
+ if (!URLClass) return url;
41
+ // HTML strips an attribute's URL of the ASCII white space around it
42
+ const trimmed = url.replace(/^[\t\n\f\r ]+|[\t\n\f\r ]+$/g, '');
43
+ if (/^data:/i.test(trimmed)) return trimmed;
44
+ try {
45
+ return new URLClass(trimmed, base).href;
46
+ } catch {
47
+ return url;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Resolutions against one base, remembered. The paint asks for every image
53
+ * it draws by the URL the markup wrote, on every frame, and a WHATWG parse
54
+ * per image per frame is work for nothing: the answer changes only when the
55
+ * base does, and then the whole memo goes.
56
+ */
57
+ export class UrlResolver {
58
+ private _base: string | null = null;
59
+ private _memo = new Map<string, string>();
60
+
61
+ get base(): string | null {
62
+ return this._base;
63
+ }
64
+
65
+ /** Set the base. True when it changed — everything resolved before is
66
+ * stale then, and so is anything keyed by what it resolved to. */
67
+ setBase(base: string | null): boolean {
68
+ if (base === this._base) return false;
69
+ this._base = base;
70
+ this._memo.clear();
71
+ return true;
72
+ }
73
+
74
+ resolve(url: string): string {
75
+ if (this._base === null) return url;
76
+ let out = this._memo.get(url);
77
+ if (out === undefined) {
78
+ out = resolveUrl(url, this._base);
79
+ // a document names a bounded number of URLs; a stream of generated
80
+ // ones (a cache-busting query per frame) must not grow this forever
81
+ if (this._memo.size > 4096) this._memo.clear();
82
+ this._memo.set(url, out);
83
+ }
84
+ return out;
85
+ }
86
+ }
package/src/index.ts CHANGED
@@ -231,6 +231,8 @@ export type {
231
231
  EdgeType,
232
232
  FitViewOptions,
233
233
  FlowEdge,
234
+ FlowBodyBudget,
235
+ FlowFrameStats,
234
236
  FlowInstance,
235
237
  FlowNode,
236
238
  FlowNodeData,