@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,200 @@
1
+ // Code drawn as a column of blocks of lines, under `<Code>` and
2
+ // `<Markdown>`'s fences.
3
+ //
4
+ // One `<richtext>` for a whole block of code is laid out whole whenever any
5
+ // of it changes, and a code block that streams — a model writing a fence a
6
+ // token at a time, a log of source — changes at its end every time: 0.4 s
7
+ // for a line appended to 5,000 in either component. As blocks, a change
8
+ // lays out the blocks it touches. The runs are tokenized afresh on every
9
+ // change, so a block is kept by what it holds rather than by identity: while
10
+ // its runs are the same text in the same styles, its element is the one
11
+ // already drawn.
12
+ import React from 'react';
13
+ import type { ReactElement } from 'react';
14
+ import type { Style } from 'react-x11/style';
15
+
16
+ import { RICHTEXT_ELEMENT } from '../richtext/index.js';
17
+ import type { RichTextProps, TextRun } from '../richtext/index.js';
18
+
19
+ const h = React.createElement;
20
+
21
+ /** Lines a block of code holds. */
22
+ export const CODE_BLOCK_LINES = 256;
23
+
24
+ /**
25
+ * Runs split into blocks of `lines` whole lines: the text cut at every
26
+ * `lines`th newline, that newline left out, so the blocks stacked are the
27
+ * text again. A newline that ends the whole text stays in its block, where
28
+ * it draws the empty last line it always drew.
29
+ */
30
+ export function codeBlocks(
31
+ runs: readonly TextRun[],
32
+ lines = CODE_BLOCK_LINES,
33
+ ): TextRun[][] {
34
+ let last = runs.length - 1;
35
+ while (last >= 0 && runs[last]!.text === '') last--;
36
+ const blocks: TextRun[][] = [];
37
+ let block: TextRun[] = [];
38
+ let count = 0;
39
+ for (let r = 0; r < runs.length; r++) {
40
+ const run = runs[r]!;
41
+ let from = 0;
42
+ let search = 0;
43
+ for (;;) {
44
+ const nl = run.text.indexOf('\n', search);
45
+ if (nl < 0) break;
46
+ search = nl + 1;
47
+ if (++count < lines) continue;
48
+ // the text's own last newline is a line of its own, and stays
49
+ if (r === last && nl === run.text.length - 1) break;
50
+ if (nl > from) block.push(piece(run, from, nl));
51
+ blocks.push(block);
52
+ block = [];
53
+ count = 0;
54
+ from = nl + 1;
55
+ }
56
+ if (from < run.text.length) {
57
+ block.push(from === 0 ? run : piece(run, from, run.text.length));
58
+ }
59
+ }
60
+ blocks.push(block);
61
+ return blocks;
62
+ }
63
+
64
+ function piece(run: TextRun, from: number, to: number): TextRun {
65
+ return { ...run, text: run.text.slice(from, to) };
66
+ }
67
+
68
+ /** Whether two runs are the same text in the same style, field for field. */
69
+ function sameRun(a: TextRun, b: TextRun): boolean {
70
+ if (a === b) return true;
71
+ const x = a as unknown as Record<string, unknown>;
72
+ const y = b as unknown as Record<string, unknown>;
73
+ for (const key in x) if (x[key] !== y[key]) return false;
74
+ for (const key in y) if (!(key in x) && y[key] !== undefined) return false;
75
+ return true;
76
+ }
77
+
78
+ function sameRuns(a: readonly TextRun[], b: readonly TextRun[]): boolean {
79
+ if (a.length !== b.length) return false;
80
+ for (let i = 0; i < a.length; i++) if (!sameRun(a[i]!, b[i]!)) return false;
81
+ return true;
82
+ }
83
+
84
+ function sameStyle(a: Style, b: Style): boolean {
85
+ return sameRun(a as unknown as TextRun, b as unknown as TextRun);
86
+ }
87
+
88
+ export interface CodeLinesProps {
89
+ runs: readonly TextRun[];
90
+ /** Every block's style, compared by value: a style object built afresh
91
+ * each render keeps the blocks. */
92
+ style: Style;
93
+ /** `false` lays each block out unwrapped, as `<richtext>` takes it. */
94
+ wrap?: boolean;
95
+ }
96
+
97
+ /** The blocks' elements from the last render, and what they were built of. */
98
+ interface Kept {
99
+ style: Style;
100
+ wrap: boolean | undefined;
101
+ blocks: TextRun[][];
102
+ elements: ReactElement[];
103
+ }
104
+
105
+ /**
106
+ * The runs of a block of code, drawn as blocks of lines (`codeBlocks`),
107
+ * each a `<richtext>` kept while its runs are the same. A selection runs
108
+ * across the blocks and copies as one text, since core joins text elements
109
+ * stacked one above the other with a newline.
110
+ */
111
+ export function CodeLines(props: CodeLinesProps): ReactElement {
112
+ const { style, wrap } = props;
113
+ const kept = React.useRef<Kept | null>(null);
114
+ const was =
115
+ kept.current &&
116
+ kept.current.wrap === wrap &&
117
+ sameStyle(kept.current.style, style)
118
+ ? kept.current
119
+ : null;
120
+ const blocks = codeBlocks(props.runs);
121
+ const elements = blocks.map((block, i) => {
122
+ const before = was?.blocks[i];
123
+ if (before && sameRuns(before, block)) {
124
+ blocks[i] = before;
125
+ return was.elements[i]!;
126
+ }
127
+ const blockProps: RichTextProps = { runs: block, style };
128
+ if (wrap === false) blockProps.wrap = false;
129
+ return h(RICHTEXT_ELEMENT, {
130
+ key: i,
131
+ ...blockProps,
132
+ } as Record<string, unknown>);
133
+ });
134
+ kept.current = { style, wrap, blocks, elements };
135
+ return h(React.Fragment, null, ...elements);
136
+ }
137
+
138
+ export interface CodeGutterProps {
139
+ /** Lines in the code beside it. */
140
+ lines: number;
141
+ /** How a number is set: the code's family and size, a dimmer colour. */
142
+ run: Omit<TextRun, 'text'>;
143
+ style: Style;
144
+ }
145
+
146
+ /**
147
+ * The line numbers beside `CodeLines`, blocked the same way so that the two
148
+ * stay in register a block at a time, and a number not rebuilt for a line
149
+ * appended far below it. Each number is followed by a newline, the last as
150
+ * well, as the gutter always was.
151
+ */
152
+ export function CodeGutter(props: CodeGutterProps): ReactElement {
153
+ const { lines, run, style } = props;
154
+ const kept = React.useRef<{
155
+ run: Omit<TextRun, 'text'>;
156
+ style: Style;
157
+ byStart: Map<string, ReactElement>;
158
+ } | null>(null);
159
+ if (
160
+ !kept.current ||
161
+ !sameRun(kept.current.run as TextRun, run as TextRun) ||
162
+ !sameStyle(kept.current.style, style)
163
+ ) {
164
+ kept.current = { run, style, byStart: new Map() };
165
+ }
166
+ const byStart = kept.current.byStart;
167
+ const elements: ReactElement[] = [];
168
+ const used = new Set<string>();
169
+ for (let start = 0; start < lines || start === 0; start += CODE_BLOCK_LINES) {
170
+ const end = Math.min(start + CODE_BLOCK_LINES, lines);
171
+ const key = `${start}:${end}`;
172
+ used.add(key);
173
+ let element = byStart.get(key);
174
+ if (!element) {
175
+ const runs: TextRun[] = [];
176
+ for (let i = start; i < end; i++) {
177
+ runs.push({ ...run, text: `${i + 1}\n` } as TextRun);
178
+ }
179
+ // the newline that ends a block is the gap to the next one
180
+ if (end < lines && runs.length > 0) {
181
+ const tail = runs[runs.length - 1]!;
182
+ runs[runs.length - 1] = { ...tail, text: tail.text.slice(0, -1) };
183
+ }
184
+ element = h(RICHTEXT_ELEMENT, {
185
+ key: start,
186
+ // The numbering is chrome, not text: `selectable={false}` keeps it
187
+ // out of a drag and out of the copied text.
188
+ selectable: false,
189
+ runs,
190
+ wrap: false,
191
+ style,
192
+ } as Record<string, unknown>);
193
+ byStart.set(key, element);
194
+ }
195
+ elements.push(element);
196
+ if (lines === 0) break;
197
+ }
198
+ for (const key of byStart.keys()) if (!used.has(key)) byStart.delete(key);
199
+ return h(React.Fragment, null, ...elements);
200
+ }
@@ -0,0 +1,12 @@
1
+ // Text compared the way `String#localeCompare` with no locale compares it,
2
+ // with one collator for every comparison. ECMA-402 defines that call as a
3
+ // new `Intl.Collator()`'s `compare`, and V8 made the collator on every call:
4
+ // most of a 100,000-row table sort, and all of a completion list's with
5
+ // nothing typed yet. Made on first use, so importing constructs nothing.
6
+
7
+ let collator: Intl.Collator | null = null;
8
+
9
+ /** `a.localeCompare(b)`, without a collator a call. */
10
+ export function compareText(a: string, b: string): number {
11
+ return (collator ??= new Intl.Collator()).compare(a, b);
12
+ }
@@ -253,4 +253,15 @@ export interface ParseOptions {
253
253
  * evaluates nothing — an expression is kept as source.
254
254
  */
255
255
  expressions?: boolean;
256
+ /**
257
+ * What this document last parsed into, when the new source is an edit of
258
+ * that one: the parse then reads only the blocks around the change and
259
+ * takes the rest from `previous`, the same objects. The answer is the
260
+ * one a parse from scratch gives, whatever the edit; `previous` only
261
+ * decides how much of it has to be worked out again. Ignored when it came
262
+ * from different options or from somewhere other than `parse`, and with
263
+ * `isComponent`: a component's open tag looks for its close as far as the
264
+ * end of the document, so no block before an edit is settled.
265
+ */
266
+ previous?: Document;
256
267
  }
