@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
@@ -32,6 +32,7 @@ import { ansiPalette, parseAnsi } from '../ansi/index.js';
32
32
  import type {
33
33
  AnsiDocument,
34
34
  AnsiInput,
35
+ AnsiLine,
35
36
  AnsiPaletteOptions,
36
37
  } from '../ansi/index.js';
37
38
  import {
@@ -40,14 +41,15 @@ import {
40
41
  useLinkClicks,
41
42
  useSelectionMenu,
42
43
  } from '../richtext/index.js';
43
- import type { RichTextProps, TextRun } from '../richtext/index.js';
44
+ import type { RichTextProps } from '../richtext/index.js';
44
45
  import {
45
46
  codeBlockLook,
46
47
  codeBlockStyle,
47
48
  codeTextStyle,
48
49
  } from '../codeblock/index.js';
49
- import { documentRuns } from './runs.js';
50
+ import { linesRuns } from './runs.js';
50
51
  import { hx } from './hx.js';
52
+ import { useFontPrewarm } from '../internal/prewarm.js';
51
53
 
52
54
  const h = React.createElement;
53
55
 
@@ -55,6 +57,27 @@ const h = React.createElement;
55
57
  // the note in `../richtext/node.ts`.
56
58
  registerRichText();
57
59
 
60
+ /**
61
+ * Lines a block of output holds.
62
+ *
63
+ * The output is a column of blocks rather than one element, so an append
64
+ * lays out again the block it lands in and not the whole capture: one
65
+ * `<richtext>` for all of it was laid out whole for every line appended,
66
+ * 0.9 s an append at 20,000 lines. A block keeps its element while its lines
67
+ * are the same objects, which the parser shares from one snapshot to the
68
+ * next. Blocks start at multiples of this in the capture's own numbering,
69
+ * `truncated` counted in, so `maxLines` dropping lines off the top changes
70
+ * only the first block.
71
+ */
72
+ const BLOCK_LINES = 256;
73
+
74
+ /** One block's lines, and the elements they were drawn as. */
75
+ interface Block {
76
+ lines: readonly AnsiLine[];
77
+ output: ReactElement;
78
+ gutter: ReactElement | null;
79
+ }
80
+
58
81
  /** What `data` accepts on top of raw bytes: a document parsed elsewhere. */
59
82
  export type TerminalOutputSource = AnsiInput | AnsiDocument;
60
83
 
@@ -257,6 +280,7 @@ export function TerminalOutput(props: TerminalOutputProps): ReactElement {
257
280
  }),
258
281
  [theme, props.fontSize, props.monoFamily],
259
282
  );
283
+ useFontPrewarm(look.family);
260
284
 
261
285
  // The colour maths (dim, inverse, conceal) resolves against the *page*
262
286
  // rather than against the block's tint: the tint is translucent, and an
@@ -271,38 +295,105 @@ export function TerminalOutput(props: TerminalOutputProps): ReactElement {
271
295
  [colors, look.color, theme.background],
272
296
  );
273
297
 
274
- const runs: TextRun[] = React.useMemo(
275
- () =>
276
- documentRuns(document, { family: look.family, size: look.size }, palette),
277
- [document, look.family, look.size, palette],
278
- );
298
+ // Kept across renders while what a block is drawn with holds.
299
+ const blocks = React.useRef<{
300
+ look: typeof look;
301
+ palette: typeof palette;
302
+ wrap: boolean;
303
+ lineNumbers: boolean;
304
+ byIndex: Map<number, Block>;
305
+ } | null>(null);
306
+ if (
307
+ blocks.current?.look !== look ||
308
+ blocks.current.palette !== palette ||
309
+ blocks.current.wrap !== wrap ||
310
+ blocks.current.lineNumbers !== lineNumbers
311
+ ) {
312
+ blocks.current = { look, palette, wrap, lineNumbers, byIndex: new Map() };
313
+ }
314
+ const byIndex = blocks.current.byIndex;
315
+ const font = { family: look.family, size: look.size };
316
+ const outputStyle = codeTextStyle(look, wrap);
317
+ const gutterStyle: Style = {
318
+ lineHeight: look.lineHeight,
319
+ textAlign: 'right',
320
+ };
279
321
 
