@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
@@ -104,14 +104,51 @@ export const canPath = (
104
104
  /** One batched fill for many rectangles, or the loop where the context has
105
105
  * no batch — same pixels, more requests, which is the mock's documented
106
106
  * contract too. */
107
- function fillRects(ctx: PlotContext, rects: number[]): void {
107
+ /** Fill a flat `[x, y, w, h, …]` list, less what `clip` leaves out;
108
+ * answers how many rects went out, which is what the wire estimate
109
+ * counts. */
110
+ function fillRects(
111
+ ctx: PlotContext,
112
+ rects: number[],
113
+ clip?: PlotRect | null,
114
+ ): number {
115
+ if (clip) rects = within(rects, clip);
116
+ if (rects.length === 0) return 0;
108
117
  if (typeof ctx.fillRects === 'function') {
109
118
  ctx.fillRects(rects);
110
- return;
119
+ return rects.length / 4;
111
120
  }
112
121
  for (let i = 0; i + 3 < rects.length; i += 4) {
113
122
  ctx.fillRect(rects[i], rects[i + 1], rects[i + 2], rects[i + 3]);
114
123
  }
124
+ return rects.length / 4;
125
+ }
126
+
127
+ /**
128
+ * The rects of a flat `[x, y, w, h, …]` list that reach `clip` — a pass's
129
+ * damage, which clips away everything else. A chart the pass merely
130
+ * touches, a strip a pan exposed along its edge, drew every mark it has,
131
+ * all but a few of them into the clip; scatter plots in a panned graph
132
+ * spent most of each step there.
133
+ */
134
+ function within(rects: number[], clip: PlotRect): number[] {
135
+ const x0 = clip.x;
136
+ const y0 = clip.y;
137
+ const x1 = clip.x + clip.width;
138
+ const y1 = clip.y + clip.height;
139
+ let out: number[] | null = null;
140
+ for (let i = 0; i + 3 < rects.length; i += 4) {
141
+ const x = rects[i];
142
+ const y = rects[i + 1];
143
+ const inside =
144
+ x < x1 && x + rects[i + 2] > x0 && y < y1 && y + rects[i + 3] > y0;
145
+ if (inside) {
146
+ if (out) out.push(x, y, rects[i + 2], rects[i + 3]);
147
+ } else if (!out) {
148
+ out = rects.slice(0, i);
149
+ }
150
+ }
151
+ return out ?? rects;
115
152
  }
116
153
 
117
154
  /** Mutable accumulator behind `ChartFrameStats`. */
@@ -159,6 +196,9 @@ export interface SeriesEnv {
159
196
  * a spec's `strokeWidth`, `dot`, `barRadius` and `size` are lengths the
160
197
  * application wrote, so they are logical and multiply here. Default 1. */
161
198
  scale?: number;
199
+ /** The pass's damage, device pixels, or null for all of the plot: what
200
+ * lies outside it the pass clips away, so it is not drawn at all. */
201
+ clip?: PlotRect | null;
162
202
  }
163
203
 
164
204
  /** A spec length on the device grid. */
@@ -173,12 +213,15 @@ export interface RenderHost {
173
213
  /**
174
214
  * Composite a straight-RGBA image over the plot, preserving what is
175
215
  * already painted underneath. False when this backend cannot (no
176
- * XRender surface — the mock), in which case the caller uses rects.
216
+ * offscreen surface — the mock), in which case the caller uses rects.
177
217
  * `contentKey` names what `fill` would produce: an unchanged key lets
178
218
  * the host re-composite its retained surface without refilling or
179
- * re-uploading a pixel.
219
+ * re-uploading a pixel. `id` is the series': each keeps a surface of its
220
+ * own, or two dense series in one plot would refill one surface for each
221
+ * other on every frame.
180
222
  */
181
223
  blitImage(
224
+ id: string,
182
225
  x: number,
183
226
  y: number,
184
227
  w: number,
@@ -597,18 +640,18 @@ export function renderLineArea(env: SeriesEnv, g: SeriesGeometry): void {
597
640
  ctx.save();
598
641
  if (ctx.globalAlpha !== undefined) ctx.globalAlpha = g.spec.fillOpacity;
599
642
  ctx.fillStyle = g.color;
600
- fillRects(ctx, fillRectsArr);
643
+ const sent = fillRects(ctx, fillRectsArr, env.clip);
601
644
  ctx.restore();
602
645
  stats.commands++;
603
- stats.estimatedWireBytes += (fillRectsArr.length / 4) * BYTES_PER_RECT;
646
+ stats.estimatedWireBytes += sent * BYTES_PER_RECT;
604
647
  }
605
648
  if (strokeRects.length) {
606
649
  ctx.save();
607
650
  ctx.fillStyle = g.color;
608
- fillRects(ctx, strokeRects);
651
+ const sent = fillRects(ctx, strokeRects, env.clip);
609
652
  ctx.restore();
610
653
  stats.commands++;
611
- stats.estimatedWireBytes += (strokeRects.length / 4) * BYTES_PER_RECT;
654
+ stats.estimatedWireBytes += sent * BYTES_PER_RECT;
612
655
  }
613
656
  stats.series.push({ id: g.spec.id, mode: 'columns', points: count });
614
657
  }
@@ -624,10 +667,20 @@ function renderDots(
624
667
  let total = 0;
625
668
  for (const run of runsX) total += run.length;
626
669
  if (total <= CIRCLE_MAX && ctx.arc && ctx.fill && ctx.beginPath) {
670
+ const clip = env.clip;
627
671
  ctx.save();
628
672
  ctx.fillStyle = color;
629
673
  for (let k = 0; k < runsX.length; k++) {
630
674
  for (let i = 0; i < runsX[k].length; i++) {
675
+ if (
676
+ clip &&
677
+ (runsX[k][i] + r < clip.x ||
678
+ runsX[k][i] - r > clip.x + clip.width ||
679
+ runsY[k][i] + r < clip.y ||
680
+ runsY[k][i] - r > clip.y + clip.height)
681
+ ) {
682
+ continue;
683
+ }
631
684
  ctx.beginPath();
632
685
  ctx.arc(runsX[k][i], runsY[k][i], r, 0, Math.PI * 2);
633
686
  ctx.fill();
@@ -651,10 +704,10 @@ function renderDots(
651
704
  }
652
705
  ctx.save();
653
706
  ctx.fillStyle = color;
654
- fillRects(ctx, rects);
707
+ const sent = fillRects(ctx, rects, env.clip);
655
708
  ctx.restore();
656
709
  stats.commands++;
657
- stats.estimatedWireBytes += (rects.length / 4) * BYTES_PER_RECT;
710
+ stats.estimatedWireBytes += sent * BYTES_PER_RECT;
658
711
  }
659
712
 
660
713
  // --- bars ------------------------------------------------------------------
@@ -705,10 +758,10 @@ export function renderBars(env: SeriesEnv, g: SeriesGeometry): void {
705
758
  }
706
759
  ctx.save();
707
760
  ctx.fillStyle = g.color;
708
- fillRects(ctx, rects);
761
+ const sent = fillRects(ctx, rects, env.clip);
709
762
  ctx.restore();
710
763
  stats.commands++;
711
- stats.estimatedWireBytes += (rects.length / 4) * BYTES_PER_RECT;
764
+ stats.estimatedWireBytes += sent * BYTES_PER_RECT;
712
765
  stats.series.push({ id: g.spec.id, mode: 'columns', points: n });
713
766
  return;
714
767
  }
@@ -749,9 +802,9 @@ export function renderBars(env: SeriesEnv, g: SeriesGeometry): void {
749
802
  }
750
803
  }
751
804
  if (rects.length) {
752
- fillRects(ctx, rects);
805
+ const sent = fillRects(ctx, rects, env.clip);
753
806
  stats.commands++;
754
- stats.estimatedWireBytes += (rects.length / 4) * BYTES_PER_RECT;
807
+ stats.estimatedWireBytes += sent * BYTES_PER_RECT;
755
808
  }
756
809
  ctx.restore();
757
810
  stats.series.push({
@@ -777,6 +830,10 @@ export interface ScatterGrid {
777
830
  consumedN: number;
778
831
  /** rects per alpha bucket, rebuilt only when the grid changed */
779
832
  buckets: number[][] | null;
833
+ /** the content the last paint drew — see `renderScatter` */
834
+ painted: string;
835
+ /** the content last handed to the host as an image, which it keeps */
836
+ imaged: string;
780
837
  }
781
838
 
782
839
  export function makeScatterGrid(
@@ -795,11 +852,27 @@ export function makeScatterGrid(
795
852
  maxCount: 0,
796
853
  consumedN: 0,
797
854
  buckets: null,
855
+ painted: '',
856
+ imaged: '',
798
857
  };
799
858
  }
800
859
 
801
860
  const ALPHA_LEVELS = 8;
802
861
 
862
+ /** The alpha bucket a cell's count falls in: square-root density, so a
863
+ * lone point stays visible beside a pile of a thousand. */
864
+ function alphaLevel(count: number, maxCount: number): number {
865
+ return Math.min(
866
+ ALPHA_LEVELS - 1,
867
+ Math.floor(Math.sqrt(count / maxCount) * ALPHA_LEVELS),
868
+ );
869
+ }
870
+
871
+ /** The opacity a bucket is drawn at, by either path. */
872
+ function levelAlpha(level: number): number {
873
+ return 0.3 + (0.7 * (level + 1)) / ALPHA_LEVELS;
874
+ }
875
+
803
876
  /** #rgb/#rrggbb/#rrggbbaa → [r,g,b,a?]; null for anything fancier, which
804
877
  * simply keeps the rect path. */
805
878
  export function parseHexColor(
@@ -887,21 +960,38 @@ export function renderScatter(env: SeriesEnv, g: SeriesGeometry): void {
887
960
  const rectBytes = grid.occupied * BYTES_PER_RECT;
888
961
  const imageBytes = plot.width * plot.height * BYTES_PER_PIXEL;
889
962
  const rgb = parseHexColor(g.color);
890
- if (rectBytes > imageBytes && rgb) {
963
+ // The crossover is a question about one frame, and a grid painted again
964
+ // unchanged — a pan or a drag carrying the plot, a crosshair over it —
965
+ // answers it differently: the host keeps the surface it filled, so every
966
+ // paint of it after the first is one composite, while the rects go out
967
+ // again in full every frame. On a backend where each rect is a primitive
968
+ // of its own rather than a line of one request, that was 30,000 of them
969
+ // a frame across a board of scatter plots. A grid whose data moves keeps
970
+ // the crossover, because every paint of it is its first.
971
+ const contentKey = `${grid.key}#${grid.consumedN}|${g.color}`;
972
+ const repeat = grid.painted === contentKey;
973
+ grid.painted = contentKey;
974
+ if ((repeat || rectBytes > imageBytes) && rgb) {
975
+ const kept = grid.imaged === contentKey;
891
976
  const drawn = env.host.blitImage(
977
+ g.spec.id,
892
978
  plot.x,
893
979
  plot.y,
894
980
  gw * cell,
895
981
  gh * cell,
896
982
  (data) => {
897
- const [r, gg, b] = rgb;
983
+ const [r, gg, b, ca] = rgb;
984
+ // The rects' opacities exactly, colour alpha included, so which
985
+ // path drew a frame never shows — and a plot that changes path as
986
+ // it goes from moving to still does not change shade.
987
+ const alphas = Array.from({ length: ALPHA_LEVELS }, (_, level) =>
988
+ Math.round(levelAlpha(level) * ca),
989
+ );
898
990
  for (let cy = 0; cy < gh; cy++) {
899
991
  for (let cx = 0; cx < gw; cx++) {
900
992
  const count = grid.counts[cy * gw + cx];
901
993
  if (count === 0) continue;
902
- const a = Math.round(
903
- 255 * (0.3 + 0.7 * Math.sqrt(count / grid.maxCount)),
904
- );
994
+ const a = alphas[alphaLevel(count, grid.maxCount)];
905
995
  for (let dy = 0; dy < cell; dy++) {
906
996
  let at = ((cy * cell + dy) * gw * cell + cx * cell) * 4;
907
997
  for (let dx = 0; dx < cell; dx++) {
@@ -917,11 +1007,12 @@ export function renderScatter(env: SeriesEnv, g: SeriesGeometry): void {
917
1007
  },
918
1008
  // same grid content + colour → the host recomposites its retained
919
1009
  // surface: no refill, no upload
920
- `${grid.key}#${grid.consumedN}|${g.color}`,
1010
+ contentKey,
921
1011
  );
922
1012
  if (drawn) {
1013
+ grid.imaged = contentKey;
923
1014
  stats.commands++;
924
- stats.estimatedWireBytes += imageBytes;
1015
+ stats.estimatedWireBytes += kept ? 0 : imageBytes;
925
1016
  stats.series.push({ id: g.spec.id, mode: 'image', points: n });
926
1017
  return;
927
1018
  }
@@ -938,11 +1029,12 @@ export function renderScatter(env: SeriesEnv, g: SeriesGeometry): void {
938
1029
  for (let cx = 0; cx < gw; cx++) {
939
1030
  const count = grid.counts[cy * gw + cx];
940
1031
  if (count === 0) continue;
941
- const level = Math.min(
942
- ALPHA_LEVELS - 1,
943
- Math.floor(Math.sqrt(count / grid.maxCount) * ALPHA_LEVELS),
1032
+ buckets[alphaLevel(count, grid.maxCount)].push(
1033
+ cx * cell,
1034
+ cy * cell,
1035
+ cell,
1036
+ cell,
944
1037
  );
945
- buckets[level].push(cx * cell, cy * cell, cell, cell);
946
1038
  }
947
1039
  }
948
1040
  grid.buckets = buckets;
@@ -952,9 +1044,7 @@ export function renderScatter(env: SeriesEnv, g: SeriesGeometry): void {
952
1044
  for (let level = 0; level < ALPHA_LEVELS; level++) {
953
1045
  const local = grid.buckets[level];
954
1046
  if (!local.length) continue;
955
- if (ctx.globalAlpha !== undefined) {
956
- ctx.globalAlpha = 0.3 + (0.7 * (level + 1)) / ALPHA_LEVELS;
957
- }
1047
+ if (ctx.globalAlpha !== undefined) ctx.globalAlpha = levelAlpha(level);
958
1048
  // translate manually: ctx.translate would kick fillRects off ntk's
959
1049
  // single-FillRectangles fast path (it requires an identity transform)
960
1050
  const rects = new Array<number>(local.length);
@@ -964,9 +1054,9 @@ export function renderScatter(env: SeriesEnv, g: SeriesGeometry): void {
964
1054
  rects[i + 2] = local[i + 2];
965
1055
  rects[i + 3] = local[i + 3];
966
1056
  }
967
- fillRects(ctx, rects);
1057
+ const sent = fillRects(ctx, rects, env.clip);
968
1058
  stats.commands++;
969
- stats.estimatedWireBytes += (rects.length / 4) * BYTES_PER_RECT;
1059
+ stats.estimatedWireBytes += sent * BYTES_PER_RECT;
970
1060
  }
971
1061
  ctx.restore();
972
1062
  stats.series.push({ id: g.spec.id, mode: 'columns', points: n });
package/src/code/index.ts CHANGED
@@ -17,20 +17,18 @@ import type { ReactElement } from 'react';
17
17
  import { useTheme } from 'react-x11';
18
18
  import type { Style } from 'react-x11/style';
19
19
 
20
- import {
21
- registerRichText,
22
- RICHTEXT_ELEMENT,
23
- useSelectionMenu,
24
- } from '../richtext/index.js';
25
- import type { RichTextProps, TextRun } from '../richtext/index.js';
20
+ import { registerRichText, useSelectionMenu } from '../richtext/index.js';
21
+ import type { TextRun } from '../richtext/index.js';
26
22
  import {
27
23
  codeBlockLook,
28
- codeBlockRuns,
24
+ CodeBlockRunCache,
29
25
  codeBlockStyle,
30
26
  codeTextStyle,
31
27
  } from '../codeblock/index.js';
32
28
  import type { Language, TokenStyles } from '../code-language/index.js';
33
29
  import { hx } from './hx.js';
30
+ import { useFontPrewarm } from '../internal/prewarm.js';
31
+ import { CodeGutter, CodeLines } from '../internal/codelines.js';
34
32
 
35
33
  const h = React.createElement;
36
34
 
@@ -104,40 +102,46 @@ export function Code(props: CodeProps): ReactElement {
104
102
  }),
105
103
  [theme, props.fontSize, props.monoFamily, props.tokenStyles],
106
104
  );
105
+ useFontPrewarm(look.family);
107
106
 
107
+ // Kept between renders, so a source that changes at its end is tokenized
108
+ // again from the line that changed (`CodeBlockRunCache`).
109
+ const runCache = React.useRef<CodeBlockRunCache | null>(null);
110
+ runCache.current ??= new CodeBlockRunCache();
111
+ React.useEffect(() => () => runCache.current?.dispose(), []);
108
112
  const runs: TextRun[] = React.useMemo(
109
- () => codeBlockRuns(source, look, { lang, language, resolveLanguage }),
113
+ () =>
114
+ runCache.current!.runs(source, look, { lang, language, resolveLanguage }),
110
115
  [source, lang, language, resolveLanguage, look],
111
116
  );
112
117
 
113
118
  const lineCount = React.useMemo(() => source.split('\n').length, [source]);
114
119
 
115
- const codeProps: RichTextProps = { runs, style: codeTextStyle(look) };
116
- if (!wrap) codeProps.wrap = false;
120
+ // In blocks of lines, so a change lays out the blocks it touches
121
+ // (`../internal/codelines.ts`).
122
+ const code = h(CodeLines, { runs, style: codeTextStyle(look, wrap), wrap });
117
123
 
118
124
  const gutter = lineNumbers
119
- ? h(RICHTEXT_ELEMENT, {
120
- // one richtext for all the numbers: same font, same line height, so
121
- // it stays in register with the code beside it. `selectable={false}`
122
- // is what keeps it out of a drag and out of the copied text — the
123
- // numbering is chrome, and CSS spells that `user-select: none`.
124
- selectable: false,
125
- runs: Array.from({ length: lineCount }, (_, i) => ({
126
- text: `${i + 1}\n`,
127
- family: look.family,
128
- size: look.size,
129
- color: look.dim,
130
- })),
131
- wrap: false,
132
- style: {
133
- lineHeight: look.lineHeight,
134
- textAlign: 'right',
135
- minWidth:
136
- Math.max(String(lineCount).length, 2) * Math.ceil(look.size * 0.62),
137
- marginRight: look.padding,
138
- flexShrink: 0,
125
+ ? hx(
126
+ 'box',
127
+ {
128
+ style: {
129
+ flexDirection: 'column',
130
+ minWidth:
131
+ Math.max(String(lineCount).length, 2) *
132
+ Math.ceil(look.size * 0.62),
133
+ marginRight: look.padding,
134
+ flexShrink: 0,
135
+ },
139
136
  },
140
- } as Record<string, unknown>)
137
+ // numbers in the same font and line height as the code, blocked the
138
+ // same way, so the two stay in register
139
+ h(CodeGutter, {
140
+ lines: lineCount,
141
+ run: { family: look.family, size: look.size, color: look.dim },
142
+ style: { lineHeight: look.lineHeight, textAlign: 'right' },
143
+ }),
144
+ )
141
145
  : null;
142
146
 
143
147
  const rootStyle: Style = {
@@ -168,7 +172,7 @@ export function Code(props: CodeProps): ReactElement {
168
172
  hx(
169
173
  'box',
170
174
  { style: { overflow: 'scroll', flexDirection: 'column', flexGrow: 1 } },
171
- h(RICHTEXT_ELEMENT, codeProps as unknown as Record<string, unknown>),
175
+ code,
172
176
  ),
173
177
  );
174
178
  }
@@ -11,6 +11,7 @@ import type {
11
11
  CompletionResult,
12
12
  CompletionSource,
13
13
  } from '../code-language/types.js';
14
+ import { compareText } from '../internal/collate.js';
14
15
 
15
16
  /**
16
17
  * Rank `items` against what has been typed: prefix matches first (case
@@ -24,7 +25,7 @@ export function rankCompletions(
24
25
  if (typed.length === 0) {
25
26
  return [...items].sort(
26
27
  (a, b) =>
27
- (b.boost ?? 0) - (a.boost ?? 0) || a.label.localeCompare(b.label),
28
+ (b.boost ?? 0) - (a.boost ?? 0) || compareText(a.label, b.label),
28
29
  );
29
30
  }
30
31
  const lower = typed.toLowerCase();
@@ -41,7 +42,7 @@ export function rankCompletions(
41
42
  scored.push({ item, score: score * 1000 + (item.boost ?? 0) });
42
43
  }
43
44
  scored.sort(
44
- (a, b) => b.score - a.score || a.item.label.localeCompare(b.item.label),
45
+ (a, b) => b.score - a.score || compareText(a.item.label, b.item.label),
45
46
  );
46
47
  return scored.map((s) => s.item);
47
48
  }
@@ -60,6 +60,7 @@ import type {
60
60
  Position,
61
61
  } from '../code-language/types.js';
62
62
  import { wordRangeAt } from './doc.js';
63
+ import { styleFamily, useFontPrewarm } from '../internal/prewarm.js';
63
64
 
64
65
  export { ELEMENT as CODE_EDITOR_ELEMENT };
65
66
  export { CodeEditorNode };
@@ -74,6 +75,22 @@ if (!registeredElements().includes(ELEMENT)) {
74
75
  // near-misses, so a future style vocabulary addition fails loudly here
75
76
  // rather than silently in an app.
76
77
  semanticNames: ['rows', 'tabSize'],
78
+ // The props the node's own `applyProps` claims the damage of — the rows
79
+ // an external `value` changed, the rows a linter's squiggles are on —
80
+ // or that change nothing drawn. Left to core, a new value or a new
81
+ // diagnostics array (a controlled editor gets both on every keystroke)
82
+ // was the whole editor repainted over the rows it had claimed.
83
+ selfDamagedProps: [
84
+ 'value',
85
+ 'defaultValue',
86
+ 'name',
87
+ 'language',
88
+ 'tokenStyles',
89
+ 'tabSize',
90
+ 'diagnostics',
91
+ 'lineNumbers',
92
+ 'insertSpaces',
93
+ ],
77
94
  childrenAllowed: false,
78
95
  });
79
96
  }
@@ -169,6 +186,8 @@ export function CodeEditor(props: CodeEditorComponentProps): ReactElement {
169
186
  } = props;
170
187
 
171
188
  const theme = useTheme();
189
+ // the editor's text is all in this family, from its first frame
190
+ useFontPrewarm(styleFamily(style, 'monospace'));
172
191
  const nodeRef = useRef<CodeEditorNode | null>(null);
173
192
  const [completion, setCompletion] = useState<CompletionState | null>(null);
174
193
  // bumped per query; a stale async result compares and drops itself