@@ -181,31 +181,168 @@ function indentOf(line: string): number {
181
181
 
182
182
  export function parse(source: string, options: ParseOptions = {}): Document {
183
183
  const partial = options.partial !== false;
184
+ const isComponent = options.isComponent ?? NO_COMPONENTS;
185
+ const expressions = options.expressions === true;
184
186
  const normalized = source.replace(/\r\n?/g, '\n');
185
187
  const lines = normalized.split('\n').map(expandLeadingTabs);
188
+ const previous = options.previous;
189
+ const was = previous ? resumable.get(previous) : undefined;
190
+ // Not with components: an open tag looks for its close to the end of the
191
+ // document (`componentCloseLine`), so a close added anywhere below can
192
+ // change what it is, and the block before an edit is no longer settled.
193
+ if (
194
+ previous &&
195
+ was &&
196
+ was.partial === partial &&
197
+ was.expressions === expressions &&
198
+ isComponent === NO_COMPONENTS &&
199
+ was.isComponent === NO_COMPONENTS
200
+ ) {
201
+ return resume(previous, was, lines);
202
+ }
186
203
  const blocks: BlockNode[] = [];
187
204
  const ranges: Array<[number, number]> = [];
188
- parseBlocks(
205
+ const blanks = new Uint8Array(lines.length);
206
+ parseBlocks(lines, partial, blocks, ranges, isComponent, expressions, {
207
+ from: 0,
208
+ blanks,
209
+ });
210
+ return remember(
211
+ { blocks, raws: ranges.map(([a, b]) => lines.slice(a, b).join('\n')) },
212
+ { lines, ranges, blanks, partial, isComponent, expressions },
213
+ );
214
+ }
215
+
216
+ // --- resuming --------------------------------------------------------------
217
+
218
+ /**
219
+ * What a parse leaves for the next parse of the same document to start from
220
+ * (`ParseOptions.previous`).
221
+ *
222
+ * The block loop carries one thing from a block to the next, the paragraph
223
+ * it is gathering, and it looks only forwards: a block's extent is decided
224
+ * by the lines up to the first line of the block after it. So `blanks`
225
+ * marks the lines where the loop stood on a blank line at the top level with
226
+ * no paragraph open. Two parses standing on such a line, with the same lines
227
+ * from there to the end, produce the same blocks from there on. That is the
228
+ * point where an edit's re-parse can stop and take the rest from before.
229
+ */
230
+ interface Resumable {
231
+ lines: string[];
232
+ /** each top-level block's [start, endExcl) line range */
233
+ ranges: Array<[number, number]>;
234
+ /** 1 on each line where the top-level loop stood blank with no paragraph */
235
+ blanks: Uint8Array;
236
+ partial: boolean;
237
+ isComponent: (name: string) => boolean;
238
+ expressions: boolean;
239
+ }
240
+
241
+ /** Kept beside the documents rather than in them, so a Document stays the
242
+ * plain data every caller and test compares. */
243
+ const resumable = new WeakMap<Document, Resumable>();
244
+
245
+ function remember(doc: Document, state: Resumable): Document {
246
+ resumable.set(doc, state);
247
+ return doc;
248
+ }
249
+
250
+ /**
251
+ * Parse `lines` as an edit of `previous`: from one block before the first
252
+ * line that changed, until the loop stands where the previous parse stood
253
+ * in the lines the edit left alone — or to the end, when it never does (an
254
+ * unclosed fence swallows the rest of a document either way).
255
+ */
256
+ function resume(previous: Document, was: Resumable, lines: string[]): Document {
257
+ const old = was.lines;
258
+ const oldN = old.length;
259
+ const n = lines.length;
260
+ const shortest = Math.min(oldN, n);
261
+ let first = 0;
262
+ while (first < shortest && old[first] === lines[first]) first += 1;
263
+ if (first === oldN && first === n) return previous;
264
+ // lines at the end the edit did not touch, never counting the prefix twice
265
+ let same = 0;
266
+ while (
267
+ same < shortest - first &&
268
+ old[oldN - 1 - same] === lines[n - 1 - same]
269
+ ) {
270
+ same += 1;
271
+ }
272
+ const shift = n - oldN;
273
+ const suffix = n - same;
274
+
275
+ // The first block that reaches the change, and the one before it: a
276
+ // block's extent is decided by the lines up to the next block's first —
277
+ // a list looks past blank lines to see whether it goes on — so the block
278
+ // before the first one touched cannot have depended on the change.
279
+ const { ranges } = was;
280
+ let lo = 0;
281
+ let hi = ranges.length;
282
+ while (lo < hi) {
283
+ const mid = (lo + hi) >> 1;
284
+ if (ranges[mid][1] <= first) lo = mid + 1;
285
+ else hi = mid;
286
+ }
287
+ const kept = Math.max(0, lo - 1);
288
+ const from = kept === 0 ? 0 : ranges[kept][0];
289
+
290
+ const blanks = new Uint8Array(n);
291
+ blanks.set(was.blanks.subarray(0, from));
292
+ const blocks: BlockNode[] = previous.blocks.slice(0, kept);
293
+ const raws = previous.raws.slice(0, kept);
294
+ const next: Array<[number, number]> = ranges.slice(0, kept);
295
+ const fresh: Array<[number, number]> = [];
296
+ const stop = parseBlocks(
189
297
  lines,
190
- partial,
298
+ was.partial,
191
299
  blocks,
192
- ranges,
193
- options.isComponent ?? NO_COMPONENTS,
194
- options.expressions === true,
300
+ fresh,
301
+ was.isComponent,
302
+ was.expressions,
303
+ {
304
+ from,
305
+ blanks,
306
+ resync: (i) => i >= suffix && was.blanks[i - shift] === 1,
307
+ },
195
308
  );
196
- return {
197
- blocks,
198
- raws: ranges.map(([a, b]) => lines.slice(a, b).join('\n')),
199
- };
309
+ for (const [a, b] of fresh) {
310
+ raws.push(lines.slice(a, b).join('\n'));
311
+ next.push([a, b]);
312
+ }
313
+ if (stop < n) {
314
+ // the previous parse from the same place over the same lines: its
315
+ // blocks, where they now are
316
+ const at = stop - shift;
317
+ blanks.set(was.blanks.subarray(at), stop);
318
+ let j = ranges.length;
319
+ while (j > 0 && ranges[j - 1][0] >= at) j -= 1;
320
+ for (; j < ranges.length; j += 1) {
321
+ blocks.push(previous.blocks[j]);
322
+ raws.push(previous.raws[j]);
323
+ next.push([ranges[j][0] + shift, ranges[j][1] + shift]);
324
+ }
325
+ }
326
+ return remember({ blocks, raws }, { ...was, lines, ranges: next, blanks });
200
327
  }
201
328
 
202
329
  // --- block layer -----------------------------------------------------------
203
330
 
331
+ /** The top-level call's extra: where to start, where to record the blank
332
+ * lines it stands on, and when to stop (`resume`). */
333
+ interface TopLevel {
334
+ from: number;
335
+ blanks: Uint8Array;
336
+ resync?: (line: number) => boolean;
337
+ }
338
+
204
339
  /**
205
340
  * Parse a run of lines into blocks. `tailOpen` says the end of `lines` is
206
341
  * the live end of a streaming document — the license for every "complete it
207
342
  * anyway" rule. `ranges`, when given, receives each block's [start, endExcl)
208
343
  * line range (only the top-level call wants them, for the streaming cache).
344
+ * Returns the line it stopped at: the end, or where `top.resync` said the
345
+ * rest would come out as it did before.
209
346
  */
210
347
  function parseBlocks(
211
348
  lines: string[],
@@ -214,8 +351,9 @@ function parseBlocks(
214
351
  ranges?: Array<[number, number]>,
215
352
  isComponent: (name: string) => boolean = NO_COMPONENTS,
216
353
  expressions = false,
217
- ): void {
218
- let i = 0;
354
+ top?: TopLevel,
355
+ ): number {
356
+ let i = top?.from ?? 0;
219
357
  const n = lines.length;
220
358
 
221
359
  let paraStart = -1;
@@ -245,6 +383,10 @@ function parseBlocks(
245
383
 
246
384
  if (RE_BLANK.test(line)) {
247
385
  flushPara(i);
386
+ if (top) {
387
+ if (top.resync?.(i)) return i;
388
+ top.blanks[i] = 1;
389
+ }
248
390
  i += 1;
249
391
  continue;
250
392
  }
@@ -571,6 +713,7 @@ function parseBlocks(
571
713
  }
572
714
 
573
715
  flushPara(n);
716
+ return n;
574
717
  }
575
718
 
576
719
  // --- lists -----------------------------------------------------------------
@@ -0,0 +1,45 @@
1
+ // A font family, warmed before the first layout sets text in it.
2
+ import { useMemo } from 'react';
3
+ import { useApp } from 'react-x11';
4
+
5
+ /** The one method this needs of `app.fonts`, which ntk's FontManager has
6
+ * from the release that added it, and other font managers may not. */
7
+ interface PrewarmingFonts {
8
+ prewarm?: (family: string) => void;
9
+ }
10
+
11
+ /**
12
+ * Start matching `family`'s faces now, off the event loop, so that the first
13
+ * layout setting text in it takes the answer instead of stalling on the
14
+ * system's font matcher — ntk's `FontManager#prewarm`. fontconfig answers in
15
+ * 20–40 ms on a Linux desktop and in 80–150 on XQuartz, and nothing warms a
16
+ * family but sans-serif until a layout asks for it.
17
+ *
18
+ * Called while rendering, as React's own resource hints are: a component
19
+ * renders ahead of the frame that lays it out, and a long document's render
20
+ * is hundreds of milliseconds of head start that an effect would give away.
21
+ * Once per family; nothing where the app's fonts have nothing to look up
22
+ * (fonts in memory, a native text engine) or predate the method.
23
+ */
24
+ export function useFontPrewarm(family: string | null | undefined): void {
25
+ const fonts = (useApp() as { fonts?: PrewarmingFonts } | null)?.fonts;
26
+ useMemo(() => {
27
+ if (family) fonts?.prewarm?.(family);
28
+ }, [fonts, family]);
29
+ }
30
+
31
+ /** The font family a style names, read the way core flattens one — the last
32
+ * entry of an array that names it wins — or `fallback`. */
33
+ export function styleFamily(style: unknown, fallback: string): string {
34
+ let family = fallback;
35
+ const visit = (entry: unknown): void => {
36
+ if (Array.isArray(entry)) {
37
+ for (const e of entry) visit(e);
38
+ } else if (entry && typeof entry === 'object') {
39
+ const named = (entry as { fontFamily?: unknown }).fontFamily;
40
+ if (typeof named === 'string') family = named;
41
+ }
42
+ };
43
+ visit(style);
44
+ return family;
45
+ }