@react-x11/components 0.8.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 (721) hide show
  1. package/README.md +105 -38
  2. package/dist/charts/node.d.ts +12 -2
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +50 -16
  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/embed/client.d.ts +48 -3
  49. package/dist/embed/client.d.ts.map +1 -1
  50. package/dist/embed/client.js +79 -5
  51. package/dist/embed/client.js.map +1 -1
  52. package/dist/embed/index.d.ts +1 -1
  53. package/dist/embed/index.d.ts.map +1 -1
  54. package/dist/embed/index.js +1 -1
  55. package/dist/embed/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 +240 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1327 -66
  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 +498 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3698 -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 +57 -11
  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 +2937 -197
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +340 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1714 -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 +151 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3375 -174
  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 +172 -5
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1336 -103
  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 +3503 -141
  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 +435 -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 +2 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +1 -1
  247. package/dist/index.js.map +1 -1
  248. package/dist/internal/collate.d.ts +3 -0
  249. package/dist/internal/collate.d.ts.map +1 -0
  250. package/dist/internal/collate.js +11 -0
  251. package/dist/internal/collate.js.map +1 -0
  252. package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
  253. package/dist/internal/markdown/ast.d.ts.map +1 -0
  254. package/dist/internal/markdown/ast.js +22 -0
  255. package/dist/internal/markdown/ast.js.map +1 -0
  256. package/dist/internal/markdown/parse.d.ts.map +1 -0
  257. package/dist/{markdown → internal/markdown}/parse.js +221 -30
  258. package/dist/internal/markdown/parse.js.map +1 -0
  259. package/dist/internal/markdown/stringify.d.ts +4 -0
  260. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  261. package/dist/internal/markdown/stringify.js +684 -0
  262. package/dist/internal/markdown/stringify.js.map +1 -0
  263. package/dist/internal/markdown/tags.d.ts.map +1 -0
  264. package/dist/internal/markdown/tags.js.map +1 -0
  265. package/dist/internal/prewarm.d.ts +18 -0
  266. package/dist/internal/prewarm.d.ts.map +1 -0
  267. package/dist/internal/prewarm.js +42 -0
  268. package/dist/internal/prewarm.js.map +1 -0
  269. package/dist/internal/scroll.d.ts +3 -2
  270. package/dist/internal/scroll.d.ts.map +1 -1
  271. package/dist/internal/scroll.js +1 -0
  272. package/dist/internal/scroll.js.map +1 -1
  273. package/dist/internal/sdf.d.ts +20 -0
  274. package/dist/internal/sdf.d.ts.map +1 -0
  275. package/dist/internal/sdf.js +216 -0
  276. package/dist/internal/sdf.js.map +1 -0
  277. package/dist/internal/splice.d.ts +12 -0
  278. package/dist/internal/splice.d.ts.map +1 -0
  279. package/dist/internal/splice.js +23 -0
  280. package/dist/internal/splice.js.map +1 -0
  281. package/dist/internal/window.d.ts +12 -0
  282. package/dist/internal/window.d.ts.map +1 -1
  283. package/dist/internal/window.js +23 -6
  284. package/dist/internal/window.js.map +1 -1
  285. package/dist/maps/anchors.d.ts +103 -0
  286. package/dist/maps/anchors.d.ts.map +1 -0
  287. package/dist/maps/anchors.js +790 -0
  288. package/dist/maps/anchors.js.map +1 -0
  289. package/dist/maps/controller.d.ts +340 -0
  290. package/dist/maps/controller.d.ts.map +1 -0
  291. package/dist/maps/controller.js +822 -0
  292. package/dist/maps/controller.js.map +1 -0
  293. package/dist/maps/gl/buckets.d.ts +99 -0
  294. package/dist/maps/gl/buckets.d.ts.map +1 -0
  295. package/dist/maps/gl/buckets.js +365 -0
  296. package/dist/maps/gl/buckets.js.map +1 -0
  297. package/dist/maps/gl/build-worker.d.ts +15 -0
  298. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  299. package/dist/maps/gl/build-worker.js +44 -0
  300. package/dist/maps/gl/build-worker.js.map +1 -0
  301. package/dist/maps/gl/color.d.ts +8 -0
  302. package/dist/maps/gl/color.d.ts.map +1 -0
  303. package/dist/maps/gl/color.js +57 -0
  304. package/dist/maps/gl/color.js.map +1 -0
  305. package/dist/maps/gl/cover.d.ts +70 -0
  306. package/dist/maps/gl/cover.d.ts.map +1 -0
  307. package/dist/maps/gl/cover.js +137 -0
  308. package/dist/maps/gl/cover.js.map +1 -0
  309. package/dist/maps/gl/index.d.ts +3 -0
  310. package/dist/maps/gl/index.d.ts.map +1 -0
  311. package/dist/maps/gl/index.js +20 -0
  312. package/dist/maps/gl/index.js.map +1 -0
  313. package/dist/maps/gl/markers.d.ts +28 -0
  314. package/dist/maps/gl/markers.d.ts.map +1 -0
  315. package/dist/maps/gl/markers.js +60 -0
  316. package/dist/maps/gl/markers.js.map +1 -0
  317. package/dist/maps/gl/overlays.d.ts +68 -0
  318. package/dist/maps/gl/overlays.d.ts.map +1 -0
  319. package/dist/maps/gl/overlays.js +300 -0
  320. package/dist/maps/gl/overlays.js.map +1 -0
  321. package/dist/maps/gl/pane.d.ts +12 -0
  322. package/dist/maps/gl/pane.d.ts.map +1 -0
  323. package/dist/maps/gl/pane.js +37 -0
  324. package/dist/maps/gl/pane.js.map +1 -0
  325. package/dist/maps/gl/placement.d.ts +124 -0
  326. package/dist/maps/gl/placement.d.ts.map +1 -0
  327. package/dist/maps/gl/placement.js +642 -0
  328. package/dist/maps/gl/placement.js.map +1 -0
  329. package/dist/maps/gl/renderer.d.ts +384 -0
  330. package/dist/maps/gl/renderer.d.ts.map +1 -0
  331. package/dist/maps/gl/renderer.js +1184 -0
  332. package/dist/maps/gl/renderer.js.map +1 -0
  333. package/dist/maps/gl/shaders.d.ts +121 -0
  334. package/dist/maps/gl/shaders.d.ts.map +1 -0
  335. package/dist/maps/gl/shaders.js +453 -0
  336. package/dist/maps/gl/shaders.js.map +1 -0
  337. package/dist/maps/gl/store.d.ts +125 -0
  338. package/dist/maps/gl/store.d.ts.map +1 -0
  339. package/dist/maps/gl/store.js +512 -0
  340. package/dist/maps/gl/store.js.map +1 -0
  341. package/dist/maps/gl/text.d.ts +283 -0
  342. package/dist/maps/gl/text.d.ts.map +1 -0
  343. package/dist/maps/gl/text.js +698 -0
  344. package/dist/maps/gl/text.js.map +1 -0
  345. package/dist/maps/gl/view.d.ts +345 -0
  346. package/dist/maps/gl/view.d.ts.map +1 -0
  347. package/dist/maps/gl/view.js +1209 -0
  348. package/dist/maps/gl/view.js.map +1 -0
  349. package/dist/maps/icons.d.ts +32 -0
  350. package/dist/maps/icons.d.ts.map +1 -0
  351. package/dist/maps/icons.js +151 -0
  352. package/dist/maps/icons.js.map +1 -0
  353. package/dist/maps/index.d.ts +3 -1
  354. package/dist/maps/index.d.ts.map +1 -1
  355. package/dist/maps/index.js +218 -52
  356. package/dist/maps/index.js.map +1 -1
  357. package/dist/maps/labels.d.ts +91 -18
  358. package/dist/maps/labels.d.ts.map +1 -1
  359. package/dist/maps/labels.js +376 -140
  360. package/dist/maps/labels.js.map +1 -1
  361. package/dist/maps/node.d.ts +179 -56
  362. package/dist/maps/node.d.ts.map +1 -1
  363. package/dist/maps/node.js +663 -537
  364. package/dist/maps/node.js.map +1 -1
  365. package/dist/maps/overlay.d.ts +72 -9
  366. package/dist/maps/overlay.d.ts.map +1 -1
  367. package/dist/maps/overlay.js +108 -28
  368. package/dist/maps/overlay.js.map +1 -1
  369. package/dist/maps/paint.d.ts +3 -0
  370. package/dist/maps/paint.d.ts.map +1 -1
  371. package/dist/maps/paint.js.map +1 -1
  372. package/dist/maps/proj.d.ts +62 -0
  373. package/dist/maps/proj.d.ts.map +1 -1
  374. package/dist/maps/proj.js +101 -0
  375. package/dist/maps/proj.js.map +1 -1
  376. package/dist/maps/renderer.d.ts +69 -0
  377. package/dist/maps/renderer.d.ts.map +1 -0
  378. package/dist/maps/renderer.js +66 -0
  379. package/dist/maps/renderer.js.map +1 -0
  380. package/dist/maps/sources.d.ts +30 -6
  381. package/dist/maps/sources.d.ts.map +1 -1
  382. package/dist/maps/sources.js +22 -3
  383. package/dist/maps/sources.js.map +1 -1
  384. package/dist/maps/style.d.ts +35 -0
  385. package/dist/maps/style.d.ts.map +1 -1
  386. package/dist/maps/style.js.map +1 -1
  387. package/dist/maps/styles.d.ts +12 -0
  388. package/dist/maps/styles.d.ts.map +1 -1
  389. package/dist/maps/styles.js +120 -6
  390. package/dist/maps/styles.js.map +1 -1
  391. package/dist/maps/theme.d.ts +19 -0
  392. package/dist/maps/theme.d.ts.map +1 -0
  393. package/dist/maps/theme.js +44 -0
  394. package/dist/maps/theme.js.map +1 -0
  395. package/dist/maps/tiles.d.ts +147 -27
  396. package/dist/maps/tiles.d.ts.map +1 -1
  397. package/dist/maps/tiles.js +221 -54
  398. package/dist/maps/tiles.js.map +1 -1
  399. package/dist/maps/types.d.ts +213 -21
  400. package/dist/maps/types.d.ts.map +1 -1
  401. package/dist/markdown/expressions.d.ts +1 -1
  402. package/dist/markdown/expressions.d.ts.map +1 -1
  403. package/dist/markdown/expressions.js.map +1 -1
  404. package/dist/markdown/index.d.ts +7 -6
  405. package/dist/markdown/index.d.ts.map +1 -1
  406. package/dist/markdown/index.js +121 -50
  407. package/dist/markdown/index.js.map +1 -1
  408. package/dist/markdown/spans.d.ts +1 -1
  409. package/dist/markdown/spans.d.ts.map +1 -1
  410. package/dist/markdown/spans.js +6 -0
  411. package/dist/markdown/spans.js.map +1 -1
  412. package/dist/media-player/index.d.ts +11 -3
  413. package/dist/media-player/index.d.ts.map +1 -1
  414. package/dist/media-player/index.js +13 -2
  415. package/dist/media-player/index.js.map +1 -1
  416. package/dist/qml/containers.d.ts.map +1 -1
  417. package/dist/qml/containers.js +6 -1
  418. package/dist/qml/containers.js.map +1 -1
  419. package/dist/qml/interaction.d.ts.map +1 -1
  420. package/dist/qml/interaction.js +38 -5
  421. package/dist/qml/interaction.js.map +1 -1
  422. package/dist/qml/layouts.d.ts.map +1 -1
  423. package/dist/qml/layouts.js +21 -6
  424. package/dist/qml/layouts.js.map +1 -1
  425. package/dist/qml/qtquick.d.ts.map +1 -1
  426. package/dist/qml/qtquick.js +9 -2
  427. package/dist/qml/qtquick.js.map +1 -1
  428. package/dist/qml/react.d.ts.map +1 -1
  429. package/dist/qml/react.js +9 -7
  430. package/dist/qml/react.js.map +1 -1
  431. package/dist/reorder/clock.d.ts +7 -0
  432. package/dist/reorder/clock.d.ts.map +1 -0
  433. package/dist/reorder/clock.js +26 -0
  434. package/dist/reorder/clock.js.map +1 -0
  435. package/dist/reorder/index.d.ts +25 -3
  436. package/dist/reorder/index.d.ts.map +1 -1
  437. package/dist/reorder/index.js +64 -19
  438. package/dist/reorder/index.js.map +1 -1
  439. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  440. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  441. package/dist/rich-text-editor/clipboard.js +307 -0
  442. package/dist/rich-text-editor/clipboard.js.map +1 -0
  443. package/dist/rich-text-editor/collab.d.ts +32 -0
  444. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  445. package/dist/rich-text-editor/collab.js +55 -0
  446. package/dist/rich-text-editor/collab.js.map +1 -0
  447. package/dist/rich-text-editor/commands.d.ts +50 -0
  448. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  449. package/dist/rich-text-editor/commands.js +376 -0
  450. package/dist/rich-text-editor/commands.js.map +1 -0
  451. package/dist/rich-text-editor/drag.d.ts +68 -0
  452. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  453. package/dist/rich-text-editor/drag.js +148 -0
  454. package/dist/rich-text-editor/drag.js.map +1 -0
  455. package/dist/rich-text-editor/html.d.ts +145 -0
  456. package/dist/rich-text-editor/html.d.ts.map +1 -0
  457. package/dist/rich-text-editor/html.js +516 -0
  458. package/dist/rich-text-editor/html.js.map +1 -0
  459. package/dist/rich-text-editor/index.d.ts +252 -0
  460. package/dist/rich-text-editor/index.d.ts.map +1 -0
  461. package/dist/rich-text-editor/index.js +856 -0
  462. package/dist/rich-text-editor/index.js.map +1 -0
  463. package/dist/rich-text-editor/inline.d.ts +94 -0
  464. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  465. package/dist/rich-text-editor/inline.js +252 -0
  466. package/dist/rich-text-editor/inline.js.map +1 -0
  467. package/dist/rich-text-editor/keymap.d.ts +71 -0
  468. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  469. package/dist/rich-text-editor/keymap.js +394 -0
  470. package/dist/rich-text-editor/keymap.js.map +1 -0
  471. package/dist/rich-text-editor/keys.d.ts +40 -0
  472. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  473. package/dist/rich-text-editor/keys.js +202 -0
  474. package/dist/rich-text-editor/keys.js.map +1 -0
  475. package/dist/rich-text-editor/look.d.ts +71 -0
  476. package/dist/rich-text-editor/look.d.ts.map +1 -0
  477. package/dist/rich-text-editor/look.js +342 -0
  478. package/dist/rich-text-editor/look.js.map +1 -0
  479. package/dist/rich-text-editor/markdown.d.ts +18 -0
  480. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  481. package/dist/rich-text-editor/markdown.js +496 -0
  482. package/dist/rich-text-editor/markdown.js.map +1 -0
  483. package/dist/rich-text-editor/marks.d.ts +9 -0
  484. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  485. package/dist/rich-text-editor/marks.js +83 -0
  486. package/dist/rich-text-editor/marks.js.map +1 -0
  487. package/dist/rich-text-editor/nodes.d.ts +135 -0
  488. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  489. package/dist/rich-text-editor/nodes.js +397 -0
  490. package/dist/rich-text-editor/nodes.js.map +1 -0
  491. package/dist/rich-text-editor/render.d.ts +68 -0
  492. package/dist/rich-text-editor/render.d.ts.map +1 -0
  493. package/dist/rich-text-editor/render.js +518 -0
  494. package/dist/rich-text-editor/render.js.map +1 -0
  495. package/dist/rich-text-editor/schema.d.ts +16 -0
  496. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  497. package/dist/rich-text-editor/schema.js +386 -0
  498. package/dist/rich-text-editor/schema.js.map +1 -0
  499. package/dist/rich-text-editor/store.d.ts +11 -0
  500. package/dist/rich-text-editor/store.d.ts.map +1 -0
  501. package/dist/rich-text-editor/store.js +43 -0
  502. package/dist/rich-text-editor/store.js.map +1 -0
  503. package/dist/rich-text-editor/suggest.d.ts +127 -0
  504. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  505. package/dist/rich-text-editor/suggest.js +0 -0
  506. package/dist/rich-text-editor/suggest.js.map +1 -0
  507. package/dist/rich-text-editor/tables.d.ts +41 -0
  508. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  509. package/dist/rich-text-editor/tables.js +204 -0
  510. package/dist/rich-text-editor/tables.js.map +1 -0
  511. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  512. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  513. package/dist/rich-text-editor/toolbar.js +548 -0
  514. package/dist/rich-text-editor/toolbar.js.map +1 -0
  515. package/dist/rich-text-editor/view.d.ts +368 -0
  516. package/dist/rich-text-editor/view.d.ts.map +1 -0
  517. package/dist/rich-text-editor/view.js +1968 -0
  518. package/dist/rich-text-editor/view.js.map +1 -0
  519. package/dist/rich-text-editor/virtual.d.ts +54 -0
  520. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  521. package/dist/rich-text-editor/virtual.js +279 -0
  522. package/dist/rich-text-editor/virtual.js.map +1 -0
  523. package/dist/richtext/node.d.ts +71 -4
  524. package/dist/richtext/node.d.ts.map +1 -1
  525. package/dist/richtext/node.js +233 -28
  526. package/dist/richtext/node.js.map +1 -1
  527. package/dist/richtext/runs.d.ts +13 -8
  528. package/dist/richtext/runs.d.ts.map +1 -1
  529. package/dist/richtext/runs.js +18 -8
  530. package/dist/richtext/runs.js.map +1 -1
  531. package/dist/table/index.d.ts.map +1 -1
  532. package/dist/table/index.js +23 -0
  533. package/dist/table/index.js.map +1 -1
  534. package/dist/table/rows.d.ts +3 -2
  535. package/dist/table/rows.d.ts.map +1 -1
  536. package/dist/table/rows.js +20 -6
  537. package/dist/table/rows.js.map +1 -1
  538. package/dist/terminal/backends.d.ts +4 -1
  539. package/dist/terminal/backends.d.ts.map +1 -1
  540. package/dist/terminal/backends.js.map +1 -1
  541. package/dist/terminal/index.d.ts +18 -7
  542. package/dist/terminal/index.d.ts.map +1 -1
  543. package/dist/terminal/index.js +32 -11
  544. package/dist/terminal/index.js.map +1 -1
  545. package/dist/terminal/vt/pty.d.ts +13 -2
  546. package/dist/terminal/vt/pty.d.ts.map +1 -1
  547. package/dist/terminal/vt/pty.js +18 -3
  548. package/dist/terminal/vt/pty.js.map +1 -1
  549. package/dist/terminal-output/index.d.ts.map +1 -1
  550. package/dist/terminal-output/index.js +6 -1
  551. package/dist/terminal-output/index.js.map +1 -1
  552. package/dist/three/canvas.d.ts.map +1 -1
  553. package/dist/three/canvas.js +85 -7
  554. package/dist/three/canvas.js.map +1 -1
  555. package/dist/three/events.d.ts +22 -4
  556. package/dist/three/events.d.ts.map +1 -1
  557. package/dist/three/events.js +34 -4
  558. package/dist/three/events.js.map +1 -1
  559. package/dist/tree/index.d.ts.map +1 -1
  560. package/dist/tree/index.js +17 -0
  561. package/dist/tree/index.js.map +1 -1
  562. package/package.json +59 -31
  563. package/src/charts/node.ts +68 -28
  564. package/src/charts/render.ts +120 -30
  565. package/src/code/index.ts +3 -1
  566. package/src/code-editor/completion.ts +3 -2
  567. package/src/code-editor/index.ts +19 -0
  568. package/src/code-editor/node.ts +1574 -184
  569. package/src/code-language/languages/glsl.ts +12 -2
  570. package/src/code-language/languages/javascript.ts +21 -4
  571. package/src/code-language/languages/json.ts +12 -2
  572. package/src/code-language/languages/shell.ts +12 -2
  573. package/src/code-language/languages/sql.ts +22 -2
  574. package/src/code-language/stream.ts +257 -17
  575. package/src/code-language/types.ts +5 -4
  576. package/src/codeblock/index.ts +20 -3
  577. package/src/embed/client.ts +102 -8
  578. package/src/embed/index.ts +2 -0
  579. package/src/flow/draw.ts +167 -41
  580. package/src/flow/gl/color.ts +85 -0
  581. package/src/flow/gl/index.ts +342 -0
  582. package/src/flow/gl/pack.ts +585 -0
  583. package/src/flow/gl/renderer.ts +679 -0
  584. package/src/flow/gl/shaders.ts +371 -0
  585. package/src/flow/gl/text.ts +1295 -0
  586. package/src/flow/index.ts +794 -67
  587. package/src/flow/node.ts +2496 -1256
  588. package/src/flow/paint.ts +511 -0
  589. package/src/flow/paths.ts +80 -15
  590. package/src/flow/scene.ts +2199 -0
  591. package/src/flow/types.ts +113 -1
  592. package/src/html/controls.ts +73 -2
  593. package/src/html/css/calc.ts +385 -0
  594. package/src/html/css/cascade.ts +1403 -62
  595. package/src/html/css/color.ts +755 -0
  596. package/src/html/css/content.ts +417 -0
  597. package/src/html/css/counter-styles.ts +973 -0
  598. package/src/html/css/decode.ts +130 -0
  599. package/src/html/css/parse.ts +1514 -160
  600. package/src/html/css/style.ts +4102 -222
  601. package/src/html/css/ua.ts +58 -12
  602. package/src/html/css/values.ts +150 -50
  603. package/src/html/css/vars.ts +348 -0
  604. package/src/html/dom.ts +284 -17
  605. package/src/html/fonts.ts +641 -0
  606. package/src/html/gif.ts +233 -0
  607. package/src/html/index.ts +180 -20
  608. package/src/html/layout/block.ts +3456 -230
  609. package/src/html/layout/boxes.ts +2100 -190
  610. package/src/html/layout/cache.ts +289 -0
  611. package/src/html/layout/collapse.ts +317 -0
  612. package/src/html/layout/css-grid.ts +1063 -0
  613. package/src/html/layout/flex.ts +1115 -106
  614. package/src/html/layout/floats.ts +128 -14
  615. package/src/html/layout/grid-lines.ts +141 -0
  616. package/src/html/layout/grid.ts +181 -0
  617. package/src/html/layout/inline.ts +3943 -192
  618. package/src/html/layout/shaping.ts +140 -0
  619. package/src/html/layout/table.ts +696 -186
  620. package/src/html/layout/tracks.ts +437 -0
  621. package/src/html/node.ts +1486 -121
  622. package/src/html/paint.ts +4293 -169
  623. package/src/html/resources.ts +161 -50
  624. package/src/html/surfaces.ts +81 -0
  625. package/src/html/svg.ts +493 -0
  626. package/src/html/url.ts +86 -0
  627. package/src/index.ts +4 -0
  628. package/src/internal/collate.ts +12 -0
  629. package/src/{markdown → internal/markdown}/ast.ts +35 -7
  630. package/src/{markdown → internal/markdown}/parse.ts +288 -35
  631. package/src/internal/markdown/stringify.ts +772 -0
  632. package/src/internal/prewarm.ts +45 -0
  633. package/src/internal/scroll.ts +5 -3
  634. package/src/internal/sdf.ts +227 -0
  635. package/src/internal/splice.ts +25 -0
  636. package/src/internal/window.ts +36 -5
  637. package/src/maps/anchors.ts +913 -0
  638. package/src/maps/controller.ts +1084 -0
  639. package/src/maps/gl/buckets.ts +461 -0
  640. package/src/maps/gl/build-worker.ts +66 -0
  641. package/src/maps/gl/color.ts +62 -0
  642. package/src/maps/gl/cover.ts +205 -0
  643. package/src/maps/gl/index.ts +23 -0
  644. package/src/maps/gl/markers.ts +83 -0
  645. package/src/maps/gl/overlays.ts +379 -0
  646. package/src/maps/gl/pane.ts +42 -0
  647. package/src/maps/gl/placement.ts +968 -0
  648. package/src/maps/gl/renderer.ts +1660 -0
  649. package/src/maps/gl/shaders.ts +489 -0
  650. package/src/maps/gl/store.ts +615 -0
  651. package/src/maps/gl/text.ts +868 -0
  652. package/src/maps/gl/view.ts +1489 -0
  653. package/src/maps/icons.ts +183 -0
  654. package/src/maps/index.ts +274 -81
  655. package/src/maps/labels.ts +457 -144
  656. package/src/maps/node.ts +832 -665
  657. package/src/maps/overlay.ts +148 -43
  658. package/src/maps/paint.ts +3 -0
  659. package/src/maps/proj.ts +118 -0
  660. package/src/maps/renderer.ts +155 -0
  661. package/src/maps/sources.ts +43 -6
  662. package/src/maps/style.ts +32 -0
  663. package/src/maps/styles.ts +215 -4
  664. package/src/maps/theme.ts +51 -0
  665. package/src/maps/tiles.ts +253 -62
  666. package/src/maps/types.ts +213 -21
  667. package/src/markdown/expressions.ts +5 -1
  668. package/src/markdown/index.ts +163 -78
  669. package/src/markdown/spans.ts +6 -1
  670. package/src/media-player/index.ts +18 -4
  671. package/src/qml/containers.tsx +6 -1
  672. package/src/qml/interaction.tsx +42 -5
  673. package/src/qml/layouts.tsx +21 -6
  674. package/src/qml/qtquick.tsx +9 -2
  675. package/src/qml/react.tsx +7 -5
  676. package/src/reorder/clock.ts +27 -0
  677. package/src/reorder/index.ts +100 -27
  678. package/src/rich-text-editor/clipboard.ts +439 -0
  679. package/src/rich-text-editor/collab.ts +91 -0
  680. package/src/rich-text-editor/commands.ts +448 -0
  681. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  682. package/src/rich-text-editor/drag.ts +211 -0
  683. package/src/rich-text-editor/html.ts +619 -0
  684. package/src/rich-text-editor/index.ts +1364 -0
  685. package/src/rich-text-editor/inline.ts +345 -0
  686. package/src/rich-text-editor/keymap.ts +510 -0
  687. package/src/rich-text-editor/keys.ts +228 -0
  688. package/src/rich-text-editor/look.ts +427 -0
  689. package/src/rich-text-editor/markdown.ts +653 -0
  690. package/src/rich-text-editor/marks.ts +101 -0
  691. package/src/rich-text-editor/nodes.ts +497 -0
  692. package/src/rich-text-editor/render.ts +837 -0
  693. package/src/rich-text-editor/schema.ts +431 -0
  694. package/src/rich-text-editor/store.ts +39 -0
  695. package/src/rich-text-editor/suggest.ts +597 -0
  696. package/src/rich-text-editor/tables.ts +272 -0
  697. package/src/rich-text-editor/toolbar.ts +724 -0
  698. package/src/rich-text-editor/view.ts +2287 -0
  699. package/src/rich-text-editor/virtual.ts +372 -0
  700. package/src/richtext/node.ts +294 -44
  701. package/src/richtext/runs.ts +23 -12
  702. package/src/table/index.ts +29 -0
  703. package/src/table/rows.ts +18 -8
  704. package/src/terminal/backends.ts +4 -1
  705. package/src/terminal/index.ts +47 -15
  706. package/src/terminal/vt/pty.ts +16 -2
  707. package/src/terminal-output/index.ts +6 -1
  708. package/src/three/canvas.ts +102 -8
  709. package/src/three/events.ts +49 -9
  710. package/src/tree/index.ts +19 -0
  711. package/dist/markdown/ast.d.ts.map +0 -1
  712. package/dist/markdown/ast.js +0 -17
  713. package/dist/markdown/ast.js.map +0 -1
  714. package/dist/markdown/parse.d.ts.map +0 -1
  715. package/dist/markdown/parse.js.map +0 -1
  716. package/dist/markdown/tags.d.ts.map +0 -1
  717. package/dist/markdown/tags.js.map +0 -1
  718. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  719. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  720. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  721. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -10,8 +10,10 @@
