@react-x11/components 0.9.0 → 0.10.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 (550) 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 +3 -1
  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/languages/glsl.d.ts.map +1 -1
  24. package/dist/code-language/languages/glsl.js +10 -2
  25. package/dist/code-language/languages/glsl.js.map +1 -1
  26. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  27. package/dist/code-language/languages/javascript.js +18 -3
  28. package/dist/code-language/languages/javascript.js.map +1 -1
  29. package/dist/code-language/languages/json.d.ts.map +1 -1
  30. package/dist/code-language/languages/json.js +10 -2
  31. package/dist/code-language/languages/json.js.map +1 -1
  32. package/dist/code-language/languages/shell.d.ts.map +1 -1
  33. package/dist/code-language/languages/shell.js +10 -2
  34. package/dist/code-language/languages/shell.js.map +1 -1
  35. package/dist/code-language/languages/sql.d.ts.map +1 -1
  36. package/dist/code-language/languages/sql.js +20 -2
  37. package/dist/code-language/languages/sql.js.map +1 -1
  38. package/dist/code-language/stream.d.ts +22 -0
  39. package/dist/code-language/stream.d.ts.map +1 -1
  40. package/dist/code-language/stream.js +259 -9
  41. package/dist/code-language/stream.js.map +1 -1
  42. package/dist/code-language/types.d.ts +5 -4
  43. package/dist/code-language/types.d.ts.map +1 -1
  44. package/dist/codeblock/index.d.ts +13 -2
  45. package/dist/codeblock/index.d.ts.map +1 -1
  46. package/dist/codeblock/index.js +20 -3
  47. package/dist/codeblock/index.js.map +1 -1
  48. package/dist/flow/draw.d.ts +50 -0
  49. package/dist/flow/draw.d.ts.map +1 -1
  50. package/dist/flow/draw.js +132 -33
  51. package/dist/flow/draw.js.map +1 -1
  52. package/dist/flow/gl/color.d.ts +13 -0
  53. package/dist/flow/gl/color.d.ts.map +1 -0
  54. package/dist/flow/gl/color.js +82 -0
  55. package/dist/flow/gl/color.js.map +1 -0
  56. package/dist/flow/gl/index.d.ts +60 -0
  57. package/dist/flow/gl/index.d.ts.map +1 -0
  58. package/dist/flow/gl/index.js +283 -0
  59. package/dist/flow/gl/index.js.map +1 -0
  60. package/dist/flow/gl/pack.d.ts +133 -0
  61. package/dist/flow/gl/pack.d.ts.map +1 -0
  62. package/dist/flow/gl/pack.js +408 -0
  63. package/dist/flow/gl/pack.js.map +1 -0
  64. package/dist/flow/gl/renderer.d.ts +95 -0
  65. package/dist/flow/gl/renderer.d.ts.map +1 -0
  66. package/dist/flow/gl/renderer.js +459 -0
  67. package/dist/flow/gl/renderer.js.map +1 -0
  68. package/dist/flow/gl/shaders.d.ts +79 -0
  69. package/dist/flow/gl/shaders.d.ts.map +1 -0
  70. package/dist/flow/gl/shaders.js +346 -0
  71. package/dist/flow/gl/shaders.js.map +1 -0
  72. package/dist/flow/gl/text.d.ts +318 -0
  73. package/dist/flow/gl/text.d.ts.map +1 -0
  74. package/dist/flow/gl/text.js +1103 -0
  75. package/dist/flow/gl/text.js.map +1 -0
  76. package/dist/flow/index.d.ts +1 -1
  77. package/dist/flow/index.d.ts.map +1 -1
  78. package/dist/flow/index.js +619 -64
  79. package/dist/flow/index.js.map +1 -1
  80. package/dist/flow/node.d.ts +621 -72
  81. package/dist/flow/node.d.ts.map +1 -1
  82. package/dist/flow/node.js +2253 -1018
  83. package/dist/flow/node.js.map +1 -1
  84. package/dist/flow/paint.d.ts +35 -0
  85. package/dist/flow/paint.d.ts.map +1 -0
  86. package/dist/flow/paint.js +393 -0
  87. package/dist/flow/paint.js.map +1 -0
  88. package/dist/flow/paths.d.ts +14 -0
  89. package/dist/flow/paths.d.ts.map +1 -1
  90. package/dist/flow/paths.js +45 -19
  91. package/dist/flow/paths.js.map +1 -1
  92. package/dist/flow/scene.d.ts +584 -0
  93. package/dist/flow/scene.d.ts.map +1 -0
  94. package/dist/flow/scene.js +1453 -0
  95. package/dist/flow/scene.js.map +1 -0
  96. package/dist/flow/types.d.ts +111 -1
  97. package/dist/flow/types.d.ts.map +1 -1
  98. package/dist/html/controls.d.ts +28 -0
  99. package/dist/html/controls.d.ts.map +1 -1
  100. package/dist/html/controls.js +52 -2
  101. package/dist/html/controls.js.map +1 -1
  102. package/dist/html/css/calc.d.ts +14 -0
  103. package/dist/html/css/calc.d.ts.map +1 -0
  104. package/dist/html/css/calc.js +344 -0
  105. package/dist/html/css/calc.js.map +1 -0
  106. package/dist/html/css/cascade.d.ts +240 -6
  107. package/dist/html/css/cascade.d.ts.map +1 -1
  108. package/dist/html/css/cascade.js +1327 -66
  109. package/dist/html/css/cascade.js.map +1 -1
  110. package/dist/html/css/color.d.ts +23 -0
  111. package/dist/html/css/color.d.ts.map +1 -0
  112. package/dist/html/css/color.js +740 -0
  113. package/dist/html/css/color.js.map +1 -0
  114. package/dist/html/css/content.d.ts +92 -0
  115. package/dist/html/css/content.d.ts.map +1 -0
  116. package/dist/html/css/content.js +388 -0
  117. package/dist/html/css/content.js.map +1 -0
  118. package/dist/html/css/counter-styles.d.ts +76 -0
  119. package/dist/html/css/counter-styles.d.ts.map +1 -0
  120. package/dist/html/css/counter-styles.js +893 -0
  121. package/dist/html/css/counter-styles.js.map +1 -0
  122. package/dist/html/css/decode.d.ts +12 -0
  123. package/dist/html/css/decode.d.ts.map +1 -0
  124. package/dist/html/css/decode.js +116 -0
  125. package/dist/html/css/decode.js.map +1 -0
  126. package/dist/html/css/parse.d.ts +110 -10
  127. package/dist/html/css/parse.d.ts.map +1 -1
  128. package/dist/html/css/parse.js +1473 -180
  129. package/dist/html/css/parse.js.map +1 -1
  130. package/dist/html/css/style.d.ts +498 -15
  131. package/dist/html/css/style.d.ts.map +1 -1
  132. package/dist/html/css/style.js +3698 -206
  133. package/dist/html/css/style.js.map +1 -1
  134. package/dist/html/css/ua.d.ts.map +1 -1
  135. package/dist/html/css/ua.js +57 -11
  136. package/dist/html/css/ua.js.map +1 -1
  137. package/dist/html/css/values.d.ts +37 -3
  138. package/dist/html/css/values.d.ts.map +1 -1
  139. package/dist/html/css/values.js +122 -48
  140. package/dist/html/css/values.js.map +1 -1
  141. package/dist/html/css/vars.d.ts +52 -0
  142. package/dist/html/css/vars.d.ts.map +1 -0
  143. package/dist/html/css/vars.js +358 -0
  144. package/dist/html/css/vars.js.map +1 -0
  145. package/dist/html/dom.d.ts +30 -4
  146. package/dist/html/dom.d.ts.map +1 -1
  147. package/dist/html/dom.js +278 -17
  148. package/dist/html/dom.js.map +1 -1
  149. package/dist/html/fonts.d.ts +106 -0
  150. package/dist/html/fonts.d.ts.map +1 -0
  151. package/dist/html/fonts.js +565 -0
  152. package/dist/html/fonts.js.map +1 -0
  153. package/dist/html/gif.d.ts +15 -0
  154. package/dist/html/gif.d.ts.map +1 -0
  155. package/dist/html/gif.js +229 -0
  156. package/dist/html/gif.js.map +1 -0
  157. package/dist/html/index.d.ts +50 -11
  158. package/dist/html/index.d.ts.map +1 -1
  159. package/dist/html/index.js +115 -9
  160. package/dist/html/index.js.map +1 -1
  161. package/dist/html/layout/block.d.ts +226 -3
  162. package/dist/html/layout/block.d.ts.map +1 -1
  163. package/dist/html/layout/block.js +2937 -197
  164. package/dist/html/layout/block.js.map +1 -1
  165. package/dist/html/layout/boxes.d.ts +340 -17
  166. package/dist/html/layout/boxes.d.ts.map +1 -1
  167. package/dist/html/layout/boxes.js +1714 -182
  168. package/dist/html/layout/boxes.js.map +1 -1
  169. package/dist/html/layout/cache.d.ts +58 -0
  170. package/dist/html/layout/cache.d.ts.map +1 -0
  171. package/dist/html/layout/cache.js +224 -0
  172. package/dist/html/layout/cache.js.map +1 -0
  173. package/dist/html/layout/collapse.d.ts +45 -0
  174. package/dist/html/layout/collapse.d.ts.map +1 -0
  175. package/dist/html/layout/collapse.js +246 -0
  176. package/dist/html/layout/collapse.js.map +1 -0
  177. package/dist/html/layout/css-grid.d.ts +7 -0
  178. package/dist/html/layout/css-grid.d.ts.map +1 -0
  179. package/dist/html/layout/css-grid.js +900 -0
  180. package/dist/html/layout/css-grid.js.map +1 -0
  181. package/dist/html/layout/flex.d.ts.map +1 -1
  182. package/dist/html/layout/flex.js +1025 -89
  183. package/dist/html/layout/flex.js.map +1 -1
  184. package/dist/html/layout/floats.d.ts +45 -6
  185. package/dist/html/layout/floats.d.ts.map +1 -1
  186. package/dist/html/layout/floats.js +113 -14
  187. package/dist/html/layout/floats.js.map +1 -1
  188. package/dist/html/layout/grid-lines.d.ts +39 -0
  189. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  190. package/dist/html/layout/grid-lines.js +119 -0
  191. package/dist/html/layout/grid-lines.js.map +1 -0
  192. package/dist/html/layout/grid.d.ts +53 -0
  193. package/dist/html/layout/grid.d.ts.map +1 -0
  194. package/dist/html/layout/grid.js +153 -0
  195. package/dist/html/layout/grid.js.map +1 -0
  196. package/dist/html/layout/inline.d.ts +151 -1
  197. package/dist/html/layout/inline.d.ts.map +1 -1
  198. package/dist/html/layout/inline.js +3375 -174
  199. package/dist/html/layout/inline.js.map +1 -1
  200. package/dist/html/layout/shaping.d.ts +6 -0
  201. package/dist/html/layout/shaping.d.ts.map +1 -0
  202. package/dist/html/layout/shaping.js +100 -0
  203. package/dist/html/layout/shaping.js.map +1 -0
  204. package/dist/html/layout/table.d.ts +3 -0
  205. package/dist/html/layout/table.d.ts.map +1 -1
  206. package/dist/html/layout/table.js +681 -175
  207. package/dist/html/layout/table.js.map +1 -1
  208. package/dist/html/layout/tracks.d.ts +44 -0
  209. package/dist/html/layout/tracks.d.ts.map +1 -0
  210. package/dist/html/layout/tracks.js +349 -0
  211. package/dist/html/layout/tracks.js.map +1 -0
  212. package/dist/html/node.d.ts +169 -4
  213. package/dist/html/node.d.ts.map +1 -1
  214. package/dist/html/node.js +1331 -100
  215. package/dist/html/node.js.map +1 -1
  216. package/dist/html/paint.d.ts +92 -3
  217. package/dist/html/paint.d.ts.map +1 -1
  218. package/dist/html/paint.js +3503 -141
  219. package/dist/html/paint.js.map +1 -1
  220. package/dist/html/resources.d.ts +60 -14
  221. package/dist/html/resources.d.ts.map +1 -1
  222. package/dist/html/resources.js +122 -36
  223. package/dist/html/resources.js.map +1 -1
  224. package/dist/html/surfaces.d.ts +23 -0
  225. package/dist/html/surfaces.d.ts.map +1 -0
  226. package/dist/html/surfaces.js +68 -0
  227. package/dist/html/surfaces.js.map +1 -0
  228. package/dist/html/svg.d.ts +80 -0
  229. package/dist/html/svg.d.ts.map +1 -0
  230. package/dist/html/svg.js +435 -0
  231. package/dist/html/svg.js.map +1 -0
  232. package/dist/html/url.d.ts +23 -0
  233. package/dist/html/url.d.ts.map +1 -0
  234. package/dist/html/url.js +80 -0
  235. package/dist/html/url.js.map +1 -0
  236. package/dist/index.d.ts +1 -1
  237. package/dist/index.d.ts.map +1 -1
  238. package/dist/index.js.map +1 -1
  239. package/dist/internal/collate.d.ts +3 -0
  240. package/dist/internal/collate.d.ts.map +1 -0
  241. package/dist/internal/collate.js +11 -0
  242. package/dist/internal/collate.js.map +1 -0
  243. package/dist/internal/markdown/ast.d.ts +11 -0
  244. package/dist/internal/markdown/ast.d.ts.map +1 -1
  245. package/dist/internal/markdown/parse.d.ts.map +1 -1
  246. package/dist/internal/markdown/parse.js +109 -8
  247. package/dist/internal/markdown/parse.js.map +1 -1
  248. package/dist/internal/prewarm.d.ts +18 -0
  249. package/dist/internal/prewarm.d.ts.map +1 -0
  250. package/dist/internal/prewarm.js +42 -0
  251. package/dist/internal/prewarm.js.map +1 -0
  252. package/dist/internal/sdf.d.ts +20 -0
  253. package/dist/internal/sdf.d.ts.map +1 -0
  254. package/dist/internal/sdf.js +216 -0
  255. package/dist/internal/sdf.js.map +1 -0
  256. package/dist/internal/splice.d.ts +12 -0
  257. package/dist/internal/splice.d.ts.map +1 -0
  258. package/dist/internal/splice.js +23 -0
  259. package/dist/internal/splice.js.map +1 -0
  260. package/dist/internal/window.d.ts +12 -0
  261. package/dist/internal/window.d.ts.map +1 -1
  262. package/dist/internal/window.js +23 -6
  263. package/dist/internal/window.js.map +1 -1
  264. package/dist/maps/anchors.d.ts +6 -1
  265. package/dist/maps/anchors.d.ts.map +1 -1
  266. package/dist/maps/anchors.js +260 -1
  267. package/dist/maps/anchors.js.map +1 -1
  268. package/dist/maps/controller.d.ts +57 -0
  269. package/dist/maps/controller.d.ts.map +1 -1
  270. package/dist/maps/controller.js +97 -18
  271. package/dist/maps/controller.js.map +1 -1
  272. package/dist/maps/gl/buckets.d.ts +5 -1
  273. package/dist/maps/gl/buckets.d.ts.map +1 -1
  274. package/dist/maps/gl/buckets.js +5 -2
  275. package/dist/maps/gl/buckets.js.map +1 -1
  276. package/dist/maps/gl/build-worker.d.ts +2 -0
  277. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  278. package/dist/maps/gl/build-worker.js +1 -1
  279. package/dist/maps/gl/build-worker.js.map +1 -1
  280. package/dist/maps/gl/cover.d.ts +23 -4
  281. package/dist/maps/gl/cover.d.ts.map +1 -1
  282. package/dist/maps/gl/cover.js +61 -48
  283. package/dist/maps/gl/cover.js.map +1 -1
  284. package/dist/maps/gl/placement.d.ts +21 -8
  285. package/dist/maps/gl/placement.d.ts.map +1 -1
  286. package/dist/maps/gl/placement.js +133 -58
  287. package/dist/maps/gl/placement.js.map +1 -1
  288. package/dist/maps/gl/renderer.d.ts +36 -4
  289. package/dist/maps/gl/renderer.d.ts.map +1 -1
  290. package/dist/maps/gl/renderer.js +81 -24
  291. package/dist/maps/gl/renderer.js.map +1 -1
  292. package/dist/maps/gl/shaders.d.ts +18 -17
  293. package/dist/maps/gl/shaders.d.ts.map +1 -1
  294. package/dist/maps/gl/shaders.js +34 -32
  295. package/dist/maps/gl/shaders.js.map +1 -1
  296. package/dist/maps/gl/store.d.ts +10 -0
  297. package/dist/maps/gl/store.d.ts.map +1 -1
  298. package/dist/maps/gl/store.js +47 -4
  299. package/dist/maps/gl/store.js.map +1 -1
  300. package/dist/maps/gl/text.d.ts +153 -24
  301. package/dist/maps/gl/text.d.ts.map +1 -1
  302. package/dist/maps/gl/text.js +379 -63
  303. package/dist/maps/gl/text.js.map +1 -1
  304. package/dist/maps/gl/view.d.ts +293 -2
  305. package/dist/maps/gl/view.d.ts.map +1 -1
  306. package/dist/maps/gl/view.js +317 -82
  307. package/dist/maps/gl/view.js.map +1 -1
  308. package/dist/maps/icons.d.ts +32 -0
  309. package/dist/maps/icons.d.ts.map +1 -0
  310. package/dist/maps/icons.js +151 -0
  311. package/dist/maps/icons.js.map +1 -0
  312. package/dist/maps/index.d.ts +2 -0
  313. package/dist/maps/index.d.ts.map +1 -1
  314. package/dist/maps/index.js +2 -0
  315. package/dist/maps/index.js.map +1 -1
  316. package/dist/maps/labels.d.ts +56 -4
  317. package/dist/maps/labels.d.ts.map +1 -1
  318. package/dist/maps/labels.js +213 -46
  319. package/dist/maps/labels.js.map +1 -1
  320. package/dist/maps/node.d.ts +17 -0
  321. package/dist/maps/node.d.ts.map +1 -1
  322. package/dist/maps/node.js +64 -30
  323. package/dist/maps/node.js.map +1 -1
  324. package/dist/maps/proj.d.ts +48 -0
  325. package/dist/maps/proj.d.ts.map +1 -1
  326. package/dist/maps/proj.js +73 -0
  327. package/dist/maps/proj.js.map +1 -1
  328. package/dist/maps/sources.d.ts +5 -3
  329. package/dist/maps/sources.d.ts.map +1 -1
  330. package/dist/maps/sources.js +5 -3
  331. package/dist/maps/sources.js.map +1 -1
  332. package/dist/maps/style.d.ts +35 -0
  333. package/dist/maps/style.d.ts.map +1 -1
  334. package/dist/maps/style.js.map +1 -1
  335. package/dist/maps/styles.d.ts +12 -0
  336. package/dist/maps/styles.d.ts.map +1 -1
  337. package/dist/maps/styles.js +120 -6
  338. package/dist/maps/styles.js.map +1 -1
  339. package/dist/maps/tiles.d.ts +31 -11
  340. package/dist/maps/tiles.d.ts.map +1 -1
  341. package/dist/maps/tiles.js +61 -27
  342. package/dist/maps/tiles.js.map +1 -1
  343. package/dist/maps/types.d.ts +28 -4
  344. package/dist/maps/types.d.ts.map +1 -1
  345. package/dist/markdown/index.d.ts.map +1 -1
  346. package/dist/markdown/index.js +112 -43
  347. package/dist/markdown/index.js.map +1 -1
  348. package/dist/markdown/spans.d.ts.map +1 -1
  349. package/dist/markdown/spans.js +6 -0
  350. package/dist/markdown/spans.js.map +1 -1
  351. package/dist/qml/containers.d.ts.map +1 -1
  352. package/dist/qml/containers.js +6 -1
  353. package/dist/qml/containers.js.map +1 -1
  354. package/dist/qml/interaction.d.ts.map +1 -1
  355. package/dist/qml/interaction.js +38 -5
  356. package/dist/qml/interaction.js.map +1 -1
  357. package/dist/qml/layouts.d.ts.map +1 -1
  358. package/dist/qml/layouts.js +21 -6
  359. package/dist/qml/layouts.js.map +1 -1
  360. package/dist/qml/qtquick.d.ts.map +1 -1
  361. package/dist/qml/qtquick.js +9 -2
  362. package/dist/qml/qtquick.js.map +1 -1
  363. package/dist/qml/react.d.ts.map +1 -1
  364. package/dist/qml/react.js +9 -7
  365. package/dist/qml/react.js.map +1 -1
  366. package/dist/reorder/clock.d.ts +7 -0
  367. package/dist/reorder/clock.d.ts.map +1 -0
  368. package/dist/reorder/clock.js +26 -0
  369. package/dist/reorder/clock.js.map +1 -0
  370. package/dist/reorder/index.d.ts +25 -3
  371. package/dist/reorder/index.d.ts.map +1 -1
  372. package/dist/reorder/index.js +64 -19
  373. package/dist/reorder/index.js.map +1 -1
  374. package/dist/rich-text-editor/index.d.ts +0 -11
  375. package/dist/rich-text-editor/index.d.ts.map +1 -1
  376. package/dist/rich-text-editor/index.js +35 -1
  377. package/dist/rich-text-editor/index.js.map +1 -1
  378. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  379. package/dist/rich-text-editor/keymap.js +2 -1
  380. package/dist/rich-text-editor/keymap.js.map +1 -1
  381. package/dist/rich-text-editor/keys.d.ts +17 -6
  382. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  383. package/dist/rich-text-editor/keys.js +135 -26
  384. package/dist/rich-text-editor/keys.js.map +1 -1
  385. package/dist/rich-text-editor/marks.d.ts +9 -0
  386. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  387. package/dist/rich-text-editor/marks.js +83 -0
  388. package/dist/rich-text-editor/marks.js.map +1 -0
  389. package/dist/rich-text-editor/render.d.ts.map +1 -1
  390. package/dist/rich-text-editor/render.js +28 -10
  391. package/dist/rich-text-editor/render.js.map +1 -1
  392. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  393. package/dist/rich-text-editor/toolbar.js +1 -1
  394. package/dist/rich-text-editor/toolbar.js.map +1 -1
  395. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  396. package/dist/rich-text-editor/virtual.js +17 -0
  397. package/dist/rich-text-editor/virtual.js.map +1 -1
  398. package/dist/richtext/node.d.ts +46 -2
  399. package/dist/richtext/node.d.ts.map +1 -1
  400. package/dist/richtext/node.js +187 -4
  401. package/dist/richtext/node.js.map +1 -1
  402. package/dist/richtext/runs.d.ts +13 -8
  403. package/dist/richtext/runs.d.ts.map +1 -1
  404. package/dist/richtext/runs.js +18 -8
  405. package/dist/richtext/runs.js.map +1 -1
  406. package/dist/table/index.d.ts.map +1 -1
  407. package/dist/table/index.js +23 -0
  408. package/dist/table/index.js.map +1 -1
  409. package/dist/table/rows.d.ts +3 -2
  410. package/dist/table/rows.d.ts.map +1 -1
  411. package/dist/table/rows.js +20 -6
  412. package/dist/table/rows.js.map +1 -1
  413. package/dist/terminal/index.d.ts.map +1 -1
  414. package/dist/terminal/index.js +4 -0
  415. package/dist/terminal/index.js.map +1 -1
  416. package/dist/terminal/vt/pty.d.ts +13 -2
  417. package/dist/terminal/vt/pty.d.ts.map +1 -1
  418. package/dist/terminal/vt/pty.js +18 -3
  419. package/dist/terminal/vt/pty.js.map +1 -1
  420. package/dist/terminal-output/index.d.ts.map +1 -1
  421. package/dist/terminal-output/index.js +6 -1
  422. package/dist/terminal-output/index.js.map +1 -1
  423. package/dist/three/canvas.d.ts.map +1 -1
  424. package/dist/three/canvas.js +85 -7
  425. package/dist/three/canvas.js.map +1 -1
  426. package/dist/three/events.d.ts +22 -4
  427. package/dist/three/events.d.ts.map +1 -1
  428. package/dist/three/events.js +34 -4
  429. package/dist/three/events.js.map +1 -1
  430. package/dist/tree/index.d.ts.map +1 -1
  431. package/dist/tree/index.js +17 -0
  432. package/dist/tree/index.js.map +1 -1
  433. package/package.json +42 -33
  434. package/src/charts/node.ts +62 -26
  435. package/src/charts/render.ts +120 -30
  436. package/src/code/index.ts +3 -1
  437. package/src/code-editor/completion.ts +3 -2
  438. package/src/code-editor/index.ts +19 -0
  439. package/src/code-editor/node.ts +1574 -184
  440. package/src/code-language/languages/glsl.ts +12 -2
  441. package/src/code-language/languages/javascript.ts +21 -4
  442. package/src/code-language/languages/json.ts +12 -2
  443. package/src/code-language/languages/shell.ts +12 -2
  444. package/src/code-language/languages/sql.ts +22 -2
  445. package/src/code-language/stream.ts +257 -17
  446. package/src/code-language/types.ts +5 -4
  447. package/src/codeblock/index.ts +20 -3
  448. package/src/flow/draw.ts +167 -41
  449. package/src/flow/gl/color.ts +85 -0
  450. package/src/flow/gl/index.ts +342 -0
  451. package/src/flow/gl/pack.ts +585 -0
  452. package/src/flow/gl/renderer.ts +679 -0
  453. package/src/flow/gl/shaders.ts +371 -0
  454. package/src/flow/gl/text.ts +1295 -0
  455. package/src/flow/index.ts +794 -67
  456. package/src/flow/node.ts +2496 -1256
  457. package/src/flow/paint.ts +511 -0
  458. package/src/flow/paths.ts +80 -15
  459. package/src/flow/scene.ts +2199 -0
  460. package/src/flow/types.ts +113 -1
  461. package/src/html/controls.ts +73 -2
  462. package/src/html/css/calc.ts +385 -0
  463. package/src/html/css/cascade.ts +1403 -62
  464. package/src/html/css/color.ts +755 -0
  465. package/src/html/css/content.ts +417 -0
  466. package/src/html/css/counter-styles.ts +973 -0
  467. package/src/html/css/decode.ts +130 -0
  468. package/src/html/css/parse.ts +1514 -160
  469. package/src/html/css/style.ts +4102 -222
  470. package/src/html/css/ua.ts +58 -12
  471. package/src/html/css/values.ts +150 -50
  472. package/src/html/css/vars.ts +348 -0
  473. package/src/html/dom.ts +284 -17
  474. package/src/html/fonts.ts +641 -0
  475. package/src/html/gif.ts +233 -0
  476. package/src/html/index.ts +180 -20
  477. package/src/html/layout/block.ts +3456 -230
  478. package/src/html/layout/boxes.ts +2100 -190
  479. package/src/html/layout/cache.ts +289 -0
  480. package/src/html/layout/collapse.ts +317 -0
  481. package/src/html/layout/css-grid.ts +1063 -0
  482. package/src/html/layout/flex.ts +1115 -106
  483. package/src/html/layout/floats.ts +128 -14
  484. package/src/html/layout/grid-lines.ts +141 -0
  485. package/src/html/layout/grid.ts +181 -0
  486. package/src/html/layout/inline.ts +3943 -192
  487. package/src/html/layout/shaping.ts +140 -0
  488. package/src/html/layout/table.ts +696 -186
  489. package/src/html/layout/tracks.ts +437 -0
  490. package/src/html/node.ts +1481 -118
  491. package/src/html/paint.ts +4293 -169
  492. package/src/html/resources.ts +161 -50
  493. package/src/html/surfaces.ts +81 -0
  494. package/src/html/svg.ts +493 -0
  495. package/src/html/url.ts +86 -0
  496. package/src/index.ts +2 -0
  497. package/src/internal/collate.ts +12 -0
  498. package/src/internal/markdown/ast.ts +11 -0
  499. package/src/internal/markdown/parse.ts +154 -11
  500. package/src/internal/prewarm.ts +45 -0
  501. package/src/internal/sdf.ts +227 -0
  502. package/src/internal/splice.ts +25 -0
  503. package/src/internal/window.ts +36 -5
  504. package/src/maps/anchors.ts +307 -1
  505. package/src/maps/controller.ts +116 -31
  506. package/src/maps/gl/buckets.ts +5 -1
  507. package/src/maps/gl/build-worker.ts +13 -2
  508. package/src/maps/gl/cover.ts +79 -44
  509. package/src/maps/gl/placement.ts +221 -69
  510. package/src/maps/gl/renderer.ts +104 -20
  511. package/src/maps/gl/shaders.ts +35 -32
  512. package/src/maps/gl/store.ts +66 -17
  513. package/src/maps/gl/text.ts +444 -71
  514. package/src/maps/gl/view.ts +361 -96
  515. package/src/maps/icons.ts +183 -0
  516. package/src/maps/index.ts +4 -0
  517. package/src/maps/labels.ts +269 -49
  518. package/src/maps/node.ts +82 -49
  519. package/src/maps/proj.ts +87 -0
  520. package/src/maps/sources.ts +5 -3
  521. package/src/maps/style.ts +32 -0
  522. package/src/maps/styles.ts +215 -4
  523. package/src/maps/tiles.ts +64 -31
  524. package/src/maps/types.ts +28 -4
  525. package/src/markdown/index.ts +149 -67
  526. package/src/markdown/spans.ts +5 -0
  527. package/src/qml/containers.tsx +6 -1
  528. package/src/qml/interaction.tsx +42 -5
  529. package/src/qml/layouts.tsx +21 -6
  530. package/src/qml/qtquick.tsx +9 -2
  531. package/src/qml/react.tsx +7 -5
  532. package/src/reorder/clock.ts +27 -0
  533. package/src/reorder/index.ts +100 -27
  534. package/src/rich-text-editor/index.ts +34 -1
  535. package/src/rich-text-editor/keymap.ts +1 -1
  536. package/src/rich-text-editor/keys.ts +135 -26
  537. package/src/rich-text-editor/marks.ts +101 -0
  538. package/src/rich-text-editor/render.ts +49 -12
  539. package/src/rich-text-editor/toolbar.ts +1 -1
  540. package/src/rich-text-editor/virtual.ts +25 -0
  541. package/src/richtext/node.ts +235 -14
  542. package/src/richtext/runs.ts +23 -12
  543. package/src/table/index.ts +29 -0
  544. package/src/table/rows.ts +18 -8
  545. package/src/terminal/index.ts +4 -0
  546. package/src/terminal/vt/pty.ts +16 -2
  547. package/src/terminal-output/index.ts +6 -1
  548. package/src/three/canvas.ts +102 -8
  549. package/src/three/events.ts +49 -9
  550. package/src/tree/index.ts +19 -0
