@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
@@ -12,8 +12,12 @@
12
12
  // `onReady` — because core's `<foreign>` already owns the protocol
13
13
  // (react-x11#269, ntk#246): the reparent, the save set, `_XEMBED_INFO`, the
14
14
  // synthetic ConfigureNotify, and handing the client back on unmount without
15
- // ever destroying it.
15
+ // ever destroying it. The one thing asked of the connection directly is
16
+ // whether it has that protocol at all (`canHostXEmbed`), because on a backend
17
+ // that does not, `onReady` is no evidence either way: the Cocoa backend's
18
+ // `<foreign>` still calls it, with `windowId: undefined`.
16
19
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
20
+ import { useApp } from 'react-x11';
17
21
 
18
22
  import { nodeProcessHost } from './host.js';
19
23
  import type { ExitInfo, ProcessHost, SpawnedProcess } from './host.js';
@@ -25,7 +29,9 @@ import type { ExitInfo, ProcessHost, SpawnedProcess } from './host.js';
25
29
  * with no terminal emulator installed, or no mpv, is an ordinary machine.
26
30
  * Both components render their `fallback` on it, the way
27
31
  * `useDesktopCalendarEvents` reports "no bus, no ical.js" rather than
28
- * throwing.
32
+ * throwing. So is an app on a react-x11 backend that cannot embed another
33
+ * program's window at all — the native macOS one — and `error` says which of
34
+ * the two it is: a `BackendUnavailableError` or an `EmbedUnsupportedError`.
29
35
  */
30
36
  export type EmbedStatus =
31
37
  'idle' | 'starting' | 'running' | 'exited' | 'unavailable';
@@ -51,6 +57,65 @@ export class BackendUnavailableError extends Error {
51
57
  }
52
58
  }
53
59
 
60
+ /**
61
+ * This app cannot host another program's window at all.
62
+ *
63
+ * Embedding is XEmbed, and XEmbed is X protocol — a reparent into a
64
+ * container, the save set, ClientMessages — which only react-x11's X11
65
+ * backend has. The native macOS backend has no cross-process window
66
+ * embedding (react-x11 `docs/macos.md`, "What this is, and is not"), so there
67
+ * is no window to hand a program and nothing to spawn.
68
+ *
69
+ * `useEmbeddedClient` reports it as `status: 'unavailable'`, the status a
70
+ * `BackendUnavailableError` gets, and for the same reason: it is an ordinary
71
+ * state of a healthy app, and the component renders its `fallback`. The class
72
+ * is what tells the two apart, because "install xterm" is the wrong advice
73
+ * here.
74
+ */
75
+ export class EmbedUnsupportedError extends Error {
76
+ constructor() {
77
+ super(
78
+ '@react-x11/components: this react-x11 backend cannot embed another ' +
79
+ "program's window — XEmbed needs the X11 backend, and the native " +
80
+ 'macOS one has no cross-process window embedding at all. Pass ' +
81
+ '`fallback` to render something else.',
82
+ );
83
+ this.name = 'EmbedUnsupportedError';
84
+ }
85
+ }
86
+
87
+ /** The slice of the app `canHostXEmbed` reads. `useApp()` is the escape
88
+ * hatch, so the shape is written out rather than imported — the call
89
+ * `../tray-host/manager.ts` makes for the slice it needs. */
90
+ interface XEmbedHostApp {
91
+ X?: { SetSelectionOwner?: unknown; ReparentWindow?: unknown } | null;
92
+ }
93
+
94
+ /**
95
+ * Can this app host another program's window?
96
+ *
97
+ * Asked of the connection, because `<foreign>` cannot be the one to say: on
98
+ * react-x11's Cocoa backend it still calls `onReady`, with an undefined
99
+ * `windowId`, and on the headless mock mounting one throws from the commit.
100
+ * The test is `<TrayHost>`'s — its
101
+ * manager reports `'unavailable'` when `app.X` has no `SetSelectionOwner`,
102
+ * which is what core's Cocoa `X` lacks (react-x11 `src/cocoa/app.js`: a stub
103
+ * carrying only the few requests core makes there) and what the headless
104
+ * mock's `X` lacks too. `ReparentWindow` is asked as well, because it is the
105
+ * request an embed is actually made of.
106
+ *
107
+ * Takes the app rather than calling `useApp()`, so it can be asked off the
108
+ * render path — of `createRoot()`'s result, before there is a tree.
109
+ */
110
+ export function canHostXEmbed(app: unknown): boolean {
111
+ const X = (app as XEmbedHostApp | null | undefined)?.X;
112
+ return (
113
+ !!X &&
114
+ typeof X.SetSelectionOwner === 'function' &&
115
+ typeof X.ReparentWindow === 'function'
116
+ );
117
+ }
118
+
54
119
  /** What to run, and what to do with it once it is running. */
