@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
@@ -35,23 +35,38 @@ import {
35
35
  cancelAfterLayout,
36
36
  type LayoutTick,
37
37
  } from '../internal/timers.js';
38
+ import { scaleOf } from '../internal/units.js';
38
39
 
39
40
  function isRow(inst: QmlInstance): boolean {
40
41
  return inst.typeInfo.name === 'RowLayout';
41
42
  }
42
43
 
43
- /** Reflect yoga's answers into the managed children's geometry slots. */
44
+ /**
45
+ * Reflect yoga's answers into the managed children's geometry slots.
46
+ *
47
+ * `abs` is device pixels and the slots are the logical ones the document is
48
+ * written in (react-x11's docs/scale.md), and this is not only read-back:
49
+ * an author `width:` is the item's size hint and the slot this writes, so a
50
+ * device number here came back as a hint twice the size and the row drew
51
+ * it that way. Divided once, after the subtraction: `(a - b) / s` rounds
52
+ * once where `a / s - b / s` rounds three times, and at a scale of 1.25
53
+ * half the positions would read like 78.39999999999999 rather than 78.4.
54
+ * And from `abs` rather than `getClientRects()`, which answers nothing for
55
+ * a box with no area: a 0×0 item in a row still has an `x`.
56
+ */
44
57
  function feedbackLayout(inst: QmlInstance): void {
45
58
  if (inst.destroyed) return;
46
- const containerAbs = hostNode(inst)?.abs;
59
+ const container = hostNode(inst);
60
+ const containerAbs = container?.abs;
47
61
  if (!containerAbs) return;
62
+ const s = scaleOf(container);
48
63
  for (const child of inst.visualChildren()) {
49
64
  const abs = hostNode(child)?.abs;
50
65
  if (!abs) continue; // a custom view without captureNode: skip quietly
51
- child.slots.get('x')?.reflect(abs.x - containerAbs.x);
52
- child.slots.get('y')?.reflect(abs.y - containerAbs.y);
53
- child.slots.get('width')?.reflect(abs.width);
54
- child.slots.get('height')?.reflect(abs.height);
66
+ child.slots.get('x')?.reflect((abs.x - containerAbs.x) / s);
67
+ child.slots.get('y')?.reflect((abs.y - containerAbs.y) / s);
68
+ child.slots.get('width')?.reflect(abs.width / s);
69
+ child.slots.get('height')?.reflect(abs.height / s);
55
70
  }
56
71
  }
57
72
 
@@ -40,6 +40,7 @@ import { layoutTypes } from './layouts.js';
40
40
  import { modelTypes } from './models.js';
41
41
  import { stateTypes } from './states.js';
42
42
  import { cancel, schedule, warn } from './globals.js';
43
+ import { scaleOf } from '../internal/units.js';
43
44
 
44
45
  // Qt namespace constants used from expressions (`Qt.LeftButton`,
45
46
  // `mouse.modifiers & Qt.ShiftModifier`, `Qt.AlignHCenter`).