10
10
  // pipeline is remark → rehype → DOM with Tailwind classes — an HTML pass
11
11
  // and a DOM renderer, neither of which exists here. What was worth taking
12
12
  // was taken: its `remend` package's unterminated-markdown behaviour is
13
- // implemented natively by `parse.ts`, as parser tolerance rather than a
14
- // repair pre-pass (one pass instead of repair-then-reparse).
13
+ // implemented natively by `src/internal/markdown/parse.ts`, as parser
14
+ // tolerance rather than a repair pre-pass (one pass instead of
15
+ // repair-then-reparse). The parser is shared with `<RichTextEditor>`, which
16
+ // reads and writes the same markdown this renders.
15
17
  //
16
18
  // So: `parse.ts` → AST → this file renders `<box>` structure with one
17
19
  // `<richtext>` per run of inline text, inside one `selectable` root. During
@@ -51,7 +53,7 @@ import type {
51
53
  InlineNode,
52
54
  ListBlock,
53
55
  TableBlock,
54
- } from './ast.js';
56
+ } from '../internal/markdown/ast.js';
55
57
  import {
56
58
  registerRichText,
57
59
  RICHTEXT_ELEMENT,
@@ -67,14 +69,15 @@ import {
67
69
  import type { CodeBlockLook } from '../codeblock/index.js';
68
70
  import type { Language } from '../code-language/index.js';
69
71
 
70
- import { parse } from './parse.js';
72
+ import { parse } from '../internal/markdown/parse.js';
71
73
  import { evaluator, resolveExpressions } from './expressions.js';
72
74
  import type { Evaluate } from './expressions.js';
73
- import { SPREAD_PREFIX } from './ast.js';
75
+ import { SPREAD_PREFIX } from '../internal/markdown/ast.js';
74
76
  import { runsOf, plainTextOf } from './spans.js';
75
77
  import type { InlineStyles } from './spans.js';
76
78
  import { useLinkClicks } from '../richtext/index.js';
77
79
  import { hx } from './hx.js';
80
+ import { useFontPrewarm } from '../internal/prewarm.js';
78
81
 
79
82
  export type {
80
83
  AttributeValue,
@@ -85,11 +88,11 @@ export type {
85
88
  InlineNode,
86
89
  Document as MarkdownDocument,
87
90
  ParseOptions,
88
- } from './ast.js';
89
- export { SPREAD_PREFIX } from './ast.js';
90
- export { scanTag } from './tags.js';
91
- export type { ScannedTag, ScanResult } from './tags.js';
92
- export { parse, parseInline } from './parse.js';
91
+ } from '../internal/markdown/ast.js';
92
+ export { SPREAD_PREFIX } from '../internal/markdown/ast.js';
93
+ export { scanTag } from '../internal/markdown/tags.js';
94
+ export type { ScannedTag, ScanResult } from '../internal/markdown/tags.js';
95
+ export { parse, parseInline } from '../internal/markdown/parse.js';
93
96
 
94
97
  const h = React.createElement;
95
98
 
@@ -190,7 +193,8 @@ export interface MarkdownProps {
190
193
  * usual case.
191
194
  *
192
195
  * Block position only: a tag on its own line(s) is a component, and one in
193
- * the middle of a sentence is still text. See `ComponentInline` in ast.ts.
196
+ * the middle of a sentence is still text. See `ComponentInline` in
197
+ * src/internal/markdown/ast.ts.
194
198
  *
195
199
  * Give the map a stable identity — a new object per render defeats the
196
200
  * block cache, the same way a new `fences` map does.
@@ -362,7 +366,12 @@ function renderBlocks(blocks: BlockNode[], ctx: RenderCtx): ReactNode[] {
362
366
  return blocks.map((b, i) => renderBlock(b, ctx, i));
363
367
  }
364
368
 
365
- function renderBlock(block: BlockNode, ctx: RenderCtx, key: number): ReactNode {
369
+ function renderBlock(
370
+ block: BlockNode,
371
+ ctx: RenderCtx,
372
+ key: number,
373
+ first = key === 0,
374
+ ): ReactNode {
366
375
  const look = ctx.look;
367
376
  switch (block.type) {
368
377
  case 'paragraph':
@@ -375,7 +384,7 @@ function renderBlock(block: BlockNode, ctx: RenderCtx, key: number): ReactNode {
375
384
  weight: 700,
376
385
  });
377
386
  return richtext(key, runsOf(block.children, s), {
378
- marginTop: key === 0 ? 0 : Math.round(look.blockGap * 0.6),
387
+ marginTop: first ? 0 : Math.round(look.blockGap * 0.6),
379
388
  });
380
389
  }
381
390
 
@@ -507,7 +516,7 @@ function renderCode(
507
516
  flexDirection: 'column',
508
517
  },
509
518
  },
510
- richtext('code', runs, codeTextStyle(code), false),
519
+ richtext('code', runs, codeTextStyle(code, false), false),
511
520
  );
512
521
  }
513
522
 
@@ -550,38 +559,46 @@ function renderList(list: ListBlock, ctx: RenderCtx, key: number): ReactNode {
550
559
  ),
551
560
  );