280
- const outputProps: RichTextProps = { runs, style: codeTextStyle(look) };
281
- if (!wrap) outputProps.wrap = false;
322
+ // The capture's own numbering: the first line shown is the one after
323
+ // every line `maxLines` has dropped.
324
+ const first = document.truncated;
325
+ const end = first + document.lines.length;
326
+ const outputs: ReactElement[] = [];
327
+ const gutters: ReactElement[] = [];
328
+ const kept = new Set<number>();
329
+ for (
330
+ let start = first - (first % BLOCK_LINES);
331
+ start < end || outputs.length === 0;
332
+ start += BLOCK_LINES
333
+ ) {
334
+ const index = start / BLOCK_LINES;
335
+ const from = Math.max(start, first) - first;
336
+ const to = Math.min(start + BLOCK_LINES, end) - first;
337
+ const lines = document.lines.slice(from, to);
338
+ let block = byIndex.get(index);
339
+ if (!block || !sameLines(block.lines, lines)) {
340
+ const outputProps: RichTextProps = {
341
+ runs: linesRuns(lines, font, palette),
342
+ style: outputStyle,
343
+ };
344
+ if (!wrap) outputProps.wrap = false;
345
+ block = {
346
+ lines,
347
+ output: h(RICHTEXT_ELEMENT, {
348
+ key: index,
349
+ ...outputProps,
350
+ } as Record<string, unknown>),
351
+ gutter: lineNumbers
352
+ ? h(RICHTEXT_ELEMENT, {
353
+ key: index,
354
+ // The numbers are chrome, not text: `selectable={false}` keeps
355
+ // them out of a drag and out of the copied text.
356
+ selectable: false,
357
+ runs: lines.map((_, i) => ({
358
+ text:
359
+ i === lines.length - 1
360
+ ? `${first + from + i + 1}`
361
+ : `${first + from + i + 1}\n`,
362
+ family: look.family,
363
+ size: look.size,
364
+ color: look.dim,
365
+ })),
366
+ wrap: false,
367
+ style: gutterStyle,
368
+ } as Record<string, unknown>)
369
+ : null,
370
+ };
371
+ byIndex.set(index, block);
372
+ }
373
+ kept.add(index);
374
+ outputs.push(block.output);
375
+ if (block.gutter) gutters.push(block.gutter);
376
+ }
377
+ for (const index of byIndex.keys()) {
378
+ if (!kept.has(index)) byIndex.delete(index);
379
+ }
282
380
 
283
- const lineCount = document.lines.length;
381
+ // One column of numbers per column of output, block beside block: the
382
+ // same font and line height keep them in register.
284
383
  const gutter = lineNumbers