@@ -120,8 +121,14 @@ function TextView({ inst }: { inst: QmlInstance }): ReactElement {
120
121
  if (!node?.app?.fonts || !node.resolvedTextStyle) return;
121
122
  try {
122
123
  const layout = node.app.fonts.layout(text, node.resolvedTextStyle());
123
- inst.slots.get('implicitWidth')?.assign(Math.ceil(layout.width));
124
- inst.slots.get('implicitHeight')?.assign(Math.ceil(layout.height));
124
+ // The resolved size is the device one — the cascade resolves a
125
+ // theme's size once, at the root, in device pixels — so at scale 2 a
126
+ // `font.pixelSize: 20` is laid out at 40 and measured in device
127
+ // pixels. Divided back into the logical ones an implicit size is read
128
+ // in, or every binding on it reads double.
129
+ const s = scaleOf(node);
130
+ inst.slots.get('implicitWidth')?.assign(Math.ceil(layout.width / s));
131
+ inst.slots.get('implicitHeight')?.assign(Math.ceil(layout.height / s));
125
132
  } catch {
126
133
  // No fonts loaded (headless without the fonts option): leave 0.
127
134
  }
package/src/qml/react.tsx CHANGED
@@ -175,7 +175,9 @@ export const QmlView = forwardRef(function QmlView(
175
175
 
176
176
  // Root-size feedback. `afterLayout` (not a bare effect): react-x11 lays
177
177
  // out on the frame flush, so an effect body reads the geometry of the
178
- // previous pass — src/internal/timers.ts documents the shape.
178
+ // previous pass — src/internal/timers.ts documents the shape. The client
179
+ // rect, not `abs`: `abs` is device pixels, and the root's size is read in
180
+ // the logical ones the document and the wrapper's `style` are written in.
179
181
  const wrapRef = useRef<DrawnNode>(null);
180
182
  const rootW = root.slots.get('width');
181
183
  const rootH = root.slots.get('height');
@@ -183,10 +185,10 @@ export const QmlView = forwardRef(function QmlView(
183
185
  useEffect(() => {
184
186
  if (sized) return;
185
187
  const tick = afterLayout(() => {
186
- const abs = wrapRef.current?.abs;
187
- if (!abs || root.destroyed) return;
188
- if (abs.width) root.slots.get('implicitWidth')?.assign(abs.width);
189
- if (abs.height) root.slots.get('implicitHeight')?.assign(abs.height);
188
+ const box = wrapRef.current?.getClientRects()[0];
189
+ if (!box || root.destroyed) return;
190
+ if (box.width) root.slots.get('implicitWidth')?.assign(box.width);
191
+ if (box.height) root.slots.get('implicitHeight')?.assign(box.height);
190
192
  flushBindings();
191
193
  });
192
194
  return () => cancelAfterLayout(tick);
@@ -0,0 +1,27 @@
1
+ // The drop flight's clock — the time it reads and the timer that steps it —
2
+ // in a module of its own, so that a test can hold it.
3
+ //
4
+ // The flight home is wall-clock time on purpose: `dropAnimation={180}` is a
5
+ // hundred and eighty milliseconds however many frames the machine manages.
6
+ // That is also what makes it hard to look at. A runner slow enough to spend
7
+ // the whole flight inside the `await` that released the item finds it
8
+ // already landed, which is how "a drag that landed nowhere flies back"
9
+ // failed on CI. `test/held-clock.ts` stands in for this object and nothing
10
+ // else, so the drag, and the layout tick the flight starts from, stay real.
11
+ //
12
+ // Exported from this module and not from `./index.ts`: everything there is
13
+ // the package's `./reorder` subpath, and this is for the tests.
14
+ import { cancelLater, later } from '../internal/timers.js';
15
+ import type { DelayTick } from '../internal/timers.js';
16
+
17
+ export const flightClock = {
18
+ now(): number {
19
+ return Date.now();
20
+ },
21
+ arm(step: () => void, ms: number): DelayTick {
22
+ return later(step, ms);
23
+ },
24
+ disarm(handle: DelayTick): void {
25
+ cancelLater(handle);
26
+ },
27
+ };
@@ -47,7 +47,12 @@
47
47
  // is over. It is one object for one gesture, never read at import time.
48
48
  // - **The indicator, not the slide.** Neighbours do not glide out of the
49
49
  // way: this renderer has no transform, and a line at the closest edge
50
- // answers the same question for a rectangle per item. The one thing that
50
+ // answers the same question for a rectangle per item. That is the
51
+ // *default*, not a limit — an app that wants the gap instead can open one
52
+ // from `onDragUpdate` and let flex layout move the rows, which is what
53
+ // `examples/reorder.tsx`'s first list does in about twenty lines. What
54
+ // this component will not do is pick that for everyone: a gap costs a
55
+ // reflow per pointer move, and a line costs none. The one thing that
51
56
  // does move is the drop: `dropAnimation` flies a copy of the item from
52
57
  // where the pointer let go to where the item landed. That copy is a box
53
58
  // **inside the item**, not the ghost popup carried on — a popup outlives
@@ -147,14 +152,11 @@ import {
147
152
  import { hx } from './hx.js';
148
153
  // Shared with <Tree> and <Table> — internal, deliberately not a shared
149
154
  // *module*; the header of src/internal/timers.ts says why. The drop flight
150
- // needs both: a tick after the layout that placed the item, and a clock.
151
- import {
152
- afterLayout,
153
- cancelAfterLayout,
154
- cancelLater,
155
- later,
156
- } from '../internal/timers.js';
155
+ // needs both: a tick after the layout that placed the item, and a clock —
156
+ // which is `./clock.ts`'s, where a test can hold it.
157
+ import { afterLayout, cancelAfterLayout } from '../internal/timers.js';
157
158
  import type { DelayTick, LayoutTick } from '../internal/timers.js';
159
+ import { flightClock } from './clock.js';
158
160
  import {
159
161
  closestSlot,
160
162
  insertManyAtSlot,
@@ -338,14 +340,39 @@ export interface ReorderDragStart {
338
340
 
339
341
  /** Where the drag is now. Fires on the list the item belongs to, whichever
340
342
  * list the pointer is over — `over` is null over anything that is not a
341
- * list in the group. `over.index` is the index the item would **land at**,
342
- * which is what `onReorder`'s `to` and `onInsert`'s `index` will say, not
343
- * the raw gap it is hovering. */
343
+ * list in the group, and **only** then. `over.index` is the index the item
344
+ * would **land at**, which is what `onReorder`'s `to` and `onInsert`'s
345
+ * `index` will say, not the raw gap it is hovering; `over.settled` says the
346
+ * drop would land there and change nothing. */
344
347
  export interface ReorderDragUpdate {
345
348
  id: ReorderId;
346
349
  ids: ReorderId[];
347
350
  from: number;
348
- over: { list: string | undefined; index: number } | null;
351
+ over: {
352
+ list: string | undefined;
353
+ /** Where the row would **end up** — what `onReorder`'s `to` will say. */
354
+ index: number;
355
+ /**
356
+ * Which gap the pointer is over, counting the one before the first row
357
+ * as 0 and the one past the last as `length`.
358
+ *
359
+ * Not the same number as `index`, and the difference is not a detail: a
360
+ * row moving within its own list closes the hole it leaves behind, so
361
+ * dragging row 0 down onto the gap after row 1 is **slot 2** and lands
362
+ * at **index 1**. Draw a drop position from `index` and it sits one
363
+ * place too high for every downward drag and exactly right for every
364
+ * upward one, which is what an off-by-one that only happens half the
365
+ * time looks like.
366
+ *
367
+ * So: `slot` to draw *where the drop would go*, `index` to say *what
368
+ * the list will become*.
369
+ */
370
+ slot: number;
371
+ /** The drop would land here and change nothing. A position, not an
372
+ * absence: the pointer is over the list, at an index it can name, and
373
+ * the rows are simply already in that order. */
374
+ settled: boolean;
375
+ } | null;
349
376
  combine: ReorderId | null;
350
377
  input: ReorderInput;
351
378
  }
@@ -539,7 +566,14 @@ interface DragOver {
539
566
  listUid: string;
540
567
  list: string | undefined;
541
568
  index: number;
569
+ /** The gap the pointer is over. **Not** `index`: for a move within one
570
+ * list the row leaves a hole behind it, so dragging row 0 down to the
571
+ * gap after row 1 is slot 2 and lands at index 1. */
572
+ slot: number;
542
573
  combine: ReorderId | null;
574
+ /** The drop would land here and change nothing — the rows are already in
575
+ * this order. Still a position, and still over the list. */
576
+ settled: boolean;
543
577
  }
544
578
 
545
579
  /**
@@ -843,11 +877,30 @@ function refuse(): boolean {
843
877
  return false;
844
878
  }
845
879
 
880
+ /**
881
+ * Whether two answers say the same thing — the gate that keeps one
882
+ * `onDragUpdate` per *change* rather than one per pointer motion.
883
+ *
884
+ * `slot` is part of the comparison and not an afterthought: it and `index`
885
+ * move independently. Dragging a row down its own list, the gap after the
886
+ * next row and the gap after the one beyond it are slots 2 and 3, and both
887
+ * land the row at index 1 and 2 — but the pair (1,2) and (2,3) differ in
888
+ * both. Where they *don't* is at the top of a downward drag: slots 1 and 2
889
+ * both land at index 1, because the row closes the hole it left. Comparing
890
+ * on `index` alone therefore swallowed the move from slot 1 to slot 2, and a
891
+ * list drawing the drop as a space kept it a row too high for as long as the
892
+ * pointer stayed in that band — an off-by-one that looked like a rule
893
+ * problem and was a dropped notification.
894
+ */
846
895
  function sameOver(a: DragOver | null, b: DragOver | null): boolean {
847
896
  if (a === b) return true;
848
897
  if (!a || !b) return false;
849
898
  return (
850
- a.listUid === b.listUid && a.index === b.index && a.combine === b.combine
899
+ a.listUid === b.listUid &&
900
+ a.index === b.index &&
901
+ a.slot === b.slot &&
902
+ a.settled === b.settled &&
903
+ a.combine === b.combine
851
904
  );
852
905
  }
853
906
 
@@ -1144,18 +1197,26 @@ export function ReorderList(props: ReorderListProps): ReactElement {
1144
1197
  ev.reject();
1145
1198
  return;
1146
1199
  }
1147
- // one of this list's own items, over a gap that is already its own:
1148
- // nothing would move, so nothing is promised
1200
+ // One of this list's own items, over a slot it already occupies: the
1201
+ // drop would change nothing.
1149
1202
  const move =
1150
1203
  !combining && moving.length > 0
1151
1204
  ? moveManyToSlot(ids, moving, slot, payload!.id)
1152
1205
  : null;
1153
- if (!combining && moving.length > 0 && move === null) {
1154
- mark(null);
1155
- if (activeDrag?.over?.listUid === uid) activeDrag.over = null;
1156
- return;
1157
- }
1158
- mark(at);
1206
+ const settled = !combining && moving.length > 0 && move === null;
1207
+ // No line: there is no insertion to point at. But the drag **is** over
1208
+ // this list, at a position this list can name, and saying `over: null`
1209
+ // for it conflated two different facts — "nowhere" and "here, and
1210
+ // already in order".
1211
+ //
1212
+ // That conflation is visible, not theoretical. A list that draws the
1213
+ // drop as a gap closes the gap when told `over` is null; closing it
1214
+ // moves the rows back up; the pointer is then over a different row, so
1215
+ // a gap opens again, which moves the rows down, which puts the pointer
1216
+ // back over the gap. Walking a pointer down the list a step at a time,
1217
+ // that alternates every other sample — and what it looks like is a drop
1218
+ // target one slot away from the pointer.
1219
+ mark(settled ? null : at);
1159
1220
  if (activeDrag) {
1160
1221
  activeDrag.over = {
1161
1222
  listUid: uid,
@@ -1163,7 +1224,9 @@ export function ReorderList(props: ReorderListProps): ReactElement {
1163
1224
  // where it would land, not the gap it is over — a same-list move
1164
1225
  // closes the hole it left behind, and a newcomer lands at the gap
1165
1226
  index: move ? move.to : slot,
1227
+ slot,
1166
1228
  combine: combining,
1229
+ settled,
1167
1230
  };
1168
1231
  }
1169
1232
  };
@@ -1361,7 +1424,10 @@ export function ReorderList(props: ReorderListProps): ReactElement {
1361
1424
  id: itemId,
1362
1425
  ids: move.ids,
1363
1426
  from,
1364
- over: { list: id, index: move.to },
1427
+ // The keyboard path is not a preview: the row has already *moved*,
1428
+ // so where it is and where it would land are the same place and
1429
+ // there is no hole still open behind it.
1430
+ over: { list: id, index: move.to, slot: move.to, settled: false },
1365
1431
  combine: null,
1366
1432
  input: 'keyboard',
1367
1433
  });
@@ -1423,7 +1489,14 @@ export function ReorderList(props: ReorderListProps): ReactElement {
1423
1489
  id: itemId,
1424
1490
  ids: payload?.ids ?? [itemId],
1425
1491
  from: payload?.index ?? -1,
1426
- over: over ? { list: over.list, index: over.index } : null,
1492
+ over: over
1493
+ ? {
1494
+ list: over.list,
1495
+ index: over.index,
1496
+ slot: over.slot,
1497
+ settled: over.settled,
1498
+ }
1499
+ : null,
1427
1500
  combine: over?.combine ?? null,
1428
1501
  input: 'pointer',
1429
1502
  });
@@ -1746,7 +1819,7 @@ export function ReorderItem(props: ReorderItemProps): ReactElement {
1746
1819
  useEffect(
1747
1820
  () => () => {
1748
1821
  cancelAfterLayout(ticks.current.layout);
1749
- cancelLater(ticks.current.timer);
1822
+ flightClock.disarm(ticks.current.timer);
1750
1823
  },
1751
1824
  [],
1752
1825
  );
@@ -1796,9 +1869,9 @@ export function ReorderItem(props: ReorderItemProps): ReactElement {
1796
1869
  setFlight(null);
1797
1870
  return;
1798
1871
  }
1799
- const started = Date.now();
1872
+ const started = flightClock.now();
1800
1873
  const stepOn = (): void => {
1801
- const t = Math.min((Date.now() - started) / ms, 1);
1874
+ const t = Math.min((flightClock.now() - started) / ms, 1);
1802
1875
  if (t >= 1) {
1803
1876
  ticks.current.timer = null;
1804
1877
  setFlight(null);
@@ -1806,7 +1879,7 @@ export function ReorderItem(props: ReorderItemProps): ReactElement {
1806
1879
  }
1807
1880
  const left = 1 - ease(t);
1808
1881
  setFlight({ x: dx * left, y: dy * left });
1809
- ticks.current.timer = later(stepOn, FLIGHT_STEP_MS);
1882
+ ticks.current.timer = flightClock.arm(stepOn, FLIGHT_STEP_MS);
1810
1883
  };
1811
1884
  stepOn();
1812
1885
  });
@@ -50,7 +50,6 @@ import type {
50
50
  import { XK_ESCAPE, XK_KP_ENTER, XK_RETURN } from 'react-x11/keysyms';
51
51
  import { tint } from 'react-x11/style';
52
52
  import type { Style } from 'react-x11/style';
53
- import { toggleMark } from 'prosemirror-commands';
54
53
  import { redo, undo } from 'prosemirror-history';
55
54
  import { Fragment, Slice } from 'prosemirror-model';
56
55
  import type { Node as PMNode, Schema } from 'prosemirror-model';
@@ -80,6 +79,7 @@ import type { DropAnswer } from './drag.js';
80
79
  import { docFromHTML, htmlFromContent } from './html.js';
81
80
  import { defaultPlugins } from './keymap.js';
82
81
  import { deriveLook } from './look.js';
82
+ import { toggleMark } from './marks.js';
83
83
  import type { MarkStyle } from './look.js';
84
84
  import { docFromText, markdownCodec, textFromDoc } from './markdown.js';
85
85
  import type { MarkdownCodec } from './markdown.js';
@@ -106,6 +106,7 @@ import type { ToolbarEntry } from './toolbar.js';
106
106
  import { RichEditorView } from './view.js';
107
107
  import type { ViewConfig, ViewProps } from './view.js';
108
108
  import { useBlockWindow } from './virtual.js';
109
+ import { useFontPrewarm } from '../internal/prewarm.js';
109
110
 
110
111
  registerRichText();
111
112
  registerEditorElements();
@@ -384,6 +385,33 @@ interface LinkEdit {
384
385
  * />
385
386
  * ```
386
387
  */
388
+ /**
389
+ * Whether the document an editor mounts with has code in it: a code span or
390
+ * block as markdown spells one, as HTML does, or as a node's schema says.
391
+ */
392
+ function hasCode(props: RichTextEditorProps, format: EditorFormat): boolean {
393
+ const content = props.state?.doc ?? props.value ?? props.defaultValue;
394
+ if (content == null) return false;
395
+ if (typeof content === 'string') {
396
+ if (format === 'markdown') {
397
+ return content.includes('`') || content.includes('~~~');
398
+ }
399
+ if (format === 'html') {
400
+ return content.includes('<code') || content.includes('<pre');
401
+ }
402
+ return false;
403
+ }
404
+ let found = false;
405
+ content.descendants((node) => {
406
+ if (found) return false;
407
+ if (node.type.spec.code || node.marks.some((m) => m.type.spec.code)) {
408
+ found = true;
409
+ }
410
+ return !found;
411
+ });
412
+ return found;
413
+ }
414
+
387
415
  export function RichTextEditor(props: RichTextEditorProps): ReactElement {
388
416
  const theme = useTheme() as unknown as Record<string, unknown>;
389
417
  const clipboard = useClipboard();
@@ -431,6 +459,11 @@ export function RichTextEditor(props: RichTextEditorProps): ReactElement {
431
459
  disabled,
432
460
  ],
433
461
  );
462
+ // A document that mounts with code in it sets that code in the mono
463
+ // family on its first frame: warmed while the editor renders, asked of
464
+ // the content it mounts with, once.
465
+ const [mountsWithCode] = useState(() => hasCode(props, format));
466
+ useFontPrewarm(mountsWithCode ? look.mono : null);
434
467
 
435
468
  // The editor's own plugins, made once per schema and option set — a
436
469
  // plugin instance carries its state across a reconfigure, so the undo
@@ -29,7 +29,6 @@ import {
29
29
  chainCommands,
30
30
  exitCode,
31
31
  setBlockType,
32
- toggleMark,
33
32
  wrapIn,
34
33
  } from 'prosemirror-commands';
35
34
  import { history, redo, undo } from 'prosemirror-history';
@@ -64,6 +63,7 @@ import {
64
63
  toggleTaskList,
65
64
  } from './commands.js';
66
65
  import { hasTables, tableRepair } from './tables.js';
66
+ import { toggleMark } from './marks.js';
67
67
 
68
68
  // --- the event ---------------------------------------------------------------
69
69
 
@@ -24,14 +24,25 @@
24
24
  // key at a position, the position of a key, the node under a key — and
25
25
  // `test/rich-text-editor-model.test.ts` asks it the rest.
26
26
  import type { Node as PMNode } from 'prosemirror-model';
27
+ import { Mapping } from 'prosemirror-transform';
27
28
  import type { Mappable } from 'prosemirror-transform';
29
+ import { spliceAll } from '../internal/splice.js';
30
+
31
+ /** A block: its key, where it starts, and the node it is. */
32
+ interface Entry {
33
+ key: string;
34
+ pos: number;
35
+ node: PMNode;
36
+ }
28
37
 
29
38
  export class BlockKeys {
30
39
  private counter = 0;
31
- /** Block start position → key, for the current document. */
32
- private byPos = new Map<number, string>();
33
- private posByKey = new Map<string, number>();
34
- private nodeByKey = new Map<string, PMNode>();
40
+ /** Every block, in document order — which is the order of their starts,
41
+ * so a position is found by bisection. */
42
+ private entries: Entry[] = [];
43
+ private byKey = new Map<string, Entry>();
44
+ /** The document the entries describe. */
45
+ private doc: PMNode | null = null;
35
46
 
36
47
  constructor(doc: PMNode) {
37
48
  this.update(doc, null);
@@ -40,22 +51,32 @@ export class BlockKeys {
40
51
  /** How many blocks the document has — every non-inline node but the
41
52
  * document itself. */
42
53
  get size(): number {
43
- return this.byPos.size;
54
+ return this.entries.length;
44
55
  }
45
56
 
46
57
  /** The key of the block that starts at `pos`, if one does. */
47
58
  keyAt(pos: number): string | undefined {
48
- return this.byPos.get(pos);
59
+ const entries = this.entries;
60
+ let lo = 0;
61
+ let hi = entries.length - 1;
62
+ while (lo <= hi) {
63
+ const mid = (lo + hi) >> 1;
64
+ const at = entries[mid].pos;
65
+ if (at === pos) return entries[mid].key;
66
+ if (at < pos) lo = mid + 1;
67
+ else hi = mid - 1;
68
+ }
69
+ return undefined;
49
70
  }
50
71
 
51
72
  /** Where the block under `key` starts now. */
52
73
  posOf(key: string): number | undefined {
53
- return this.posByKey.get(key);
74
+ return this.byKey.get(key)?.pos;
54
75
  }
55
76
 
56
77
  /** The node the block under `key` is now. */
57
78
  nodeOf(key: string): PMNode | undefined {
58
- return this.nodeByKey.get(key);
79
+ return this.byKey.get(key)?.node;
59
80
  }
60
81
 
61
82
  /**
@@ -63,57 +84,145 @@ export class BlockKeys {
63
84
  * transactions) that produced it from the one the keys were last built
64
85
  * for; null when nothing knows how the two relate.
65
86
  *
66
- * O(blocks), which is the right order: 10,000 paragraphs is a millisecond,
67
- * and the render that follows touches only the blocks whose node changed.
87
+ * The top-level blocks the two documents share at either end — the same
88
+ * node objects, which is what ProseMirror's structural sharing leaves
89
+ * everywhere an edit did not reach — keep their keys, and the blocks
90
+ * after the edit only move. What lies between is keyed as the whole
91
+ * document used to be, on every keystroke: a mapped start first, then a
92
+ * surviving node, then a fresh key. So a keystroke costs the block it
93
+ * lands in plus a pass that adds a number to each block after it, where
94
+ * it cost a walk of the document and three maps built from scratch —
95
+ * six milliseconds a key in a 2 MB document.
68
96
  */
69
97
  update(doc: PMNode, mapping: Mappable | null): void {
70
- // 1. Where each old block's start went.
98
+ const was = this.doc;
99
+ this.doc = doc;
100
+ // the top-level children the two documents share at either end
101
+ let head = 0;
102
+ let tail = 0;
103
+ if (was) {
104
+ const shared = Math.min(was.childCount, doc.childCount);
105
+ while (head < shared && was.child(head) === doc.child(head)) head++;
106
+ while (
107
+ tail < shared - head &&
108
+ was.child(was.childCount - 1 - tail) ===
109
+ doc.child(doc.childCount - 1 - tail)
110
+ ) {
111
+ tail++;
112
+ }
113
+ }
114
+ let from = 0; // where the changed children start, in both documents
115
+ for (let i = 0; i < head; i++) from += doc.child(i).nodeSize;
116
+ let wasTo = from;
117
+ if (was) {
118
+ for (let i = head; i < was.childCount - tail; i++) {
119
+ wasTo += was.child(i).nodeSize;
120
+ }
121
+ }
122
+ let to = from;
123
+ for (let i = head; i < doc.childCount - tail; i++) {
124
+ to += doc.child(i).nodeSize;
125
+ }
126
+ const entries = this.entries;
127
+ const first = this._firstAtOrAfter(from);
128
+ const end = this._firstAtOrAfter(wasTo);
129
+ const old = entries.slice(first, end);
130
+
131
+ // 1. Where each old block's start went — nowhere, when nothing in the
132
+ // mapping moves a position: a mark added or taken off, an attribute set.
133
+ // Bold over a whole document is one step a paragraph, and mapping every
134
+ // block through every one of them was a third of the command.
71
135
  const carried = new Map<number, string>();
72
- if (mapping) {
73
- for (const [pos, key] of this.byPos) {
136
+ if (mapping && !movesNothing(mapping)) {
137
+ for (const { pos, key } of old) {
74
138
  const result = mapping.mapResult(pos, 1);
75
139
  // the token after the start is the block's own opening — gone means
76
140
  // the block is gone, merged into whatever preceded it
77
141
  if (result.deletedAfter) continue;
78
142
  if (!carried.has(result.pos)) carried.set(result.pos, key);
79
143
  }
144
+ } else if (mapping) {
145
+ for (const { pos, key } of old) {
146
+ if (!carried.has(pos)) carried.set(pos, key);
147
+ }
80
148
  }
81
149
  // 2. Which old node objects are still here, for when nothing mapped.
82
150
  const byNode = new Map<PMNode, string[]>();
83
151
  const carriedKeys = new Set(carried.values());
84
- for (const [key, node] of this.nodeByKey) {
152
+ for (const { key, node } of old) {
85
153
  if (carriedKeys.has(key)) continue;
86
154
  const list = byNode.get(node);
87
155
  if (list) list.push(key);
88
156
  else byNode.set(node, [key]);
89
157
  }
158
+ for (const { key } of old) this.byKey.delete(key);
90
159
 
91
- const byPos = new Map<number, string>();
92
- const posByKey = new Map<string, number>();
93
- const nodeByKey = new Map<string, PMNode>();
94
- doc.descendants((node, pos) => {
160
+ // 3. The changed children, keyed.
161
+ const fresh: Entry[] = [];
162
+ const used = new Set<string>();
163
+ const visit = (node: PMNode, pos: number): boolean => {
95
164
  if (node.isInline) return false;
96
165
  let key = carried.get(pos);
97
- if (key !== undefined && posByKey.has(key)) key = undefined;
166
+ if (key !== undefined && used.has(key)) key = undefined;
98
167
  if (key === undefined) {
99
168
  const list = byNode.get(node);
100
169
  while (list && list.length > 0) {
101
170
  const candidate = list.shift()!;
102
- if (!posByKey.has(candidate)) {
171
+ if (!used.has(candidate)) {
103
172
  key = candidate;
104
173
  break;
105
174
  }
106
175
  }
107
176
  }
108
177
  if (key === undefined) key = `b${(this.counter++).toString(36)}`;
109
- byPos.set(pos, key);
110
- posByKey.set(key, pos);
111
- nodeByKey.set(key, node);
178
+ used.add(key);
179
+ const entry = { key, pos, node };
180
+ fresh.push(entry);
181
+ this.byKey.set(key, entry);
112
182
  // a textblock's children are inline: nothing below it has a key
113
183
  return !node.isTextblock;
184
+ };
185
+ let at = from;
186
+ for (let i = head; i < doc.childCount - tail; i++) {
187
+ const child = doc.child(i);
188
+ if (visit(child, at)) {
189
+ const base = at + 1;
190
+ child.descendants((node, pos) => visit(node, base + pos));
191
+ }
192
+ at += child.nodeSize;
193
+ }
194
+
195
+ // 4. The blocks after them moved, and are otherwise as they were.
196
+ const shift = to - wasTo;
197
+ if (shift !== 0) {
198
+ for (let i = end; i < entries.length; i++) entries[i].pos += shift;
199
+ }
200
+ spliceAll(entries, first, end - first, fresh);
201
+ }
202
+
203
+ /** The index of the first block starting at or after `pos`. */
204
+ private _firstAtOrAfter(pos: number): number {
205
+ const entries = this.entries;
206
+ let lo = 0;
207
+ let hi = entries.length;
208
+ while (lo < hi) {
209
+ const mid = (lo + hi) >> 1;
210
+ if (entries[mid].pos < pos) lo = mid + 1;
211
+ else hi = mid;
212
+ }
213
+ return lo;
214
+ }
215
+ }
216
+
217
+ /** Whether a mapping is made only of steps that move no position. */
218
+ function movesNothing(mapping: Mappable): boolean {
219
+ if (!(mapping instanceof Mapping)) return false;
220
+ for (const map of mapping.maps) {
221
+ let moved = false;
222
+ map.forEach(() => {
223
+ moved = true;
114
224
  });
115
- this.byPos = byPos;
116
- this.posByKey = posByKey;
117
- this.nodeByKey = nodeByKey;
225
+ if (moved) return false;
118
226
  }
227
+ return true;
119
228
  }