552
561
  } else {
562
+ // the text itself, sized as the column the box around it used to be:
563
+ // a list is a few boxes per item, and at 600 KB there were 1,582 of
564
+ // these for yoga to lay out and absolutize on every width change
553
565
  marker = hx(
554
- 'box',
555
- { selectable: false, style: markerStyle },
556
- hx(
557
- 'text',
558
- {
559
- style: {
560
- color: look.dim,
561
- fontSize: look.inline.size,
562
- fontFamily: look.inline.family,
563
- },
566
+ 'text',
567
+ {
568
+ selectable: false,
569
+ style: {
570
+ flexShrink: 0,
571
+ width: markerWidth,
572
+ color: look.dim,
573
+ fontSize: look.inline.size,
574
+ fontFamily: look.inline.family,
564
575
  },
565
- list.ordered ? `${list.start + i}.` : '•',
566
- ),
576
+ },
577
+ list.ordered ? `${list.start + i}.` : '•',
567
578
  );
568
579
  }
580
+ const only = item.children.length === 1 ? item.children[0] : undefined;
569
581
  return hx(
570
582
  'box',
571
583
  { key: i, style: STYLES.itemRow },
572
584
  marker,
573
- hx(
574
- 'box',
575
- {
576
- style: {
577
- ...STYLES.column,
578
- gap: Math.round(look.blockGap * 0.4),
579
- flexGrow: 1,
580
- flexShrink: 1,
581
- },
582
- },
583
- ...renderBlocks(item.children, ctx),
584
- ),
585
+ // An item that is one paragraph — nearly every item — is the
586
+ // paragraph, taking the rest of the row; the column is for an item of
587
+ // several blocks, which needs the gap between them.
588
+ only?.type === 'paragraph'
589
+ ? richtext(0, runsOf(only.children, look.inline), STYLES.itemText)
590
+ : hx(
591
+ 'box',
592
+ {
593
+ style: {
594
+ ...STYLES.column,
595
+ gap: Math.round(look.blockGap * 0.4),
596
+ flexGrow: 1,
597
+ flexShrink: 1,
598
+ },
599
+ },
600
+ ...renderBlocks(item.children, ctx),
601
+ ),
585
602
  );
586
603
  });