285
- ? h(RICHTEXT_ELEMENT, {
286
- // One richtext for all the numbers: same font, same line height, so
287
- // it stays in register with the output beside it. `selectable={false}`
288
- // is what keeps it out of a drag and out of the copied text.
289
- selectable: false,
290
- runs: Array.from({ length: lineCount }, (_, i) => ({
291
- text: i === lineCount - 1 ? `${i + 1}` : `${i + 1}\n`,
292
- family: look.family,
293
- size: look.size,
294
- color: look.dim,
295
- })),
296
- wrap: false,
297
- style: {
298
- lineHeight: look.lineHeight,
299
- textAlign: 'right',
300
- minWidth:
301
- Math.max(String(lineCount).length, 2) * Math.ceil(look.size * 0.62),
302
- marginRight: look.padding,
303
- flexShrink: 0,
384
+ ? hx(
385
+ 'box',
386
+ {
387
+ style: {
388
+ flexDirection: 'column',
389
+ minWidth:
390
+ Math.max(String(end).length, 2) * Math.ceil(look.size * 0.62),
391
+ marginRight: look.padding,
392
+ flexShrink: 0,
393
+ },
304
394
  },
305
- } as Record<string, unknown>)
395
+ ...gutters,
396
+ )
306
397
  : null;
307
398
 
308
399
  const rootStyle: Style = {
@@ -334,7 +425,14 @@ export function TerminalOutput(props: TerminalOutputProps): ReactElement {
334
425
  hx(
335
426
  'box',
336
427
  { style: { overflow: 'scroll', flexDirection: 'column', flexGrow: 1 } },
337
- h(RICHTEXT_ELEMENT, outputProps as unknown as Record<string, unknown>),
428
+ ...outputs,
338
429
  ),
339
430
  );
340
431
  }
432
+
433
+ /** Whether two runs of lines are the same objects, one for one. */
434
+ function sameLines(a: readonly AnsiLine[], b: readonly AnsiLine[]): boolean {
435
+ if (a.length !== b.length) return false;
436
+ for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
437
+ return true;
438
+ }
@@ -5,7 +5,12 @@
5
5
  // parser said "ANSI 2", `../ansi/palette.ts` said which pixels that is, and
6
6
  // here it becomes a run the text layout can take.
7
7
  import { resolveAnsiColors } from '../ansi/index.js';
8
- import type { AnsiDocument, AnsiPalette, AnsiSpan } from '../ansi/index.js';
8
+ import type {
9
+ AnsiDocument,
10
+ AnsiLine,
11
+ AnsiPalette,
12
+ AnsiSpan,
13
+ } from '../ansi/index.js';
9
14
  import type { TextRun } from '../richtext/index.js';
10
15
 
11
16
  /** The font a capture is set in. The palette is separate because it changes
@@ -64,9 +69,18 @@ export function documentRuns(
64
69
  document: AnsiDocument,
65
70
  font: OutputFont,
66
71
  palette: AnsiPalette,
72
+ ): TextRun[] {
73
+ return linesRuns(document.lines, font, palette);
74
+ }
75
+
76
+ /** Some of a document's lines as runs, the way {@link documentRuns} makes
77
+ * all of them: a block of `<TerminalOutput>`'s output. */
78
+ export function linesRuns(
79
+ lines: readonly AnsiLine[],
80
+ font: OutputFont,
81
+ palette: AnsiPalette,
67
82
  ): TextRun[] {
68
83
  const runs: TextRun[] = [];
69
- const { lines } = document;
70
84
  for (let i = 0; i < lines.length; i++) {
71
85
  for (const span of lines[i]!.spans) {
72
86
  if (span.text) runs.push(spanRun(span, font, palette));
@@ -3,7 +3,9 @@
3
3
  //
4
4
  // The division of labour: `<glarea>` owns everything that is renderer
5
5
  // internals — the child X window on a GL visual, the context, the frame
6
- // clock, the swap — and exposes it as `onCreated`/`onDraw`/`frameLoop`.
6
+ // clock, the swap — and exposes it as `onCreated`/`onDraw`/`frameLoop`. On
7
+ // a core with react-x11#545 the pointer over the surface is the tree's too,
8
+ // dispatched at the `<glarea>` like the pointer over any node.
7
9
  // This component owns everything that is scene: the second reconciler
8
10
  // rendering `children` into the object graph, the store `useThree`/`useFrame`
9
11
  // read, the backend-appropriate renderer, picking, and post-processing.
@@ -24,7 +26,7 @@ import {
24
26
  } from 'react';
25
27
  import type { ReactNode, Ref } from 'react';
26
28
  import { useSupports } from 'react-x11';
27
- import type { ReactX11Elements } from 'react-x11';
29
+ import type { ReactX11Elements, SyntheticEvent } from 'react-x11';
28
30
  // Loads the module the JSX augmentation in jsx.ts targets (see flow/index.ts
29
31
  // for the same pattern). Type-only, so it is erased.
30
32
  import type {} from 'react-x11/jsx-runtime';
@@ -42,9 +44,10 @@ import { IndirectRenderer } from './renderer-indirect.js';
42
44
  import { DirectRenderer } from './renderer-direct.js';
43
45
  import { PostProcessor } from './postprocess.js';
44
46
  import type { EffectComposer } from './passes.js';
45
- import { ScenePointer, type ThreeEvent } from './events.js';
47
+ import { ForwardedPointer, ScenePointer, type ThreeEvent } from './events.js';
46
48
  import { sceneWantsPointer } from './raycast.js';
47
49
  import { now, warn } from './globals.js';
50
+ import { scaleOf } from '../internal/units.js';
48
51
 
49
52
  /**
50
53
  * Failures that mean "one thing in this scene is broken", not "this machine
@@ -64,12 +67,43 @@ type GlAreaProps = ReactX11Elements['glarea'];
64
67
  /** The glarea node surface this component reaches through its ref. */
65
68
  interface SurfaceNode {
66
69
  requestFrame?: () => void;
70
+ /** `true` where core dispatches the pointer over the surface at this node,
71
+ * through the tree (react-x11#545); absent on a core that does not. */
72
+ forwardsPointer?: boolean;
73
+ /** The node's box, which is the surface's: device pixels, in the owning
74
+ * window's space. */
75
+ abs?: { x: number; y: number };
67
76
  window?: {
77
+ /** The X window's id — the Cocoa backend's surface is a layer, and has
78
+ * none. */
79
+ id?: unknown;
68
80
  on(name: string, handler: (event: { x: number; y: number }) => void): void;
81
+ /** The cursor X shows over the window. The Cocoa backend's layer has
82
+ * none: there the only cursor is the owning window's, and core's. */
69
83
  setCursor?(cursor: string | null): void;
70
84
  } | null;
71
85
  }
72
86
 
87
+ /**
88
+ * A pointer event where the scene measures it: device pixels from the
89
+ * surface's corner, as the surface's own X window reports them. Core hands a
90
+ * handler the point in the window's logical pixels — divided by the node's
91
+ * scale — while the surface covers the node's box, `abs`, in device pixels:
92
+ * so the point goes back to device pixels and the box's corner comes off.
93
+ * (The content box's corner would be out by any padding or border, which the
94
+ * surface covers too.)
95
+ */
96
+ function surfacePoint(
97
+ node: SurfaceNode | null,
98
+ ev: { x: number; y: number },
99
+ ): { x: number; y: number } {
100
+ const scale = scaleOf(node);
101
+ return {
102
+ x: ev.x * scale - (node?.abs?.x ?? 0),
103
+ y: ev.y * scale - (node?.abs?.y ?? 0),
104
+ };
105
+ }
106
+
73
107
  interface DrawInfo {
74
108
  width: number;
75
109
  height: number;
@@ -119,6 +153,8 @@ interface CanvasKit {
119
153
  store: ThreeStore;
120
154
  container: SceneContainer;
121
155
  pointer: ScenePointer;
156
+ /** The pointer as core forwards it, which the surface's handlers feed. */
157
+ forwarded: ForwardedPointer;
122
158
  renderer: IndirectRenderer | DirectRenderer | null;
123
159
  post: PostProcessor | null;
124
160
  gl: unknown;
@@ -148,6 +184,9 @@ export function Canvas({
148
184
  const supportsShaders = useSupports('shaders');
149
185
  const [error, setError] = useState<Error | null>(null);
150
186
  const areaRef = useRef<unknown>(null);
187
+ // The hovered object's cursor, where the surface cannot wear it itself
188
+ // (`forwarded` below).
189
+ const [sceneCursor, setSceneCursor] = useState<string | null>(null);
151
190
 
152
191
  // Everything with the canvas's lifetime, made once. The camera the scene
153
192
  // starts with is the default one; `<perspectiveCamera makeDefault>`
@@ -193,6 +232,23 @@ export function Canvas({
193
232
  missedRef.current?.(event);
194
233
  },
195
234
  }),
235
+ // Where a hovered object's cursor goes. An X window wears a cursor of
236
+ // its own, and X shows it over the window — or, while it is null, the
237
+ // parent's, which is core's — so on X11 the scene's goes straight
238
+ // onto the surface: on at once, and off again onto whatever the tree
239
+ // asked for. The Cocoa backend's surface is a layer, and there the
240
+ // only cursor is the window's, which core puts on from the style of
241
+ // the node under the pointer and remembers having put on. Set behind
242
+ // core's back, it would outlast the hover wherever core saw nothing
243
+ // to change. So there the scene's becomes the `<glarea>`'s own
244
+ // `cursor`, and core applies it like any other: from the motion after
245
+ // the one the scene heard, because core picks the window's cursor
246
+ // before it dispatches the motion.
247
+ forwarded: new ForwardedPointer((cursor) => {
248
+ const surface = (areaRef.current as SurfaceNode | null)?.window;
249
+ if (typeof surface?.setCursor === 'function') surface.setCursor(cursor);
250
+ else setSceneCursor(cursor);
251
+ }),
196
252
  renderer: null,
197
253
  post: null,
198
254
  gl: null,
@@ -359,14 +415,24 @@ export function Canvas({
359
415
  clock.delta = delta;
360
416
  store.runFrames(store.getState(), delta);
361
417
 
362
- // pointer events are only worth selecting on the X window when
363
- // something in the scene listens — checked when the tree said it
364
- // changed, attached the first time it is true
418
+ // The pointer is only worth taking when something in the scene
419
+ // listens — checked when the tree said it changed, attached the first
420
+ // time it is true. Where core forwards it (react-x11#545) it comes from
421
+ // the surface's own handlers and nowhere else: a listener on the
422
+ // surface's X window would select the events there, and X would
423
+ // deliver every press, and the wheel, to that window rather than to
424
+ // the tree. An older core delivers nothing over the surface, so there
425
+ // it is the X window's own events — X11 only, since the Cocoa surface
426
+ // is a layer, with no X window id and no pointer events of its own.
365
427
  if (store.eventsDirty) {
366
428
  store.eventsDirty = false;
367
429
  if (!kit.pointer.attached && sceneWantsPointer(kit.scene.children)) {
368
430
  const node = areaRef.current as SurfaceNode | null;
369
- if (node?.window) kit.pointer.attach(node.window);
431
+ if (node?.forwardsPointer === true) {
432
+ kit.pointer.attach(kit.forwarded);
433
+ } else if (node?.window && typeof node.window.id === 'number') {
434
+ kit.pointer.attach(node.window);
435
+ }
370
436
  }
371
437
  }
372
438
 
@@ -425,6 +491,31 @@ export function Canvas({
425
491
  [kit],
426
492
  );
427
493
 
494
+ // The pointer core dispatches at the surface, into the scene — through
495
+ // `kit.forwarded`, which passes it on only once the frame loop attached
496
+ // the scene to it. Where the pointer comes from the surface's X window
497
+ // instead, these hear nothing of it and pass nothing on.
498
+ const pointerHandlers = useMemo(() => {
499
+ const at = (ev: SyntheticEvent) =>
500
+ surfacePoint(areaRef.current as SurfaceNode | null, ev);
501
+ return {
502
+ onMouseDown: (ev: SyntheticEvent) => {
503
+ // Held until the release, as X's grab held it for the surface's
504
+ // window: a drag that leaves the canvas still reaches the scene.
505
+ if (kit.forwarded.emit('mousedown', at(ev))) ev.capturePointer();
506
+ },
507
+ onMouseMove: (ev: SyntheticEvent) => {
508
+ kit.forwarded.emit('mousemove', at(ev));
509
+ },
510
+ onMouseUp: (ev: SyntheticEvent) => {
511
+ kit.forwarded.emit('mouseup', at(ev));
512
+ },
513
+ onMouseLeave: (ev: SyntheticEvent) => {
514
+ kit.forwarded.emit('mouseout', at(ev));
515
+ },
516
+ };
517
+ }, [kit]);
518
+
428
519
  if (error && fallback !== undefined) {
429
520
  return hx(
430
521
  'box',
@@ -440,12 +531,15 @@ export function Canvas({
440
531
 
441
532
  return hx('glarea', {
442
533
  ref: areaRef as Ref<never>,
443
- style,
534
+ // over the canvas's own, as a child's cursor is over its parent's: the
535
+ // object is what the pointer is on
536
+ style: sceneCursor === null ? style : [style, { cursor: sceneCursor }],
444
537
  clearColor,
445
538
  glx,
446
539
  frameLoop: loop,
447
540
  onCreated: handleCreated as GlAreaProps['onCreated'],
448
541
  onDraw: handleDraw as GlAreaProps['onDraw'],
449
542
  onError: handleError,
543
+ ...pointerHandlers,
450
544
  });
451
545
  }
@@ -1,8 +1,14 @@
1
- // Pointer events for the scene: X mouse events on the `<glarea>`'s child
2
- // window, raycast against the CPU-side geometry, dispatched to the object
3
- // they hit and bubbled up its ancestors — a port of react-x11's
4
- // `src/pointer3d.js` onto the object graph, with the event shaped the way
5
- // r3f handlers expect (`object`, `point`, `distance`, `stopPropagation`).
1
+ // Pointer events for the scene: the pointer over the `<glarea>`, raycast
2
+ // against the CPU-side geometry, dispatched to the object it hit and
3
+ // bubbled up its ancestors — a port of react-x11's `src/pointer3d.js` onto
4
+ // the object graph, with the event shaped the way r3f handlers expect
5
+ // (`object`, `point`, `distance`, `stopPropagation`).
6
+ //
7
+ // Where the pointer comes from is the canvas's to say (canvas.ts): the
8
+ // `<glarea>`'s own handlers, on a core that dispatches the pointer over a
9
+ // surface through the tree (react-x11#545), or the surface's child X window
10
+ // on one that does not. Either way it arrives here as a `PointerSource`, in
11
+ // device pixels from the surface's corner.
6
12
  import type { Mesh, Object3D, Scene } from './objects.js';
7
13
  import { raycast } from './raycast.js';
8
14
  import type { RayHit } from './raycast.js';
@@ -37,6 +43,40 @@ export interface PointerSource {
37
43
  setCursor?(cursor: string | null): void;
38
44
  }
39
45
 
46
+ /**
47
+ * The pointer a core dispatches through the tree, as a `PointerSource`: the
48
+ * canvas's `<glarea>` handlers `emit` what they are handed, already in the
49
+ * surface's device pixels, and the scene subscribes to it as it would to a
50
+ * window. Where a hovered object's cursor goes is the canvas's to say, as
51
+ * where the pointer comes from is: onto the surface's own X window, or,
52
+ * where the surface is a layer that cannot wear one, into the `<glarea>`'s
53
+ * style.
54
+ */
55
+ export class ForwardedPointer implements PointerSource {
56
+ private handlers = new Map<string, (event: NativeMouse) => void>();
57
+ private applyCursor: (cursor: string | null) => void;
58
+
59
+ constructor(applyCursor: (cursor: string | null) => void) {
60
+ this.applyCursor = applyCursor;
61
+ }
62
+
63
+ on(name: string, handler: (event: NativeMouse) => void): void {
64
+ this.handlers.set(name, handler);
65
+ }
66
+
67
+ /** Hand an event to the scene: false while nothing has subscribed. */
68
+ emit(name: string, event: NativeMouse): boolean {
69
+ const handler = this.handlers.get(name);
70
+ if (!handler) return false;
71
+ handler(event);
72
+ return true;
73
+ }
74
+
75
+ setCursor(cursor: string | null): void {
76
+ this.applyCursor(cursor);
77
+ }
78
+ }
79
+
40
80
  /** The dispatch path: the object that was hit, then its ancestors. */
41
81
  function bubblePath(node: Object3D, scene: Scene): Object3D[] {
42
82
  const path: Object3D[] = [];
@@ -51,10 +91,10 @@ function bubblePath(node: Object3D, scene: Scene): Object3D[] {
51
91
  }
52
92
 
53
93
  /**
54
- * One canvas's pointer pipeline. The canvas attaches it to the surface's
55
- * child X window once anything in the scene listens; hover and press state
56
- * live here so enter/leave pairs and click (down and up on the same object)
57
- * come out right.
94
+ * One canvas's pointer pipeline. The canvas attaches it to where the pointer
95
+ * comes from — the tree, or the surface's child X window — once anything in
96
+ * the scene listens; hover and press state live here so enter/leave pairs
97
+ * and click (down and up on the same object) come out right.
58
98
  */
59
99
  export class ScenePointer {
60
100
  private scene: Scene;
package/src/tree/index.ts CHANGED
@@ -919,6 +919,24 @@ export function Tree<T = TreeItem>({
919
919
  const index = heights;
920
920
  index.sync(rows, estimate);
921
921
 
922
+ /**
923
+ * One drawn row into the height index, for the window's trim: it may drop
924
+ * a row only once the index knows the height the row is laid out at, and
925
+ * a flick reaches the trailing rows long before `measureRows` does (see
926
+ * `measure` on the window's inputs).
927
+ */
928
+ const measureDrawn = useCallback(
929
+ (id: TreeItemId, at: number): boolean => {
930
+ const drawn = rowNodes.current.get(id);
931
+ if (!drawn || drawn.at !== at) return false;
932
+ heights.measure(id, at, drawn.node.abs.height / scaleOf(drawn.node));
933
+ return heights.isMeasured(at);
934
+ },
935
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- `heights` is a
936
+ // stable instance
937
+ [],
938
+ );
939
+
922
940
  /** The viewport, and the slice worth building from it — the machinery
923
941
  * shared with `<Table>` (`../internal/window.ts`). */
924
942
  const win = useVirtualWindow({
@@ -934,6 +952,7 @@ export function Tree<T = TreeItem>({
934
952
  threshold: catchup?.threshold ?? SKELETON_THRESHOLD,
935
953
  burstBudget: catchup?.burst ?? BURST_BUDGET,
936
954
  settleBudget: catchup?.settle ?? SETTLE_BUDGET,
955
+ measure: measureDrawn,
937
956
  });
938
957
  const { view, viewRef } = win;
939
958
  /** Whether the fast-scroll pill is up — kept across renders so it does not