@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
@@ -82,6 +82,10 @@ export interface TextRun {
82
82
  weight?: number | 'normal' | 'bold';
83
83
  style?: 'normal' | 'italic';
84
84
  color?: string;
85
+ /** Pixels added after every glyph — CSS's `letter-spacing`. Both text
86
+ * engines take it on a span, and it passes through to them as the rest
87
+ * of the ntk vocabulary does. */
88
+ letterSpacing?: number;
85
89
  /** Fill painted behind the run — the inline-code chip. */
86
90
  bg?: string;
87
91
  /**
@@ -101,16 +105,37 @@ export interface TextRun {
101
105
  * sub-parameters, which a captured terminal session carries. Ignored
102
106
  * without `underline`, which is what says the rule exists at all. */
103
107
  underlineStyle?: 'single' | 'double' | 'curly' | 'dotted' | 'dashed';
108
+ /** How far below the baseline the underline's top is, and how thick it
109
+ * is, in the unit `size` is in — CSS's `text-underline-offset` and
110
+ * `text-decoration-thickness`. Unset, two pixels below and one thick. */
111
+ underlineOffset?: number;
112
+ underlineThickness?: number;
104
113
  /** 1px rule through the x-height, in this colour — `~~del~~`. */
105
114
  strike?: string;
106
115
  /** Link target. `null` is a link still streaming in (not clickable). */
107
116
  href?: string | null;
117
+ /** OpenType features the run is shaped with, by tag — `{ tnum: 1 }`,
118
+ * `{ liga: 0 }` — which both text engines take on a span. A run's fields
119
+ * are compared by identity (`sameRuns`), so the same features should be
120
+ * the same object. */
121
+ features?: Readonly<Record<string, number>>;
122
+ /** Runs that share a truthy `nowrap` have no break inside them or between
123
+ * them — the text of one element with `white-space: nowrap`, the element
124
+ * being the value. ntk's, from 8.13.0; CoreText breaks as it would. */
125
+ nowrap?: unknown;
126
+ /** Shaped on its own: ntk shapes a word that runs across spans shaped
127
+ * alike as one, kerned and joined across them, and a run marked so is
128
+ * kept apart from the ones either side of it — as CSS keeps the text
129
+ * either side of an inline box's margin, border or padding. ntk's, from
130
+ * 8.14.2. */
131
+ shapeApart?: boolean;
108
132
  }
109
133
 
110
134
  /** The props `<richtext>` takes. */
111
135
  export interface RichTextProps {
112
- /** The styled runs. Give a stable array identity — the layout cache and
113
- * the streaming path both key off it. */
136
+ /** The styled runs. Give a stable array identity where you can — the
137
+ * streaming path keys off it; an equal new array keeps its layout, for
138
+ * one pass over the runs (`sameRuns`). */
114
139
  runs: TextRun[];
115
140
  /** False lays the text out at its natural width, unwrapped — code. */
116
141
  wrap?: boolean;
@@ -178,6 +203,113 @@ interface FontsLike {
178
203
  ): TextLayoutLike;
179
204
  }
180
205
 