55
120
  export interface LaunchPlan {
56
121
  /** Absolute path or a name on `PATH`. */
@@ -101,13 +166,15 @@ export interface UseEmbeddedClientOptions {
101
166
  stopSignal?: string;
102
167
  onStart?: (info: { process: SpawnedProcess; backend?: string }) => void;
103
168
  onExit?: (info: ExitInfo) => void;
104
- /** Spawn failures and missing backends alike. */
169
+ /** Spawn failures, missing backends, and an app that cannot host an
170
+ * embedded window at all (`EmbedUnsupportedError`). */
105
171
  onError?: (err: Error) => void;
106
172
  }
107
173
 
108
174
  export interface EmbeddedClient {
109
175
  status: EmbedStatus;
110
- /** The last failure, including a `BackendUnavailableError`. */
176
+ /** The last failure, including a `BackendUnavailableError` or an
177
+ * `EmbedUnsupportedError`. */
111
178
  error: Error | null;
112
179
  pid: number | null;
113
180
  /** The container window, once `<foreign>` has one. */
@@ -134,12 +201,21 @@ export interface EmbeddedClient {
134
201
  * element's props — style, focus, the `onEmbedded`/`onClientGone` handlers a
135
202
  * component may want to compose with — belong to the component, not to the
136
203
  * lifecycle.
204
+ *
205
+ * **On an app that cannot host XEmbed** (`canHostXEmbed` is false — the
206
+ * native macOS backend), `status` is `'unavailable'` from the first render,
207
+ * `error` is an `EmbedUnsupportedError`, and nothing is probed or spawned.
208
+ * The caller should render no `<foreign>` there either: it has no socket to
209
+ * be.
137
210
  */
138
211
  export function useEmbeddedClient(
139
212
  options: UseEmbeddedClientOptions,
140
213
  ): EmbeddedClient {
141
214
  const { plan, enabled = true, stopSignal = 'SIGTERM' } = options;
142
215
  const host = useMemo(() => options.host ?? nodeProcessHost(), [options.host]);
216
+ // Asked every render: two property reads, and an app does not change
217
+ // backend under a mounted tree.
218
+ const embeddable = canHostXEmbed(useApp());
143
219
 
144
220
  const [windowId, setWindowId] = useState<number | null>(null);
145
221
  const [status, setStatus] = useState<EmbedStatus>('idle');
@@ -158,6 +234,24 @@ export function useEmbeddedClient(
158
234
  const handlers = useRef(options);
159
235
  handlers.current = options;
160
236
 
237
+ // No XEmbed on this connection means no window for a program to draw into,
238
+ // whatever `<foreign>` reports: the Cocoa backend's calls `onReady` with an
239
+ // undefined `windowId`, which slipped past a `windowId === null` guard and
240
+ // spawned `xterm -into undefined`. So the app decides, and the lifecycle
241
+ // below starts nothing without it. Decided while rendering rather than in
242
+ // an effect, so the first commit can already be the `fallback`, and
243
+ // reported from an effect keyed on the error itself, so `onError` hears it
244
+ // once rather than once per plan. `enabled` false still means "hold off": a
245
+ // pane nobody can see yet reports nothing.
246
+ const unsupported = enabled && !embeddable;
247
+ const unsupportedError = useMemo(
248
+ () => (unsupported ? new EmbedUnsupportedError() : null),
249
+ [unsupported],
250
+ );
251
+ useEffect(() => {
252
+ if (unsupportedError) handlers.current.onError?.(unsupportedError);
253
+ }, [unsupportedError]);
254
+
161
255
  const handleReady = useCallback((info: { windowId: number }) => {
162
256
  setWindowId(info.windowId);
163
257
  }, []);
@@ -170,7 +264,7 @@ export function useEmbeddedClient(
170
264
  }, []);
171
265
 
172
266
  useEffect(() => {
173
- if (!enabled || windowId === null) {
267
+ if (!enabled || !embeddable || windowId === null) {
174
268
  setStatus('idle');
175
269
  return undefined;
176
270
  }
@@ -271,11 +365,11 @@ export function useEmbeddedClient(
271
365
  void planned?.dispose?.();
272
366
  };
273
367
  // `plan` is the restart signal — see the note on the option.
274
- }, [enabled, windowId, plan, host, stopSignal, generation]);
368
+ }, [enabled, embeddable, windowId, plan, host, stopSignal, generation]);
275
369
 
276
370
  return {
277
- status,
278
- error,
371
+ status: unsupported ? 'unavailable' : status,
372
+ error: unsupportedError ?? error,
279
373
  pid,
280
374
  windowId,
281
375
  backend,
@@ -10,6 +10,8 @@
10
10
  // other `-into WID` program should not have to copy this file to exist.
11
11
  export {
12
12
  BackendUnavailableError,
13
+ EmbedUnsupportedError,
14
+ canHostXEmbed,
13
15
  resolveBackend,
14
16
  useEmbeddedClient,
15
17
  } from './client.js';
package/src/flow/draw.ts CHANGED
@@ -38,6 +38,8 @@ interface CanvasLike {
38
38
  lineDashOffset?: number;
39
39
  save(): void;
40
40
  restore(): void;
41
+ translate(x: number, y: number): void;
42
+ scale(x: number, y: number): void;
41
43
  beginPath(): void;
42
44
  closePath(): void;
43
45
  moveTo(x: number, y: number): void;
@@ -56,6 +58,17 @@ interface LayoutLike {
56
58
  width: number;
57
59
  height: number;
58
60
  draw(ctx: unknown, x: number, y: number): void;
61
+ /** The engine's own coverage of the layout, one byte a device pixel, with
62
+ * `pad` round its box — where the engine answers it (react-x11#673). */
63
+ coverage?(options?: { pad?: number }): TextCoverage | null;
64
+ }
65
+
66
+ /** A layout's coverage: `width` × `height` bytes, the layout's origin at
67
+ * (pad, pad). */
68
+ export interface TextCoverage {
69
+ width: number;
70
+ height: number;
71
+ data: Uint8Array;
59
72
  }
60
73
 
61
74
  /** One shaped string, kept between frames. `width` and `height` are
@@ -99,6 +112,14 @@ export interface PainterOptions {
99
112
  * no amount of batching on the wire would have fixed.
100
113
  */
101
114
  cache: Map<string, CachedText>;
115
+ /**
116
+ * While a zoom gesture moves: a label may be drawn from a layout shaped
117
+ * at another size, scaled to the one asked for, rather than shaped again
118
+ * at every step. The pane sets it only where the context scales text
119
+ * with its transform (`scalesText`), and paints the exact sizes once the
120
+ * gesture rests.
121
+ */
122
+ approximateText?: boolean;
102
123
  }
103
124
 
104
125
  function isCanvas(ctx: unknown): ctx is CanvasLike {
@@ -111,6 +132,13 @@ function isCanvas(ctx: unknown): ctx is CanvasLike {
111
132
  /** Bound, so a pathological graph cannot turn the width cache into a leak. */
112
133
  const CACHE_LIMIT = 4000;
113
134
 
135
+ /** The sizes each string has been shaped at, per cache — what a label drawn
136
+ * mid-zoom looks for instead of shaping itself again (`approximateText`). */
137
+ const shapedSizes = new WeakMap<
138
+ Map<string, CachedText>,
139
+ Map<string, number[]>
140
+ >();
141
+
114
142
  /**
115
143
  * A logical value on the device grid.
116
144
  *
@@ -126,6 +154,20 @@ export function toDevice(value: number, scale: number): number {
126
154
  return Math.abs(out - whole) < 1e-6 ? whole : out;
127
155
  }
128
156
 
157
+ /**
158
+ * `Math.round` for a place on the device grid, deaf to floating-point noise
159
+ * at a half. A pan moves the graph by whole device pixels, and its blit
160
+ * takes a shift within a hair of whole as whole (`toDevice`: the viewport
161
+ * `-66.4` panned 27 down is `-39.400000000000006`). A place worked out from
162
+ * the new viewport can then sit a hair below the half the old one sat on,
163
+ * or above it, and round the other way — a node or a label a pixel from
164
+ * where the copy put it. Nudged past any such hair, a half rounds up on
165
+ * both sides of the blit.
166
+ */
167
+ export function snapToGrid(value: number): number {
168
+ return Math.round(value + 1e-4);
169
+ }
170
+
129
171
  function fontStyle(
130
172
  opts: PainterOptions,
131
173
  options: TextOptions | undefined,
@@ -146,8 +188,11 @@ function fontStyle(
146
188
  * repaint — a node with no explicit size is measured when the graph changes,
147
189
  * which is also when a hit test has to know how big it is — so measuring
148
190
  * cannot live behind the painter the way drawing does.
191
+ *
192
+ * Exported for the GL renderer's label atlas (`./gl/text.ts`), which draws
193
+ * the layout it measured onto a staging surface of its own.
149
194
  */
150
- function shape(
195
+ export function shape(
151
196
  opts: PainterOptions,
152
197
  text: string,
153
198
  options: TextOptions | undefined,
@@ -159,11 +204,16 @@ function shape(
159
204
  // The colour is part of the key: it is baked into the layout, so two
160
205
  // labels that differ only in ink are two shaped runs. The scale is not:
161
206
  // it is constant for the life of the pane that owns the cache.
162
- const key = `${family}|${size}|${options?.weight ?? 400}|${options?.color ?? opts.color}|${text}`;
207
+ const base = `${family}|${options?.weight ?? 400}|${options?.color ?? opts.color}|${text}`;
208
+ const key = `${size}|${base}`;
163
209
  const hit = cache.get(key);
164
210
  if (hit) return hit;
165
211
  const layout = fonts.layout(text, fontStyle(opts, options));
166
- if (cache.size >= CACHE_LIMIT) cache.clear();
212
+ let sizes = shapedSizes.get(cache);
213
+ if (cache.size >= CACHE_LIMIT) {
214
+ cache.clear();
215
+ sizes?.clear();
216
+ }
167
217
  const s = opts.scale;
168
218
  const entry = {
169
219
  width: layout.width / s,
@@ -171,22 +221,86 @@ function shape(
171
221
  layout,
172
222
  };
173
223
  cache.set(key, entry);
224
+ if (!sizes) shapedSizes.set(cache, (sizes = new Map()));
225
+ const shaped = sizes.get(base);
226
+ if (shaped) shaped.push(size);
227
+ else sizes.set(base, [size]);
174
228
  return entry;
175
229
  }
176
230
 
231
+ /**
232
+ * The layout a label is drawn from, and the scale it is drawn at: its own
233
+ * size where it has one, and mid-zoom (`approximateText`) the size nearest
234
+ * it that was shaped already — the one the gesture started from, for every
235
+ * label on screen. Shaping is most of what a zoom step costs in text, and
236
+ * a step that re-shapes every label at a size the next step moves off was
237
+ * paying it for nothing.
238
+ */
239
+ function shapeNear(
240
+ opts: PainterOptions,
241
+ text: string,
242
+ options: TextOptions | undefined,
243
+ ): { entry: CachedText; scale: number } | null {
244
+ if (opts.approximateText) {
245
+ const size = options?.size ?? 13;
246
+ const family = options?.family ?? opts.family;
247
+ const base = `${family}|${options?.weight ?? 400}|${options?.color ?? opts.color}|${text}`;
248
+ const exact = opts.cache.get(`${size}|${base}`);
249
+ if (exact) return { entry: exact, scale: 1 };
250
+ const shaped = shapedSizes.get(opts.cache)?.get(base);
251
+ if (shaped && shaped.length > 0) {
252
+ let best = shaped[0];
253
+ for (const at of shaped) {
254
+ if (Math.abs(Math.log(at / size)) < Math.abs(Math.log(best / size))) {
255
+ best = at;
256
+ }
257
+ }
258
+ const entry = opts.cache.get(`${best}|${base}`);
259
+ if (entry) return { entry, scale: size / best };
260
+ }
261
+ }
262
+ const entry = shape(opts, text, options);
263
+ return entry ? { entry, scale: 1 } : null;
264
+ }
265
+
177
266
  export function measureText(
178
267
  opts: PainterOptions,
179
268
  text: string,
180
269
  options?: TextOptions,
181
270
  ): { width: number; height: number } {
182
271
  const size = options?.size ?? 13;
183
- const entry = shape(opts, text, options);
184
- if (!entry) {
272
+ const near = shapeNear(opts, text, options);
273
+ if (!near) {
185
274
  // No font stack to ask. An estimate keeps layout plausible rather than
186
275
  // collapsing every node to its own padding.
187
276
  return { width: text.length * size * 0.55, height: size * 1.3 };
188
277
  }
189
- return { width: entry.width, height: entry.height };
278
+ const { entry, scale } = near;
279
+ return { width: entry.width * scale, height: entry.height * scale };
280
+ }
281
+
282
+ /**
283
+ * Cut a string to fit `max` logical pixels, with an ellipsis. Linear from
284
+ * the end rather than a binary search: labels that need it are short, and
285
+ * the widths it walks through are the ones the cache already holds.
286
+ *
287
+ * Both renderers call this, so a label cut on one is cut the same on the
288
+ * other — the GL one sets whatever this returns as a raster.
289
+ */
290
+ export function fitText(
291
+ opts: PainterOptions,
292
+ text: string,
293
+ options: TextOptions | undefined,
294
+ max: number,
295
+ ): string {
296
+ if (measureText(opts, text, options).width <= max) return text;
297
+ let cut = text.length;
298
+ while (cut > 1) {
299
+ cut--;
300
+ const candidate = `${text.slice(0, cut).trimEnd()}…`;
301
+ if (measureText(opts, candidate, options).width <= max) return candidate;
302
+ }
303
+ return '…';
190
304
  }
191
305
 
192
306
  class Painter implements FlowPainter {
@@ -230,6 +344,14 @@ class Painter implements FlowPainter {
230
344
  const { ctx } = this;
231
345
  ctx.strokeStyle = options.stroke ?? this.opts.color;
232
346
  ctx.lineWidth = this.d(options.lineWidth ?? 1);
347
+ // Every stroke says how it joins and ends; `polyline` and `strokeRuns`
348
+ // then round both. A context keeps whatever the last stroke set, so a
349
+ // pass that drew an edge before a handle stroked the handle with round
350
+ // joins and caps, and one that reached no edge — a node's own box,
351
+ // repainted by itself — stroked it mitred and butt-ended, and the same
352
+ // ring came out two ways depending on what else the pass drew.
353
+ ctx.lineJoin = 'miter';
354
+ ctx.lineCap = 'butt';
233
355
  if (typeof ctx.setLineDash === 'function') {
234
356
  ctx.setLineDash(options.dash ? options.dash.map((v) => this.d(v)) : []);
235
357
  if ('lineDashOffset' in ctx) {
@@ -321,6 +443,10 @@ class Painter implements FlowPainter {
321
443
  const { ctx } = this;
322
444
  ctx.beginPath();
323
445
  ctx.arc(this.d(x), this.d(y), this.d(r), 0, Math.PI * 2);
446
+ // Closed, so the ring is one loop with a join where it started: open,
447
+ // its two ends meet edge to edge, and a stroke with butt ends shows a
448
+ // hairline where they touch.
449
+ ctx.closePath();
324
450
  if (options.fill) {
325
451
  ctx.fillStyle = options.fill;
326
452
  ctx.fill();
@@ -367,6 +493,15 @@ class Painter implements FlowPainter {
367
493
  }
368
494
  if (!any) return;
369
495
  this.applyStroke(options);
496
+ // Set, not inherited: this was whatever the last `polyline` left, so a
497
+ // pass that stroked an edge alone before the zoom controls drew their
498
+ // glyphs with round ends, and one that reached only the controls drew
499
+ // them square — a panel repainted by itself, as a pan repaints its
500
+ // pinned furniture every frame, came out lighter than the panel it
501
+ // replaced. The same for batched edges, whose joins changed with what
502
+ // the pass had drawn first.
503
+ ctx.lineJoin = 'round';
504
+ ctx.lineCap = 'round';
370
505
  ctx.stroke();
371
506
  this.clearDash();
372
507
  }
@@ -431,46 +566,37 @@ class Painter implements FlowPainter {
431
566
  return measureText(this.opts, text, options);
432
567
  }
433
568
 
434
- /** Cut a string to fit, with an ellipsis. Linear from the end rather than
435
- * a binary search: labels that need it are short, and the widths it walks
436
- * through are the ones the cache already holds. */
437
- private fit(
438
- text: string,
439
- options: TextOptions | undefined,
440
- max: number,
441
- ): string {
442
- if (this.measureText(text, options).width <= max) return text;
443
- let cut = text.length;
444
- while (cut > 1) {
445
- cut--;
446
- const candidate = `${text.slice(0, cut).trimEnd()}…`;
447
- if (this.measureText(candidate, options).width <= max) return candidate;
448
- }
449
- return '…';
450
- }
451
-
452
569
  text(text: string, x: number, y: number, options?: TextOptions): void {
453
570
  if (!text) return;
454
571
  const shown = options?.maxWidth
455
- ? this.fit(text, options, options.maxWidth)
572
+ ? fitText(this.opts, text, options, options.maxWidth)
456
573
  : text;
457
- const entry = shape(this.opts, shown, options);
458
- if (!entry) return;
459
- const layout = entry;
574
+ const near = shapeNear(this.opts, shown, options);
575
+ if (!near) return;
576
+ const { entry, scale } = near;
577
+ const width = entry.width * scale;
578
+ const height = entry.height * scale;
460
579
  const align = options?.align ?? 'left';
461
- const dx =
462
- align === 'center'
463
- ? -layout.width / 2
464
- : align === 'right'
465
- ? -layout.width
466
- : 0;
467
- const dy = options?.baseline === 'middle' ? -layout.height / 2 : 0;
468
- // Rounded on the device grid, where the glyphs land.
469
- entry.layout.draw(
470
- this.raw,
471
- Math.round(this.d(x + dx)),
472
- Math.round(this.d(y + dy)),
473
- );
580
+ const dx = align === 'center' ? -width / 2 : align === 'right' ? -width : 0;
581
+ const dy = options?.baseline === 'middle' ? -height / 2 : 0;
582
+ if (scale === 1) {
583
+ // Rounded on the device grid, where the glyphs land.
584
+ entry.layout.draw(
585
+ this.raw,
586
+ snapToGrid(this.d(x + dx)),
587
+ snapToGrid(this.d(y + dy)),
588
+ );
589
+ return;
590
+ }
591
+ // Mid-zoom, a layout shaped at another size, scaled through the context
592
+ // — which draws it as outlines, glyphs and all (`scalesText`). Not on
593
+ // the grid: the whole label is moving, and it is set exactly at rest.
594
+ const ctx = this.ctx;
595
+ ctx.save();
596
+ ctx.translate(this.d(x + dx), this.d(y + dy));
597
+ ctx.scale(scale, scale);
598
+ entry.layout.draw(this.raw, 0, 0);
599
+ ctx.restore();
474
600
  }
475
601
  }
476
602
 
@@ -0,0 +1,85 @@
1
+ // CSS colours as the premultiplied floats a blend of ONE, ONE_MINUS_SRC_ALPHA
2
+ // wants.
3
+ //
4
+ // Through ntk's own parser where it can be reached, because a graph's colours
5
+ // come from three places and only one of them is ours: the palette (hex and
6
+ // `rgba()`), `tint()` (`rgba()`), and an application's node and edge styles —
7
+ // which are CSS, so `red` and `hsl(...)` are fair game and the 2D renderer
8
+ // draws them. `cssColorStraight` is exported by ntk at runtime but not
9
+ // declared by `react-x11/ntk`'s types, so it is probed rather than imported,
10
+ // the way `src/flow/index.ts` probes the reconciler's escape hatch; the local
11
+ // parser below is what a core that drops it degrades to.
12
+ import * as ntk from 'react-x11/ntk';
13
+
14
+ /** `[r, g, b, a]`, premultiplied, each in `0..1`. */
15
+ export type Rgba = readonly [number, number, number, number];
16
+
17
+ const CLEAR: Rgba = [0, 0, 0, 0];
18
+
19
+ type Parser = (value: string) => readonly number[] | null;
20
+
21
+ const ntkParser: Parser | null = (() => {
22
+ const candidate = (ntk as unknown as { cssColorStraight?: unknown })
23
+ .cssColorStraight;
24
+ return typeof candidate === 'function' ? (candidate as Parser) : null;
25
+ })();
26
+
27
+ /** Hex and `rgb()`/`rgba()` — every colour the default palette produces. */
28
+ function localParse(value: string): readonly number[] | null {
29
+ const v = value.trim().toLowerCase();
30
+ if (v === 'transparent') return [0, 0, 0, 0];
31
+ if (v.startsWith('#')) {
32
+ const h = v.slice(1);
33
+ if (!/^[0-9a-f]+$/.test(h)) return null;
34
+ if (h.length === 3 || h.length === 4) {
35
+ const c = (i: number) => parseInt(h[i] + h[i], 16) / 255;
36
+ return [c(0), c(1), c(2), h.length === 4 ? c(3) : 1];
37
+ }
38
+ if (h.length === 6 || h.length === 8) {
39
+ const c = (i: number) => parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;
40
+ return [c(0), c(1), c(2), h.length === 8 ? c(3) : 1];
41
+ }
42
+ return null;
43
+ }
44
+ const m = /^rgba?\(([^)]*)\)$/.exec(v);
45
+ if (!m) return null;
46
+ const parts = m[1].split(/[\s,/]+/).filter(Boolean);
47
+ if (parts.length < 3) return null;
48
+ const channel = (p: string) =>
49
+ p.endsWith('%') ? parseFloat(p) / 100 : parseFloat(p) / 255;
50
+ const alpha =
51
+ parts[3] === undefined
52
+ ? 1
53
+ : parts[3].endsWith('%')
54
+ ? parseFloat(parts[3]) / 100
55
+ : parseFloat(parts[3]);
56
+ return [channel(parts[0]), channel(parts[1]), channel(parts[2]), alpha];
57
+ }
58
+
59
+ /**
60
+ * A colour cache. A frame asks for the same few colours thousands of times —
61
+ * every edge in one pen, every card in one fill — so parsing is once per
62
+ * distinct string, and the cache is bounded against an application that
63
+ * generates colours.
64
+ */
65
+ export class ColorCache {
66
+ private readonly map = new Map<string, Rgba>();
67
+
68
+ get(value: string | undefined): Rgba {
69
+ if (!value) return CLEAR;
70
+ let rgba = this.map.get(value);
71
+ if (rgba) return rgba;
72
+ const parsed = (ntkParser ?? localParse)(value) ?? localParse(value);
73
+ // An unknown colour draws nothing rather than black: the same answer
74
+ // the 2D context gives a `fillStyle` it cannot read.
75
+ if (!parsed) {
76
+ rgba = CLEAR;
77
+ } else {
78
+ const a = parsed[3] ?? 1;
79
+ rgba = [parsed[0] * a, parsed[1] * a, parsed[2] * a, a];
80
+ }
81
+ if (this.map.size > 512) this.map.clear();
82
+ this.map.set(value, rgba);
83
+ return rgba;
84
+ }
85
+ }