587
604
  return hx('box', { key, style: { ...STYLES.column, gap } }, ...items);
@@ -595,6 +612,7 @@ function renderTable(
595
612
  const look = ctx.look;
596
613
  const size = look.inline.size;
597
614
  const padX = Math.round(size * 0.6);
615
+ const padY = Math.round(size * 0.35);
598
616
  const cols = table.align.length;
599
617
 
600
618
  // Column widths: max-content per column, measured through the app's font
@@ -642,24 +660,19 @@ function renderTable(
642
660
  borderTopColor: divided ? look.border : undefined,
643
661
  },
644
662
  },
663
+ // A cell is its text. The padding it needs is a margin: the cell has
664
+ // no background or border of its own — the row paints both — so the
665
+ // space around the text looks the same either way, and there is no
666
+ // box per cell for yoga to lay out.
645
667
  ...cells.map((cell, c) =>
646
- h(
647
- 'box',
648
- {
649
- key: c,
650
- style: {
651
- width: widths[c],
652
- paddingLeft: padX,
653
- paddingRight: padX,
654
- paddingTop: Math.round(size * 0.35),
655
- paddingBottom: Math.round(size * 0.35),
656
- },
657
- },
658
- richtext('c', runsOf(cell, s), {
659
- textAlign: table.align[c] ?? undefined,
660
- flexGrow: 1,
661
- }),
662
- ),
668
+ richtext(c, runsOf(cell, s), {
669
+ textAlign: table.align[c] ?? undefined,
670
+ width: widths[c] - padX * 2,
671
+ marginLeft: padX,
672
+ marginRight: padX,
673
+ marginTop: padY,
674
+ marginBottom: padY,
675
+ }),
663
676
  ),