206
+ /** Spacing that tells runs apart and moves nothing: an engine that merges
207
+ * adjacent runs alike (CoreText) keeps a tab's space to itself. */
208
+ const HAIR = 1e-6;
209
+
210
+ /**
211
+ * The runs with each tab laid out as a space of its own, letter-spaced to
212
+ * the next stop: every eight spaces from its line's start, and past one
213
+ * less than half a "0" on (CSS Text 3, 4.2's `tab-size`). Neither engine
214
+ * sets a tab so — ntk has no glyph for one and draws a box, and CoreText
215
+ * stops every 28 points — so a tab-indented fence in `<Markdown>` or a
216
+ * `<Code>` block came out boxed or ragged. The space is the tab's length,
217
+ * so every offset holds, and the text a selection copies keeps its tabs.
218
+ * Placed from a first layout that has each tab as an unspaced space; a
219
+ * later tab on a line moves by what the ones before it added.
220
+ */
221
+ function tabbedRuns(
222
+ fonts: FontsLike,
223
+ runs: TextRun[],
224
+ base: Record<string, unknown>,
225
+ ): TextRun[] {
226
+ const out: TextRun[] = [];
227
+ const tabs: { at: number; index: number }[] = [];
228
+ let units = 0;
229
+ for (const run of runs) {
230
+ const text = run.text;
231
+ if (!text.includes('\t')) {
232
+ out.push(run);
233
+ units += text.length;
234
+ continue;
235
+ }
236
+ let done = 0;
237
+ for (let p = text.indexOf('\t'); p >= 0; p = text.indexOf('\t', p + 1)) {
238
+ if (p > done) out.push({ ...run, text: text.slice(done, p) });
239
+ tabs.push({ at: units + p, index: out.length });
240
+ out.push({
241
+ ...run,
242
+ text: ' ',
243
+ letterSpacing: (run.letterSpacing ?? 0) + tabs.length * HAIR,
244
+ });
245
+ done = p + 1;
246
+ }
247
+ if (done < text.length) out.push({ ...run, text: text.slice(done) });
248
+ units += text.length;
249
+ }
250
+ const natural = fonts.layout(out, base, {});
251
+ const found = new Map<number, { x: number; line: number }>();
252
+ natural.lines.forEach((line, i) => {
253
+ for (const run of line.runs ?? []) {
254
+ found.set(run.start, { x: line.x + run.x, line: i });
255
+ }
256
+ });
257
+ /** The room tabs have added to each line so far. */
258
+ const added = new Map<number, number>();
259
+ for (const tab of tabs) {
260
+ const run = out[tab.index];
261
+ const face = {
262
+ ...base,
263
+ ...(run.family !== undefined ? { family: run.family } : null),
264
+ ...(run.size !== undefined ? { size: run.size } : null),
265
+ ...(run.weight !== undefined ? { weight: run.weight } : null),
266
+ ...(run.style !== undefined ? { style: run.style } : null),
267
+ };
268
+ const space = advanceOf(fonts, face, ' ');
269
+ const every = 8 * space;
270
+ const own = space + (run.letterSpacing ?? 0);
271
+ const at = found.get(tab.at) ?? natural.caretPosition(tab.at);
272
+ const before = added.get(at.line) ?? 0;
273
+ const x = at.x + before;
274
+ let advance = own;
275
+ if (every > 0) {
276
+ let stop = (Math.floor(x / every) + 1) * every;
277
+ if (stop - x < advanceOf(fonts, face, '0') / 2) stop += every;
278
+ advance = stop - x;
279
+ }
280
+ out[tab.index] = {
281
+ ...run,
282
+ letterSpacing: (run.letterSpacing ?? 0) + advance - own,
283
+ };
284
+ added.set(at.line, before + advance - own);
285
+ }
286
+ return out;
287
+ }
288
+
289
+ /** A character's advance in a face: between two letters, so that no engine
290
+ * drops it as a line's end. Kept per engine and face: a file indented with
291
+ * tabs asks for it thousands of times. */
292
+ function advanceOf(
293
+ fonts: FontsLike,
294
+ face: Record<string, unknown>,
295
+ char: string,
296
+ ): number {
297
+ let kept = ADVANCES.get(fonts);
298
+ if (!kept) ADVANCES.set(fonts, (kept = new Map()));
299
+ const key = `${face.family}|${face.size}|${face.weight}|${face.style}|${char}`;
300
+ let advance = kept.get(key);
301
+ if (advance === undefined) {
302
+ advance =
303
+ fonts.layout([{ ...face, text: `x${char}x` } as TextRun], face, {})
304
+ .width -
305
+ fonts.layout([{ ...face, text: 'xx' } as TextRun], face, {}).width;
306
+ kept.set(key, advance);
307
+ }
308
+ return advance;
309
+ }
310
+
311
+ const ADVANCES = new WeakMap<FontsLike, Map<string, number>>();
312
+
181
313
  /**
182
314
  * The bands a highlight over `[start, end)` fills, in layout coordinates —
183
315
  * one per line, and more than one on a line that changes direction. The
@@ -212,9 +344,38 @@ function rangeBands(
212
344
  return bands;
213
345
  }
214
346
 
347
+ /**
348
+ * Whether two `runs` props say the same thing. A component that builds its
349
+ * runs in render hands over a new array whenever it renders, whether or not
350
+ * the text changed — the rich text editor does on every keystroke, for
351
+ * paragraphs the keystroke never reached — and the array's identity was
352
+ * all a layout cache cleared on. A run's fields are all primitives, so one
353
+ * shallow pass decides it, where the layout it spares is a paragraph shaped
354
+ * and broken again.
355
+ */
356
+ function sameRuns(a: unknown, b: unknown): boolean {
357
+ if (a === b) return true;
358
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
359
+ return false;
360
+ }
361
+ for (let i = 0; i < a.length; i++) {
362
+ const x = a[i] as Record<string, unknown>;
363
+ const y = b[i] as Record<string, unknown>;
364
+ if (x === y) continue;
365
+ if (!x || !y) return false;
366
+ const keys = Object.keys(x);
367
+ if (keys.length !== Object.keys(y).length) return false;
368
+ for (const key of keys) if (x[key] !== y[key]) return false;
369
+ }
370
+ return true;
371
+ }
372
+
215
373
  export class RichTextNode extends Node {
216
374
  private _layouts = new Map<string, TextLayoutLike | null>();
217
375
  private _text: string | null = null;
376
+ /** The runs as laid out where a tab is among them, and what from. */
377
+ private _tabbed: { from: TextRun[]; scale: number; to: TextRun[] } | null =
378
+ null;
218
379
 
219
380
  /**
220
381
  * `kind` is for a subclass registered under a name of its own — the rich
@@ -266,21 +427,36 @@ export class RichTextNode extends Node {
266
427
  let layout: TextLayoutLike | null = null;
267
428
  if (fonts) {
268
429
  const s = this._scale;
269
- layout = fonts.layout(
270
- this._deviceRuns(s),
271
- { family: 'sans-serif', size: 14 * s },
272
- {
273
- maxWidth: Number.isFinite(maxWidth) ? maxWidth : undefined,
274
- lineHeight: this.style.lineHeight,
275
- align: this.style.textAlign,
276
- },
277
- );
430
+ const base = { family: 'sans-serif', size: 14 * s };
431
+ layout = fonts.layout(this._tabRuns(fonts, base, s), base, {
432
+ maxWidth: Number.isFinite(maxWidth) ? maxWidth : undefined,
433
+ lineHeight: this.style.lineHeight,
434
+ align: this.style.textAlign,
435
+ });
278
436
  }
279
437
  if (this._layouts.size > 32) this._layouts.clear();
280
438
  this._layouts.set(key, layout);
281
439
  return layout;
282
440
  }
283
441
 
442
+ /** The runs with their tabs set to their stops (`tabbedRuns`), found
443
+ * once for a list of runs: most have none, and are handed on as they
444
+ * are. */
445
+ private _tabRuns(
446
+ fonts: FontsLike,
447
+ base: Record<string, unknown>,
448
+ scale: number,
449
+ ): TextRun[] {
450
+ const from = this._runs();
451
+ const runs = this._deviceRuns(scale);
452
+ if (!runs.some((run) => run.text.includes('\t'))) return runs;
453
+ const kept = this._tabbed;
454
+ if (kept && kept.from === from && kept.scale === scale) return kept.to;
455
+ const to = tabbedRuns(fonts, runs, base);
456
+ this._tabbed = { from, scale, to };
457
+ return to;
458
+ }
459
+
284
460
  // --- units ---------------------------------------------------------------
285
461
  //
286
462
  // The layout, `abs` and the paint are device pixels (react-x11's
@@ -305,7 +481,20 @@ export class RichTextNode extends Node {
305
481
  const runs = this._runs();
306
482
  if (scale === 1) return runs;
307
483
  return runs.map((r) =>
308
- typeof r.size === 'number' ? { ...r, size: r.size * scale } : r,
484
+ typeof r.size === 'number' ||
485
+ r.underlineOffset !== undefined ||
486
+ r.underlineThickness !== undefined
487
+ ? {
488
+ ...r,
489
+ ...(typeof r.size === 'number' ? { size: r.size * scale } : null),
490
+ ...(r.underlineOffset !== undefined
491
+ ? { underlineOffset: r.underlineOffset * scale }
492
+ : null),
493
+ ...(r.underlineThickness !== undefined
494
+ ? { underlineThickness: r.underlineThickness * scale }
495
+ : null),
496
+ }
497
+ : r,
309
498
  );
310
499
  }
311
500
 
@@ -327,15 +516,34 @@ export class RichTextNode extends Node {
327
516
  ): void {
328
517
  super.applyProps(nextProps, prevProps);
329
518
  if (
330
- nextProps.runs !== prevProps.runs ||
331
- nextProps.wrap !== prevProps.wrap
519
+ nextProps.wrap !== prevProps.wrap ||
520
+ !sameRuns(nextProps.runs, prevProps.runs)
332
521
  ) {
333
522
  this._layouts.clear();
334
523
  this._text = null;
524
+ this._tabbed = null;
335
525
  this.invalidateMeasure('content');
336
526
  }
337
527
  }
338
528
 
529
+ /** A new `runs` array that says what the last one said changes nothing
530
+ * drawn — see `sameRuns`. */
531
+ override paintChanged(
532
+ nextProps: Record<string, unknown>,
533
+ prevProps: Record<string, unknown>,
534
+ ): boolean {
535
+ if (
536
+ nextProps.runs !== prevProps.runs &&
537
+ sameRuns(nextProps.runs, prevProps.runs)
538
+ ) {
539
+ return super.paintChanged(
540
+ { ...nextProps, runs: prevProps.runs },
541
+ prevProps,
542
+ );
543
+ }
544
+ return super.paintChanged(nextProps, prevProps);
545
+ }
546
+
339
547
  override destroySubtree(): void {
340
548
  this._layouts.clear();
341
549
  super.destroySubtree();
@@ -440,6 +648,19 @@ export class RichTextNode extends Node {
440
648
  ctx.restore();
441
649
  }
442
650
 
651
+ /**
652
+ * How far this element draws past its box: a code chip is padded two
653
+ * pixels past the run behind it (`paintRunBackgrounds`), and at the start
654
+ * or the end of a line the pad is outside the box. Said for every
655
+ * paragraph, chips or not — core reads it when it rebuilds the paint
656
+ * bounds a claim covers, and the claim after an edit that took the last
657
+ * chip away still has to cover the chip the frame before drew. An older
658
+ * core never asks.
659
+ */
660
+ override paintOverhang(): number {
661
+ return Math.round(2 * this.scale);
662
+ }
663
+
443
664
  /**
444
665
  * The selection band, between the run backgrounds and the ink. The default
445
666
  * is core's document selection: the band the `selectable` surface above
@@ -34,10 +34,10 @@ export function canFill(ctx: unknown): ctx is FillContext {
34
34
  *
35
35
  * `span` and `run` are what ntk's layout hands back and what every
36
36
  * decoration is read from: the span the run came from, markers and all, and
37
- * the face it was shaped with. Both are optional because react-x11's Cocoa
38
- * engine (2.3.x) reports only a run's geometry — `{ x, width, start, end }`
39
- * — and a paint that assumed the rest threw on the first paragraph on
40
- * macOS. A run without its span has no decoration to draw; a run without
37
+ * the face it was shaped with. Both are optional because an engine may
38
+ * report only a run's geometry — `{ x, width, start, end }` — as react-x11's
39
+ * Windows engine does and its Cocoa engine did before 2.22.8, and a paint
40
+ * that assumed the rest threw on the first paragraph on macOS. A run without its span has no decoration to draw; a run without
41
41
  * its face takes its vertical extent from the line, which both engines
42
42
  * report.
43
43
  */
@@ -102,7 +102,8 @@ let warnedSpanless = false;
102
102
  * Say so, once, when a laid-out run arrives without the span it came from:
103
103
  * every decoration is read off that span, so none will be drawn, and a
104
104
  * document that suddenly has no code chips or link underlines should not be
105
- * a mystery. react-x11's Cocoa engine (2.3.x) is the one that does this.
105
+ * a mystery. react-x11's Windows engine does this, and its Cocoa engine did
106
+ * before 2.22.8.
106
107
  *
107
108
  * `process` and `console` come off `globalThis` because `src/` compiles
108
109
  * with `types: []` — a Node global that wandered in would fail the build
@@ -120,7 +121,8 @@ function warnSpanless(): void {
120
121
  '@react-x11/components: the text engine handed back laid-out runs ' +
121
122
  'without their spans, so run decorations (backgrounds, underlines, ' +
122
123
  "strikethrough) and inline link hit-testing are off. react-x11's " +
123
- "Cocoa text engine (2.3.x) does this; ntk's does not.",
124
+ 'Windows text engine does this, as its Cocoa engine did before ' +
125
+ "2.22.8; ntk's does not.",
124
126
  );
125
127
  }
126
128
 
@@ -174,30 +176,39 @@ export function paintRunBackgrounds(
174
176
  }
175
177
  }