@@ -82,6 +82,7 @@ import {
82
82
  SETTLE_BUDGET,
83
83
  useVirtualWindow,
84
84
  } from '../internal/window.js';
85
+ import type { VirtualViewport } from '../internal/window.js';
85
86
  import {
86
87
  MIN_COLUMN,
87
88
  columnValue,
@@ -887,6 +888,33 @@ export function Table<Row = any>(props: TableProps<Row>): ReactElement {
887
888
  virtual === true ||
888
889
  (virtual === 'auto' && ordered.length > VIRTUAL_THRESHOLD);
889
890
 
891
+ /**
892
+ * One drawn row into the height index, for the window's trim: it may drop
893
+ * a row only once the index knows the height the row is laid out at, and
894
+ * a flick reaches the trailing rows long before `measureRows` does (see
895
+ * `measure` on the window's inputs). The gates are `measureRows`'s, for
896
+ * its reasons — no viewport yet, a row drawn against a list that has
897
+ * moved, a row laid out against a grid the columns no longer resolve to.
898
+ */
899
+ const measureDrawn = useCallback(
900
+ (id: TableRowId, at: number, viewport: VirtualViewport): boolean => {
901
+ const drawn = rowNodes.current.get(id);
902
+ if (!drawn || drawn.at !== at || viewport.width <= 0) return false;
903
+ const expected = resolveWidths(
904
+ columnsRef.current,
905
+ userWidthsRef.current,
906
+ Math.max(0, viewport.width - rowInsetRef.current * 2),
907
+ ).total;
908
+ const s = scaleOf(drawn.node);
909
+ if (Math.abs(drawn.node.abs.width / s - expected) >= 1) return false;
910
+ heights.measure(id, at, drawn.node.abs.height / s);
911
+ return heights.isMeasured(at);
912
+ },
913
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- `heights` is a
914
+ // stable instance
915
+ [],
916
+ );
917
+
890
918
  /** The viewport, and the slice worth building from it — the machinery
891
919
  * shared with `<Tree>` (`../internal/window.ts`). */
892
920
  const win = useVirtualWindow({
@@ -902,6 +930,7 @@ export function Table<Row = any>(props: TableProps<Row>): ReactElement {
902
930
  threshold: catchup?.threshold ?? SKELETON_THRESHOLD,
903
931
  burstBudget: catchup?.burst ?? BURST_BUDGET,
904
932
  settleBudget: catchup?.settle ?? SETTLE_BUDGET,
933
+ measure: measureDrawn,
905
934
  });
906
935
  const { view, viewRef } = win;
907
936
  const { first, last, above, below } = win.slice;
package/src/table/rows.ts CHANGED
@@ -7,6 +7,7 @@
7
7
  // answer, and the tests assert on the answer directly.
8
8
 
9
9
  import type { ReactNode } from 'react';
10
+ import { compareText } from '../internal/collate.js';
10
11
 
11
12
  /** What a row is keyed by. Numbers are allowed because a row often comes
12
13
  * from a database, and stringifying an id is a chance to lose one. */
@@ -108,11 +109,12 @@ export function columnValue<Row>(row: Row, column: TableColumn<Row>): unknown {
108
109
  : (row as Record<string, unknown>)[column.id];
109
110
  }
110
111
 
111
- /** Core's comparator, verbatim: numbers numerically, everything else as
112
- * text, with `null`/`undefined` sorting as the empty string. */
112
+ /** Core's comparator: numbers numerically, everything else as text, with
113
+ * `null`/`undefined` sorting as the empty string. The text half is
114
+ * `localeCompare`'s, through one collator (`../internal/collate.ts`). */
113
115
  export function defaultCompare(a: unknown, b: unknown): number {
114
116
  if (typeof a === 'number' && typeof b === 'number') return a - b;
115
- return String(a ?? '').localeCompare(String(b ?? ''));
117
+ return compareText(String(a ?? ''), String(b ?? ''));
116
118
  }
117
119
 
118
120
  /**
@@ -165,11 +167,19 @@ export function orderRows<Row>(
165
167
  sort && !presorted ? columns.find((c) => c.id === sort.column) : undefined;
166
168
  if (sort && column) {
167
169
  const sign = sort.direction === 'desc' ? -1 : 1;
168
- const compare =
169
- column.compare ??
170
- ((a: Row, b: Row) =>
171
- defaultCompare(columnValue(a, column), columnValue(b, column)));
172
- entries.sort((a, b) => sign * compare(a.row, b.row));
170
+ const compare = column.compare;
171
+ if (compare) {
172
+ entries.sort((a, b) => sign * compare(a.row, b.row));
173
+ } else {
174
+ // each row's value read once rather than twice a comparison: a sort
175
+ // asks for about 17 of them a row at 100,000 rows
176
+ const keyed = entries.map((entry) => ({
177
+ entry,
178
+ key: columnValue(entry.row, column),
179
+ }));
180
+ keyed.sort((a, b) => sign * defaultCompare(a.key, b.key));
181
+ for (let i = 0; i < keyed.length; i++) entries[i] = keyed[i].entry;
182
+ }
173
183
  entries.forEach((entry, index) => {
174
184
  entry.index = index;
175
185
  });
@@ -69,6 +69,7 @@ import { useForeignTitle } from './title.js';
69
69
  import { hx } from './hx.js';
70
70
  import type { PtyHost } from './vt/pty.js';
71
71
  import type { VtHandle, VtTerminalProps } from './vt/index.js';
72
+ import { useFontPrewarm } from '../internal/prewarm.js';
72
73
 
73
74
  export {
74
75
  TERMINAL_BACKENDS,
@@ -412,6 +413,9 @@ export function Terminal(props: TerminalProps): ReactElement {
412
413
  const [vtFallback, setVtFallback] = useState(false);
413
414
  const vt =
414
415
  backend === 'vt' || (backend === 'auto' && (vtFallback || !embeddable));
416
+ // the grid is drawn in this family, and loading the emulator is the head
417
+ // start; an embedded emulator brings fonts of its own
418
+ useFontPrewarm(vt ? (props.fontFamily ?? 'monospace') : null);
415
419
  useEffect(() => {
416
420
  if (backend !== 'auto') setVtFallback(false);
417
421
  }, [backend]);
@@ -201,11 +201,25 @@ function nodeProcess(): {
201
201
  return g.process ?? null;
202
202
  }
203
203
 
204
- /** The user's login shell, or the last-resort `sh`. */
204
+ /**
205
+ * The user's login shell, or the platform's last resort.
206
+ *
207
+ * `$SHELL` first wherever it is set, because it is the user's own answer —
208
+ * and it is set under a POSIX shell on Windows too (git-bash, MSYS), where it
209
+ * is still the right one. Failing that the fallback has to be the platform's:
210
+ * `/bin/sh` is not a path on Windows, and a terminal that opens on "file not
211
+ * found" is indistinguishable from one whose pty could not start.
212
+ *
213
+ * `%COMSPEC%` rather than a spelled-out `cmd.exe`, since that is where Windows
214
+ * says which command processor this system has.
215
+ */
205
216
  export function defaultShell(
206
217
  env: Record<string, string | undefined> = nodeProcess()?.env ?? {},
218
+ platform: string = nodeProcess()?.platform ?? '',
207
219
  ): string {
208
- return env.SHELL || '/bin/sh';
220
+ if (env.SHELL) return env.SHELL;
221
+ if (platform === 'win32') return env.COMSPEC || 'cmd.exe';
222
+ return '/bin/sh';
209
223
  }
210
224
 
211
225
  class NodePtySession implements PtySession {
@@ -48,6 +48,7 @@ import {
48
48
  } from '../codeblock/index.js';
49
49
  import { documentRuns } from './runs.js';
50
50
  import { hx } from './hx.js';
51
+ import { useFontPrewarm } from '../internal/prewarm.js';
51
52
 
52
53
  const h = React.createElement;
53
54
 
@@ -257,6 +258,7 @@ export function TerminalOutput(props: TerminalOutputProps): ReactElement {
257
258
  }),
258
259
  [theme, props.fontSize, props.monoFamily],
259
260
  );
261
+ useFontPrewarm(look.family);
260
262
 
261
263
  // The colour maths (dim, inverse, conceal) resolves against the *page*
262
264
  // rather than against the block's tint: the tint is translucent, and an
@@ -277,7 +279,10 @@ export function TerminalOutput(props: TerminalOutputProps): ReactElement {
277
279
  [document, look.family, look.size, palette],
278
280
  );
279
281
 
280
- const outputProps: RichTextProps = { runs, style: codeTextStyle(look) };
282
+ const outputProps: RichTextProps = {
283
+ runs,
284
+ style: codeTextStyle(look, wrap),
285
+ };
281
286
  if (!wrap) outputProps.wrap = false;
282
287
 
283
288
  const lineCount = document.lines.length;
@@ -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