664
677
  );
665
678
 
@@ -693,14 +706,26 @@ function renderTable(
693
706
  const STYLES = {
694
707
  column: { flexDirection: 'column' },
695
708
  itemRow: { flexDirection: 'row' },
709
+ itemText: { flexGrow: 1, flexShrink: 1 },
696
710
  markerBox: { flexDirection: 'row', flexShrink: 0 },
697
711
  } as const satisfies Record<string, Style>;
698
712
 
699
713
  // --- the component ---------------------------------------------------------
700
714
 
715
+ /** What the last render made for one top-level block. */
716
+ interface RenderedBlock {
717
+ raw: string;
718
+ live: boolean;
719
+ first: boolean;
720
+ key: number;
721
+ element: ReactNode;
722
+ }
723
+
701
724
  interface BlockCache {
702
725
  epoch: string;
703
- map: Map<string, ReactNode>;
726
+ blocks: RenderedBlock[];
727
+ /** a key no block has had */
728
+ next: number;
704
729
  }
705
730
 
706
731
  /**
@@ -722,6 +747,14 @@ export function Markdown(props: MarkdownProps): ReactElement {
722
747
  // same widening `hx.ts` documents for the `theme` prop.
723
748
  const theme = useTheme() as unknown as Record<string, unknown>;
724
749
  const app = useApp() as { fonts?: FontsMeasureLike } | null;
750
+ // a document with code in it sets that code in the mono family, and its
751
+ // render is the head start (a fence or a code span needs a backtick or a
752
+ // tilde fence; an indented block is rare enough to find its own way)
753
+ useFontPrewarm(
754
+ source.includes('`') || source.includes('~~~')
755
+ ? (props.monoFamily ?? 'monospace')
756
+ : null,
757
+ );
725
758
 
726
759
  const links = useLinkClicks(onLink);
727
760
  const menu = useSelectionMenu(selectable);
@@ -757,12 +790,19 @@ export function Markdown(props: MarkdownProps): ReactElement {
757
790
  [scope],
758
791
  );
759
792
 
793
+ // The last parse, which the next one resumes from: an edit or a streamed
794
+ // chunk reads the blocks around the change, and a 600 KB document is not
795
+ // read again whole for one paragraph (ParseOptions.previous). Only ever a
796
+ // hint — a parse resumed from it answers what a parse from scratch would.
797
+ const lastParse = React.useRef<Document | null>(null);
760
798
  const doc: Document = React.useMemo(() => {
761
799
  const parsed = parse(source, {
762
800
  partial,
763
801
  ...(isComponent ? { isComponent } : null),
764
802
  ...(evaluate ? { expressions: true } : null),
803
+ ...(lastParse.current ? { previous: lastParse.current } : null),
765
804
  });
805
+ lastParse.current = parsed;
766
806
  // Expressions resolve to text here rather than during the render, so
767
807
  // every `runsOf` caller downstream keeps seeing an inline tree it
768
808
  // already understands. `raws` is carried through, so the block cache
@@ -771,10 +811,18 @@ export function Markdown(props: MarkdownProps): ReactElement {
771
811
  return evaluate ? resolveExpressions(parsed, evaluate) : parsed;
772
812
  }, [source, partial, isComponent, evaluate]);
773
813
 
774
- // Per-block element cache, keyed on the block's raw source (+ whether it
775
- // is the live tail). Streaming appends re-render only the block that
776
- // changed; everything else is the same ReactElement, so React bails out
777
- // and the retained nodes keep their layout caches.
814
+ // Per-block element cache: a block whose raw source is what it was (and
815
+ // is still the live tail, or not, and still first, or not) is the same
816
+ // ReactElement, so React bails out and the retained nodes keep their
817
+ // layout caches. Streaming appends re-render only the block that changed.
818
+ //
819
+ // Each block keeps its React key from one render to the next, found by
820
+ // lining the blocks up with the last render's from both ends: those the
821
+ // change left alone keep theirs, and the changed ones in the middle take
822
+ // the keys of the ones they replace, in order, so an edited paragraph is
823
+ // updated where it stands. Keyed by index, a paragraph inserted mid-way
824
+ // moved every block after it onto another block's key, and all of them
825
+ // were rendered and laid out again: a second, in a 600 KB document.
778
826
  const cacheRef = React.useRef<BlockCache | null>(null);
779
827
  const fonts = app?.fonts ?? null;
780
828
  // Neither the fences map nor `resolveLanguage` can be part of a string
@@ -809,13 +857,35 @@ export function Markdown(props: MarkdownProps): ReactElement {
809
857
  }
810
858
  const epoch = `${look.key}|${fonts ? 'f' : '-'}|${seamsRef.current.gen}`;
811
859
  if (!cacheRef.current || cacheRef.current.epoch !== epoch) {
812
- cacheRef.current = { epoch, map: new Map() };
860
+ // the keys carry over, so a new epoch updates each block in place
861
+ cacheRef.current = {
862
+ epoch,
863
+ blocks: (cacheRef.current?.blocks ?? []).map((b) => ({
864
+ ...b,
865
+ element: undefined,
866
+ })),
867
+ next: cacheRef.current?.next ?? 0,
868
+ };
813
869
  }
814
870
  const cache = cacheRef.current;
815
871
 
816
872
  const children: ReactNode[] = [];
817
873
  {
818
- const nextMap = new Map<string, ReactNode>();
874
+ const was = cache.blocks;
875
+ const n = doc.blocks.length;
876
+ let head = 0;
877
+ while (head < n && head < was.length && was[head].raw === doc.raws[head]) {
878
+ head += 1;
879
+ }
880
+ let tail = 0;
881
+ while (
882
+ tail < n - head &&
883
+ tail < was.length - head &&
884
+ was[was.length - 1 - tail].raw === doc.raws[n - 1 - tail]
885
+ ) {
886
+ tail += 1;
887
+ }
888
+ const kept: RenderedBlock[] = [];
819
889
  const ctx: RenderCtx = {
820
890
  look,
821
891
  fonts,
@@ -824,24 +894,39 @@ export function Markdown(props: MarkdownProps): ReactElement {
824
894
  components: props.components,
825
895
  ...(evaluate ? { evaluate } : null),
826
896
  };
827
- for (let i = 0; i < doc.blocks.length; i += 1) {
828
- const live = partial && i === doc.blocks.length - 1;
829
- const cacheKey = `${i}|${live ? 'L' : '.'}|${doc.raws[i]}`;
830
- const hit = cache.map.get(cacheKey) ?? nextMap.get(cacheKey);
831
- if (hit !== undefined) {
832
- children.push(hit);
833
- nextMap.set(cacheKey, hit);
834
- continue;
835
- }
836
- const element = renderBlock(
837
- doc.blocks[i],
838
- live ? { ...ctx, live } : ctx,
839
- i,
840
- );
897
+ for (let i = 0; i < n; i += 1) {
898
+ const raw = doc.raws[i];
899
+ const live = partial && i === n - 1;
900
+ const first = i === 0;
901
+ // the block this one stands for in the last render, if any
902
+ const before =
903
+ i < head
904
+ ? was[i]
905
+ : i >= n - tail
906
+ ? was[was.length - n + i]
907
+ : i < was.length - tail
908
+ ? was[i]
909
+ : undefined;
910
+ const key = before ? before.key : cache.next++;
911
+ const element =
912
+ before &&
913
+ before.element !== undefined &&
914
+ before.raw === raw &&
915
+ before.live === live &&
916
+ before.first === first
917
+ ? before.element
918
+ : renderBlock(
919
+ doc.blocks[i],
920
+ live ? { ...ctx, live } : ctx,
921
+ key,
922
+ first,
923
+ );
841
924
  children.push(element);
842
- nextMap.set(cacheKey, element);
925
+ kept.push({ raw, live, first, key, element });
843
926
  }
844
- cache.map = nextMap; // old entries fall away with the text that made them
927
+ // what the next render lines up against; the rest falls away with the
928
+ // text that made it
929
+ cache.blocks = kept;
845
930
  }
846
931
 
847
932
  const rootStyle: Style = {
@@ -1,7 +1,7 @@
1
1
  // Inline AST → the styled runs `<richtext>` renders. Pure: all the colour
2
2
  // and font decisions arrive in `InlineStyles`, which `index.ts` derives
3
3
  // from the theme once per render.
4
- import type { InlineNode } from './ast.js';
4
+ import type { InlineNode } from '../internal/markdown/ast.js';
5
5
  import type { TextRun } from '../richtext/node.js';
6
6
 
7
7
  /** The resolved look of inline text, for one block. */
@@ -88,6 +88,11 @@ function pushRun(
88
88
  out: TextRun[],
89
89
  ): void {
90
90
  if (text.length === 0) return;
91
+ // A tab in running text reads as a space, as HTML sets it, and each text
92
+ // engine draws U+0009 as whatever its font has for it: a box in ntk's
93
+ // fonts, CoreText's own stops 28 points apart. It is laid out as the
94
+ // space it reads as, the same length, so every offset holds.
95
+ if (text.includes('\t')) text = text.replace(/\t/g, ' ');
91
96
  const inLink = st.href !== undefined;
92
97
  const color = st.code ? s.codeColor : inLink ? s.linkColor : s.color;
93
98
  const run: TextRun = {
@@ -32,12 +32,13 @@ import React, {
32
32
  useState,
33
33
  } from 'react';
34
34
  import type { ReactElement, ReactNode, Ref } from 'react';
35
- import { useTheme } from 'react-x11';
35
+ import { useApp, useTheme } from 'react-x11';
36
36
  import type { ForeignProps } from 'react-x11';
37
37
  import type { Style } from 'react-x11/style';
38
38
 
39
39
  import {
40
40
  BackendUnavailableError,
41
+ canHostXEmbed,
41
42
  resolveBackend,
42
43
  useEmbeddedClient,
43
44
  } from '../embed/index.js';
@@ -129,10 +130,13 @@ export interface MediaPlayerProps {
129
130
  onPlayingChange?: (playing: boolean) => void;
130
131
  /** The player process ended. */
131
132
  onExit?: (info: ExitInfo) => void;
132
- /** Spawn failures, control-channel failures, and the
133
- * `BackendUnavailableError` for a machine with neither player installed. */
133
+ /** Spawn failures, control-channel failures, the `BackendUnavailableError`
134
+ * for a machine with neither player installed, and the
135
+ * `EmbedUnsupportedError` for a react-x11 backend that cannot embed a
136
+ * player's window at all. */
134
137
  onError?: (err: Error) => void;
135
- /** Rendered instead of the surface when no backend is installed. */
138
+ /** Rendered instead of the surface when no player is available — none
139
+ * installed, or none can be embedded on this react-x11 backend. */
136
140
  fallback?: ReactNode;
137
141
  /** False holds off spawning entirely. */
138
142
  enabled?: boolean;
@@ -164,6 +168,11 @@ export interface MediaPlayerProps {
164
168
  *
165
169
  * The player's window stacks above everything drawn in this one, so nothing 2D
166
170
  * can overlap it — see "Controls" at the top of this file.
171
+ *
172
+ * **X11 only.** Both players are embedded by window id, which is XEmbed's
173
+ * mechanism; on a react-x11 backend with none — the native macOS one — the
174
+ * player is `'unavailable'` from the first render and `fallback` shows,
175
+ * rather than a player spawned at a window id that does not exist.
167
176
  */
168
177
  export function MediaPlayer(props: MediaPlayerProps): ReactElement {
169
178
  const {
@@ -174,6 +183,7 @@ export function MediaPlayer(props: MediaPlayerProps): ReactElement {
174
183
  stopSignal,
175
184
  } = props;
176
185
  const theme = useTheme() as unknown as Record<string, unknown>;
186
+ const embeddable = canHostXEmbed(useApp());
177
187
 
178
188
  const control = useRef<PlayerControl | null>(null);
179
189
  // Bumped when a control channel opens or closes. The prop-syncing effects
@@ -358,6 +368,10 @@ export function MediaPlayer(props: MediaPlayerProps): ReactElement {
358
368
  if (client.status === 'unavailable' && props.fallback !== undefined) {
359
369
  return h(React.Fragment, null, props.fallback);
360
370
  }
371
+ // No XEmbed on this app, and no `fallback`: an empty box holds the layout
372
+ // rather than a `<foreign>` with no socket to be — see the same branch in
373
+ // `../terminal/index.ts`.
374
+ if (!embeddable) return hx('box', { style: styles });
361
375
 
362
376
  const foreign: ForeignElementProps = {
363
377
  onReady: client.handleReady,
@@ -25,6 +25,7 @@ import {
25
25
  } from './view-utils.js';
26
26
  import { delegateExtras, resolveModel } from './models.js';
27
27
  import { warn } from './globals.js';
28
+ import { scaleOf } from '../internal/units.js';
28
29
 
29
30
  // --- positioners -----------------------------------------------------------
30
31
 
@@ -126,7 +127,11 @@ function FlickableView({ inst }: { inst: QmlInstance }): ReactElement {
126
127
  useEffect(() => {
127
128
  const node = hostNode(inst) as ScrollableNode | null;
128
129
  if (!node || typeof node.scrollTo !== 'function') return;
129
- if (node.scrollX !== cx || node.scrollY !== cy)
130
+ // The node's offsets are device pixels; `contentX`/`contentY`,
131
+ // `scrollTo` and `onScroll`'s payload are logical. Compared raw, every
132
+ // scroll the pane made came back to it as a `scrollTo` to where it was.
133
+ const s = scaleOf(node);
134
+ if (node.scrollX / s !== cx || node.scrollY / s !== cy)
130
135
  node.scrollTo({ x: cx, y: cy });
131
136
  }, [inst, cx, cy]);
132
137
  return (
@@ -29,6 +29,7 @@ import {
29
29
  qmlColor,
30
30
  str,
31
31
  } from './view-utils.js';
32
+ import { scaleOf } from '../internal/units.js';
32
33
 
33
34
  // --- Keys + focus ----------------------------------------------------------
34
35
 
@@ -56,6 +57,7 @@ interface PointerEventLike {
56
57
  interface WheelEventLike extends PointerEventLike {
57
58
  deltaX?: number;
58
59
  deltaY?: number;
60
+ smooth?: boolean;
59
61
  }
60
62
 
61
63
  // Qt's modifier flags, so `mouse.modifiers & Qt.ShiftModifier` reads as
@@ -130,6 +132,20 @@ export function keyFocusProps(inst: QmlInstance): Record<string, unknown> {
130
132
 
131
133
  // --- MouseArea -------------------------------------------------------------
132
134
 
135
+ // The wheel, from react-x11's units into Qt's. react-x11 hands a handler
136
+ // logical pixels, 48 to a notch (its `WheelEvent` declaration), positive
137
+ // where the content advances: down, and right. Qt's `angleDelta` is eighths
138
+ // of a degree, 120 to a notch, positive where the wheel turns away from the
139
+ // user: up, and *left* — xcb's plugin maps button 6 to +120, and
140
+ // `QWheelEvent::inverted` and `QAbstractSlider` both say a scroll to the
141
+ // right is negative. (The QML WheelEvent page says "up/right"; every
142
+ // platform plugin disagrees.) So both axes flip, and a notch down is -120.
143
+ const ANGLE_PER_PX = 120 / 48;
144
+
145
+ /** One axis of Qt's wheel from react-x11's: flipped, times `per`. */
146
+ const qtWheelAxis = (px: number | undefined, per = 1): number =>
147
+ px ? -px * per : 0; // an axis that did not move is 0, not -0
148
+
133
149
  function MouseAreaView({ inst }: { inst: QmlInstance }): ReactElement {
134
150
  const enabled = inst.slot('enabled').peek() !== false;
135
151
  const hoverEnabled = inst.slot('hoverEnabled').peek() === true;
@@ -137,10 +153,16 @@ function MouseAreaView({ inst }: { inst: QmlInstance }): ReactElement {
137
153
  applyMotion(inst, style);
138
154
 
139
155
  const mouse = (e: PointerEventLike) => {
140
- const abs = hostNode(inst)?.abs;
156
+ // `e.x` is logical and `abs` device (react-x11's docs/scale.md), so the
157
+ // area's origin is divided into the event's unit first. Not
158
+ // `getClientRects()`, the same box already divided: it answers nothing
159
+ // for a box with no area, and a 0×0 MouseArea still hears a click on a
160
+ // child that hangs outside it.
161
+ const node = hostNode(inst);
162
+ const s = scaleOf(node);
141
163
  return {
142
- x: e.x - (abs?.x ?? 0),
143
- y: e.y - (abs?.y ?? 0),
164
+ x: e.x - (node?.abs.x ?? 0) / s,
165
+ y: e.y - (node?.abs.y ?? 0) / s,
144
166
  button: e.button,
145
167
  modifiers: modifiersOf(e),
146
168
  accepted: true,
@@ -170,7 +192,18 @@ function MouseAreaView({ inst }: { inst: QmlInstance }): ReactElement {
170
192
  handlers.onWheel = (e: WheelEventLike) => {
171
193
  inst.emit('wheel', {
172
194
  ...mouse(e),
173
- angleDelta: { x: e.deltaX ?? 0, y: e.deltaY ?? 0 },
195
+ angleDelta: {
196
+ x: qtWheelAxis(e.deltaX, ANGLE_PER_PX),
197
+ y: qtWheelAxis(e.deltaY, ANGLE_PER_PX),
198
+ },
199
+ // Pixels only where a device measured them — a touchpad, a
200
+ // high-resolution wheel: react-x11's `smooth`. A notch's 48 are a
201
+ // toolkit's choice rather than a measurement, so a notched wheel
202
+ // leaves (0, 0), as Qt's X11 plugin does, and a handler falls back
203
+ // to angleDelta the way Qt's docs tell it to.
204
+ pixelDelta: e.smooth
205
+ ? { x: qtWheelAxis(e.deltaX), y: qtWheelAxis(e.deltaY) }
206
+ : { x: 0, y: 0 },
174
207
  });
175
208
  };
176
209
  if (hoverEnabled) {
@@ -229,7 +262,11 @@ function useImplicitLineHeight(inst: QmlInstance, text: string): void {
229
262
  text || 'Mg',
230
263
  node.resolvedTextStyle(),
231
264
  );
232
- inst.slots.get('implicitHeight')?.assign(Math.ceil(probe.height) + 8);
265
+ // Laid out at the resolved size, which is the device one (TextView,
266
+ // in qtquick.tsx), so the height is divided back into logical pixels.
267
+ inst.slots
268
+ .get('implicitHeight')
269
+ ?.assign(Math.ceil(probe.height / scaleOf(node)) + 8);
233
270
  } catch {
234
271
  // No fonts loaded (headless without the fonts option): leave 0.
235
272
  }
@@ -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
  }