176
178
 
177
- /** The rules that sit **over** the glyphs: link underlines, strikethrough.
178
- * A rule is one logical pixel thick — `scale` device pixels, so a link on a
179
- * 2x panel is underlined as heavily as on a 1x one, not with a hairline. */
179
+ /** The rules drawn with a run: its underline and its strikethrough. A rule
180
+ * is one logical pixel thick — `scale` device pixels, so a link on a 2x
181
+ * panel is underlined as heavily as on a 1x one, not with a hairline —
182
+ * and an underline two below the baseline, where the run sets neither
183
+ * (`underlineThickness`, `underlineOffset`, in device pixels by now).
184
+ * `rules` picks a pass: CSS draws an underline under the glyphs and a
185
+ * line through over them (CSS 2.1 Appendix E), which is two passes around
186
+ * the glyphs'; drawn in one, both go over. */
180
187
  export function paintRunRules(
181
188
  ctx: FillContext,
182
189
  line: LaidLine,
183
190
  dx: number,
184
191
  dy: number,
185
192
  scale = 1,
193
+ rules: 'under' | 'over' | 'all' = 'all',
186
194
  ): void {
187
195
  const t = ruleThickness(scale);
188
196
  for (const r of line.runs) {
189
197
  const span = r.span;
190
198
  if (!span) continue;
191
- const { underline, strike } = span;
199
+ const underline = rules !== 'over' ? span.underline : undefined;
200
+ const strike = rules !== 'under' ? span.strike : undefined;
192
201
  if (underline) {
193
202
  ctx.fillStyle = underline;
194
203
  underlineRule(
195
204
  ctx,
196
205
  Math.round(dx + line.x + r.x),
197
- Math.round(dy + line.baseline + 2 * t),
206
+ Math.round(dy + line.baseline + (span.underlineOffset ?? 2 * t)),
198
207
  Math.ceil(r.width),
199
208
  span.underlineStyle ?? 'single',
200
- t,
209
+ span.underlineThickness === undefined
210
+ ? t
211
+ : Math.max(1, Math.round(span.underlineThickness)),
201
212
  );
202
213
  }
203
214
  if (strike) {
@@ -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 {