@react-x11/components 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +10 -4
  2. package/dist/charts/node.d.ts +11 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +44 -14
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +27 -24
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/index.d.ts +1 -1
  24. package/dist/code-language/index.d.ts.map +1 -1
  25. package/dist/code-language/index.js +1 -1
  26. package/dist/code-language/index.js.map +1 -1
  27. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  28. package/dist/code-language/languages/glsl.js +10 -2
  29. package/dist/code-language/languages/glsl.js.map +1 -1
  30. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  31. package/dist/code-language/languages/javascript.js +18 -3
  32. package/dist/code-language/languages/javascript.js.map +1 -1
  33. package/dist/code-language/languages/json.d.ts.map +1 -1
  34. package/dist/code-language/languages/json.js +10 -2
  35. package/dist/code-language/languages/json.js.map +1 -1
  36. package/dist/code-language/languages/shell.d.ts.map +1 -1
  37. package/dist/code-language/languages/shell.js +10 -2
  38. package/dist/code-language/languages/shell.js.map +1 -1
  39. package/dist/code-language/languages/sql.d.ts.map +1 -1
  40. package/dist/code-language/languages/sql.js +20 -2
  41. package/dist/code-language/languages/sql.js.map +1 -1
  42. package/dist/code-language/runs.d.ts +31 -0
  43. package/dist/code-language/runs.d.ts.map +1 -1
  44. package/dist/code-language/runs.js +105 -0
  45. package/dist/code-language/runs.js.map +1 -1
  46. package/dist/code-language/stream.d.ts +22 -0
  47. package/dist/code-language/stream.d.ts.map +1 -1
  48. package/dist/code-language/stream.js +259 -9
  49. package/dist/code-language/stream.js.map +1 -1
  50. package/dist/code-language/types.d.ts +5 -4
  51. package/dist/code-language/types.d.ts.map +1 -1
  52. package/dist/codeblock/index.d.ts +26 -2
  53. package/dist/codeblock/index.d.ts.map +1 -1
  54. package/dist/codeblock/index.js +57 -4
  55. package/dist/codeblock/index.js.map +1 -1
  56. package/dist/flow/draw.d.ts +50 -0
  57. package/dist/flow/draw.d.ts.map +1 -1
  58. package/dist/flow/draw.js +132 -33
  59. package/dist/flow/draw.js.map +1 -1
  60. package/dist/flow/gl/color.d.ts +13 -0
  61. package/dist/flow/gl/color.d.ts.map +1 -0
  62. package/dist/flow/gl/color.js +82 -0
  63. package/dist/flow/gl/color.js.map +1 -0
  64. package/dist/flow/gl/index.d.ts +60 -0
  65. package/dist/flow/gl/index.d.ts.map +1 -0
  66. package/dist/flow/gl/index.js +283 -0
  67. package/dist/flow/gl/index.js.map +1 -0
  68. package/dist/flow/gl/pack.d.ts +133 -0
  69. package/dist/flow/gl/pack.d.ts.map +1 -0
  70. package/dist/flow/gl/pack.js +408 -0
  71. package/dist/flow/gl/pack.js.map +1 -0
  72. package/dist/flow/gl/renderer.d.ts +95 -0
  73. package/dist/flow/gl/renderer.d.ts.map +1 -0
  74. package/dist/flow/gl/renderer.js +459 -0
  75. package/dist/flow/gl/renderer.js.map +1 -0
  76. package/dist/flow/gl/shaders.d.ts +79 -0
  77. package/dist/flow/gl/shaders.d.ts.map +1 -0
  78. package/dist/flow/gl/shaders.js +346 -0
  79. package/dist/flow/gl/shaders.js.map +1 -0
  80. package/dist/flow/gl/text.d.ts +318 -0
  81. package/dist/flow/gl/text.d.ts.map +1 -0
  82. package/dist/flow/gl/text.js +1103 -0
  83. package/dist/flow/gl/text.js.map +1 -0
  84. package/dist/flow/index.d.ts +1 -1
  85. package/dist/flow/index.d.ts.map +1 -1
  86. package/dist/flow/index.js +619 -64
  87. package/dist/flow/index.js.map +1 -1
  88. package/dist/flow/node.d.ts +621 -72
  89. package/dist/flow/node.d.ts.map +1 -1
  90. package/dist/flow/node.js +2253 -1018
  91. package/dist/flow/node.js.map +1 -1
  92. package/dist/flow/paint.d.ts +35 -0
  93. package/dist/flow/paint.d.ts.map +1 -0
  94. package/dist/flow/paint.js +393 -0
  95. package/dist/flow/paint.js.map +1 -0
  96. package/dist/flow/paths.d.ts +14 -0
  97. package/dist/flow/paths.d.ts.map +1 -1
  98. package/dist/flow/paths.js +45 -19
  99. package/dist/flow/paths.js.map +1 -1
  100. package/dist/flow/scene.d.ts +584 -0
  101. package/dist/flow/scene.d.ts.map +1 -0
  102. package/dist/flow/scene.js +1453 -0
  103. package/dist/flow/scene.js.map +1 -0
  104. package/dist/flow/types.d.ts +111 -1
  105. package/dist/flow/types.d.ts.map +1 -1
  106. package/dist/html/controls.d.ts +28 -0
  107. package/dist/html/controls.d.ts.map +1 -1
  108. package/dist/html/controls.js +52 -2
  109. package/dist/html/controls.js.map +1 -1
  110. package/dist/html/css/calc.d.ts +14 -0
  111. package/dist/html/css/calc.d.ts.map +1 -0
  112. package/dist/html/css/calc.js +344 -0
  113. package/dist/html/css/calc.js.map +1 -0
  114. package/dist/html/css/cascade.d.ts +262 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1373 -67
  117. package/dist/html/css/cascade.js.map +1 -1
  118. package/dist/html/css/color.d.ts +23 -0
  119. package/dist/html/css/color.d.ts.map +1 -0
  120. package/dist/html/css/color.js +740 -0
  121. package/dist/html/css/color.js.map +1 -0
  122. package/dist/html/css/content.d.ts +92 -0
  123. package/dist/html/css/content.d.ts.map +1 -0
  124. package/dist/html/css/content.js +388 -0
  125. package/dist/html/css/content.js.map +1 -0
  126. package/dist/html/css/counter-styles.d.ts +76 -0
  127. package/dist/html/css/counter-styles.d.ts.map +1 -0
  128. package/dist/html/css/counter-styles.js +893 -0
  129. package/dist/html/css/counter-styles.js.map +1 -0
  130. package/dist/html/css/decode.d.ts +12 -0
  131. package/dist/html/css/decode.d.ts.map +1 -0
  132. package/dist/html/css/decode.js +116 -0
  133. package/dist/html/css/decode.js.map +1 -0
  134. package/dist/html/css/parse.d.ts +110 -10
  135. package/dist/html/css/parse.d.ts.map +1 -1
  136. package/dist/html/css/parse.js +1473 -180
  137. package/dist/html/css/parse.js.map +1 -1
  138. package/dist/html/css/style.d.ts +501 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3729 -206
  141. package/dist/html/css/style.js.map +1 -1
  142. package/dist/html/css/ua.d.ts.map +1 -1
  143. package/dist/html/css/ua.js +65 -16
  144. package/dist/html/css/ua.js.map +1 -1
  145. package/dist/html/css/values.d.ts +37 -3
  146. package/dist/html/css/values.d.ts.map +1 -1
  147. package/dist/html/css/values.js +122 -48
  148. package/dist/html/css/values.js.map +1 -1
  149. package/dist/html/css/vars.d.ts +52 -0
  150. package/dist/html/css/vars.d.ts.map +1 -0
  151. package/dist/html/css/vars.js +358 -0
  152. package/dist/html/css/vars.js.map +1 -0
  153. package/dist/html/dom.d.ts +30 -4
  154. package/dist/html/dom.d.ts.map +1 -1
  155. package/dist/html/dom.js +278 -17
  156. package/dist/html/dom.js.map +1 -1
  157. package/dist/html/fonts.d.ts +106 -0
  158. package/dist/html/fonts.d.ts.map +1 -0
  159. package/dist/html/fonts.js +565 -0
  160. package/dist/html/fonts.js.map +1 -0
  161. package/dist/html/gif.d.ts +15 -0
  162. package/dist/html/gif.d.ts.map +1 -0
  163. package/dist/html/gif.js +229 -0
  164. package/dist/html/gif.js.map +1 -0
  165. package/dist/html/index.d.ts +50 -11
  166. package/dist/html/index.d.ts.map +1 -1
  167. package/dist/html/index.js +115 -9
  168. package/dist/html/index.js.map +1 -1
  169. package/dist/html/layout/block.d.ts +226 -3
  170. package/dist/html/layout/block.d.ts.map +1 -1
  171. package/dist/html/layout/block.js +3077 -219
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +367 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1742 -182
  176. package/dist/html/layout/boxes.js.map +1 -1
  177. package/dist/html/layout/cache.d.ts +58 -0
  178. package/dist/html/layout/cache.d.ts.map +1 -0
  179. package/dist/html/layout/cache.js +224 -0
  180. package/dist/html/layout/cache.js.map +1 -0
  181. package/dist/html/layout/collapse.d.ts +45 -0
  182. package/dist/html/layout/collapse.d.ts.map +1 -0
  183. package/dist/html/layout/collapse.js +246 -0
  184. package/dist/html/layout/collapse.js.map +1 -0
  185. package/dist/html/layout/css-grid.d.ts +7 -0
  186. package/dist/html/layout/css-grid.d.ts.map +1 -0
  187. package/dist/html/layout/css-grid.js +900 -0
  188. package/dist/html/layout/css-grid.js.map +1 -0
  189. package/dist/html/layout/flex.d.ts.map +1 -1
  190. package/dist/html/layout/flex.js +1025 -89
  191. package/dist/html/layout/flex.js.map +1 -1
  192. package/dist/html/layout/floats.d.ts +45 -6
  193. package/dist/html/layout/floats.d.ts.map +1 -1
  194. package/dist/html/layout/floats.js +113 -14
  195. package/dist/html/layout/floats.js.map +1 -1
  196. package/dist/html/layout/grid-lines.d.ts +39 -0
  197. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  198. package/dist/html/layout/grid-lines.js +119 -0
  199. package/dist/html/layout/grid-lines.js.map +1 -0
  200. package/dist/html/layout/grid.d.ts +53 -0
  201. package/dist/html/layout/grid.d.ts.map +1 -0
  202. package/dist/html/layout/grid.js +153 -0
  203. package/dist/html/layout/grid.js.map +1 -0
  204. package/dist/html/layout/inline.d.ts +154 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3598 -175
  207. package/dist/html/layout/inline.js.map +1 -1
  208. package/dist/html/layout/shaping.d.ts +6 -0
  209. package/dist/html/layout/shaping.d.ts.map +1 -0
  210. package/dist/html/layout/shaping.js +100 -0
  211. package/dist/html/layout/shaping.js.map +1 -0
  212. package/dist/html/layout/table.d.ts +3 -0
  213. package/dist/html/layout/table.d.ts.map +1 -1
  214. package/dist/html/layout/table.js +681 -175
  215. package/dist/html/layout/table.js.map +1 -1
  216. package/dist/html/layout/tracks.d.ts +44 -0
  217. package/dist/html/layout/tracks.d.ts.map +1 -0
  218. package/dist/html/layout/tracks.js +349 -0
  219. package/dist/html/layout/tracks.js.map +1 -0
  220. package/dist/html/node.d.ts +169 -4
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1429 -137
  223. package/dist/html/node.js.map +1 -1
  224. package/dist/html/paint.d.ts +92 -3
  225. package/dist/html/paint.d.ts.map +1 -1
  226. package/dist/html/paint.js +3635 -107
  227. package/dist/html/paint.js.map +1 -1
  228. package/dist/html/resources.d.ts +60 -14
  229. package/dist/html/resources.d.ts.map +1 -1
  230. package/dist/html/resources.js +122 -36
  231. package/dist/html/resources.js.map +1 -1
  232. package/dist/html/surfaces.d.ts +23 -0
  233. package/dist/html/surfaces.d.ts.map +1 -0
  234. package/dist/html/surfaces.js +68 -0
  235. package/dist/html/surfaces.js.map +1 -0
  236. package/dist/html/svg.d.ts +80 -0
  237. package/dist/html/svg.d.ts.map +1 -0
  238. package/dist/html/svg.js +442 -0
  239. package/dist/html/svg.js.map +1 -0
  240. package/dist/html/url.d.ts +23 -0
  241. package/dist/html/url.d.ts.map +1 -0
  242. package/dist/html/url.js +80 -0
  243. package/dist/html/url.js.map +1 -0
  244. package/dist/index.d.ts +1 -1
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js.map +1 -1
  247. package/dist/internal/codelines.d.ts +42 -0
  248. package/dist/internal/codelines.d.ts.map +1 -0
  249. package/dist/internal/codelines.js +170 -0
  250. package/dist/internal/codelines.js.map +1 -0
  251. package/dist/internal/collate.d.ts +3 -0
  252. package/dist/internal/collate.d.ts.map +1 -0
  253. package/dist/internal/collate.js +11 -0
  254. package/dist/internal/collate.js.map +1 -0
  255. package/dist/internal/markdown/ast.d.ts +11 -0
  256. package/dist/internal/markdown/ast.d.ts.map +1 -1
  257. package/dist/internal/markdown/parse.d.ts.map +1 -1
  258. package/dist/internal/markdown/parse.js +109 -8
  259. package/dist/internal/markdown/parse.js.map +1 -1
  260. package/dist/internal/prewarm.d.ts +18 -0
  261. package/dist/internal/prewarm.d.ts.map +1 -0
  262. package/dist/internal/prewarm.js +42 -0
  263. package/dist/internal/prewarm.js.map +1 -0
  264. package/dist/internal/sdf.d.ts +20 -0
  265. package/dist/internal/sdf.d.ts.map +1 -0
  266. package/dist/internal/sdf.js +216 -0
  267. package/dist/internal/sdf.js.map +1 -0
  268. package/dist/internal/splice.d.ts +12 -0
  269. package/dist/internal/splice.d.ts.map +1 -0
  270. package/dist/internal/splice.js +23 -0
  271. package/dist/internal/splice.js.map +1 -0
  272. package/dist/internal/window.d.ts +12 -0
  273. package/dist/internal/window.d.ts.map +1 -1
  274. package/dist/internal/window.js +23 -6
  275. package/dist/internal/window.js.map +1 -1
  276. package/dist/maps/anchors.d.ts +6 -1
  277. package/dist/maps/anchors.d.ts.map +1 -1
  278. package/dist/maps/anchors.js +260 -1
  279. package/dist/maps/anchors.js.map +1 -1
  280. package/dist/maps/controller.d.ts +57 -0
  281. package/dist/maps/controller.d.ts.map +1 -1
  282. package/dist/maps/controller.js +97 -18
  283. package/dist/maps/controller.js.map +1 -1
  284. package/dist/maps/gl/buckets.d.ts +5 -1
  285. package/dist/maps/gl/buckets.d.ts.map +1 -1
  286. package/dist/maps/gl/buckets.js +5 -2
  287. package/dist/maps/gl/buckets.js.map +1 -1
  288. package/dist/maps/gl/build-worker.d.ts +2 -0
  289. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  290. package/dist/maps/gl/build-worker.js +1 -1
  291. package/dist/maps/gl/build-worker.js.map +1 -1
  292. package/dist/maps/gl/cover.d.ts +23 -4
  293. package/dist/maps/gl/cover.d.ts.map +1 -1
  294. package/dist/maps/gl/cover.js +61 -48
  295. package/dist/maps/gl/cover.js.map +1 -1
  296. package/dist/maps/gl/placement.d.ts +21 -8
  297. package/dist/maps/gl/placement.d.ts.map +1 -1
  298. package/dist/maps/gl/placement.js +133 -58
  299. package/dist/maps/gl/placement.js.map +1 -1
  300. package/dist/maps/gl/renderer.d.ts +36 -4
  301. package/dist/maps/gl/renderer.d.ts.map +1 -1
  302. package/dist/maps/gl/renderer.js +81 -24
  303. package/dist/maps/gl/renderer.js.map +1 -1
  304. package/dist/maps/gl/shaders.d.ts +18 -17
  305. package/dist/maps/gl/shaders.d.ts.map +1 -1
  306. package/dist/maps/gl/shaders.js +34 -32
  307. package/dist/maps/gl/shaders.js.map +1 -1
  308. package/dist/maps/gl/store.d.ts +10 -0
  309. package/dist/maps/gl/store.d.ts.map +1 -1
  310. package/dist/maps/gl/store.js +47 -4
  311. package/dist/maps/gl/store.js.map +1 -1
  312. package/dist/maps/gl/text.d.ts +153 -24
  313. package/dist/maps/gl/text.d.ts.map +1 -1
  314. package/dist/maps/gl/text.js +379 -63
  315. package/dist/maps/gl/text.js.map +1 -1
  316. package/dist/maps/gl/view.d.ts +293 -2
  317. package/dist/maps/gl/view.d.ts.map +1 -1
  318. package/dist/maps/gl/view.js +317 -82
  319. package/dist/maps/gl/view.js.map +1 -1
  320. package/dist/maps/icons.d.ts +32 -0
  321. package/dist/maps/icons.d.ts.map +1 -0
  322. package/dist/maps/icons.js +151 -0
  323. package/dist/maps/icons.js.map +1 -0
  324. package/dist/maps/index.d.ts +2 -0
  325. package/dist/maps/index.d.ts.map +1 -1
  326. package/dist/maps/index.js +2 -0
  327. package/dist/maps/index.js.map +1 -1
  328. package/dist/maps/labels.d.ts +56 -4
  329. package/dist/maps/labels.d.ts.map +1 -1
  330. package/dist/maps/labels.js +213 -46
  331. package/dist/maps/labels.js.map +1 -1
  332. package/dist/maps/node.d.ts +17 -0
  333. package/dist/maps/node.d.ts.map +1 -1
  334. package/dist/maps/node.js +64 -30
  335. package/dist/maps/node.js.map +1 -1
  336. package/dist/maps/proj.d.ts +48 -0
  337. package/dist/maps/proj.d.ts.map +1 -1
  338. package/dist/maps/proj.js +73 -0
  339. package/dist/maps/proj.js.map +1 -1
  340. package/dist/maps/sources.d.ts +5 -3
  341. package/dist/maps/sources.d.ts.map +1 -1
  342. package/dist/maps/sources.js +5 -3
  343. package/dist/maps/sources.js.map +1 -1
  344. package/dist/maps/style.d.ts +35 -0
  345. package/dist/maps/style.d.ts.map +1 -1
  346. package/dist/maps/style.js.map +1 -1
  347. package/dist/maps/styles.d.ts +12 -0
  348. package/dist/maps/styles.d.ts.map +1 -1
  349. package/dist/maps/styles.js +120 -6
  350. package/dist/maps/styles.js.map +1 -1
  351. package/dist/maps/tiles.d.ts +31 -11
  352. package/dist/maps/tiles.d.ts.map +1 -1
  353. package/dist/maps/tiles.js +61 -27
  354. package/dist/maps/tiles.js.map +1 -1
  355. package/dist/maps/types.d.ts +28 -4
  356. package/dist/maps/types.d.ts.map +1 -1
  357. package/dist/markdown/index.d.ts.map +1 -1
  358. package/dist/markdown/index.js +209 -68
  359. package/dist/markdown/index.js.map +1 -1
  360. package/dist/markdown/spans.d.ts.map +1 -1
  361. package/dist/markdown/spans.js +6 -0
  362. package/dist/markdown/spans.js.map +1 -1
  363. package/dist/qml/containers.d.ts.map +1 -1
  364. package/dist/qml/containers.js +6 -1
  365. package/dist/qml/containers.js.map +1 -1
  366. package/dist/qml/interaction.d.ts.map +1 -1
  367. package/dist/qml/interaction.js +38 -5
  368. package/dist/qml/interaction.js.map +1 -1
  369. package/dist/qml/layouts.d.ts.map +1 -1
  370. package/dist/qml/layouts.js +21 -6
  371. package/dist/qml/layouts.js.map +1 -1
  372. package/dist/qml/qtquick.d.ts.map +1 -1
  373. package/dist/qml/qtquick.js +9 -2
  374. package/dist/qml/qtquick.js.map +1 -1
  375. package/dist/qml/react.d.ts.map +1 -1
  376. package/dist/qml/react.js +9 -7
  377. package/dist/qml/react.js.map +1 -1
  378. package/dist/reorder/clock.d.ts +7 -0
  379. package/dist/reorder/clock.d.ts.map +1 -0
  380. package/dist/reorder/clock.js +26 -0
  381. package/dist/reorder/clock.js.map +1 -0
  382. package/dist/reorder/index.d.ts +25 -3
  383. package/dist/reorder/index.d.ts.map +1 -1
  384. package/dist/reorder/index.js +64 -19
  385. package/dist/reorder/index.js.map +1 -1
  386. package/dist/rich-text-editor/index.d.ts +0 -11
  387. package/dist/rich-text-editor/index.d.ts.map +1 -1
  388. package/dist/rich-text-editor/index.js +38 -9
  389. package/dist/rich-text-editor/index.js.map +1 -1
  390. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  391. package/dist/rich-text-editor/keymap.js +2 -1
  392. package/dist/rich-text-editor/keymap.js.map +1 -1
  393. package/dist/rich-text-editor/keys.d.ts +17 -6
  394. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  395. package/dist/rich-text-editor/keys.js +135 -26
  396. package/dist/rich-text-editor/keys.js.map +1 -1
  397. package/dist/rich-text-editor/markdown.d.ts.map +1 -1
  398. package/dist/rich-text-editor/markdown.js +30 -1
  399. package/dist/rich-text-editor/markdown.js.map +1 -1
  400. package/dist/rich-text-editor/marks.d.ts +9 -0
  401. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  402. package/dist/rich-text-editor/marks.js +83 -0
  403. package/dist/rich-text-editor/marks.js.map +1 -0
  404. package/dist/rich-text-editor/render.d.ts.map +1 -1
  405. package/dist/rich-text-editor/render.js +28 -10
  406. package/dist/rich-text-editor/render.js.map +1 -1
  407. package/dist/rich-text-editor/replace.d.ts +13 -0
  408. package/dist/rich-text-editor/replace.d.ts.map +1 -0
  409. package/dist/rich-text-editor/replace.js +64 -0
  410. package/dist/rich-text-editor/replace.js.map +1 -0
  411. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  412. package/dist/rich-text-editor/toolbar.js +1 -1
  413. package/dist/rich-text-editor/toolbar.js.map +1 -1
  414. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  415. package/dist/rich-text-editor/virtual.js +17 -0
  416. package/dist/rich-text-editor/virtual.js.map +1 -1
  417. package/dist/richtext/node.d.ts +46 -2
  418. package/dist/richtext/node.d.ts.map +1 -1
  419. package/dist/richtext/node.js +187 -4
  420. package/dist/richtext/node.js.map +1 -1
  421. package/dist/richtext/runs.d.ts +13 -8
  422. package/dist/richtext/runs.d.ts.map +1 -1
  423. package/dist/richtext/runs.js +18 -8
  424. package/dist/richtext/runs.js.map +1 -1
  425. package/dist/table/index.d.ts.map +1 -1
  426. package/dist/table/index.js +23 -0
  427. package/dist/table/index.js.map +1 -1
  428. package/dist/table/rows.d.ts +3 -2
  429. package/dist/table/rows.d.ts.map +1 -1
  430. package/dist/table/rows.js +20 -6
  431. package/dist/table/rows.js.map +1 -1
  432. package/dist/terminal/index.d.ts.map +1 -1
  433. package/dist/terminal/index.js +4 -0
  434. package/dist/terminal/index.js.map +1 -1
  435. package/dist/terminal/vt/pty.d.ts +13 -2
  436. package/dist/terminal/vt/pty.d.ts.map +1 -1
  437. package/dist/terminal/vt/pty.js +18 -3
  438. package/dist/terminal/vt/pty.js.map +1 -1
  439. package/dist/terminal-output/index.d.ts.map +1 -1
  440. package/dist/terminal-output/index.js +103 -23
  441. package/dist/terminal-output/index.js.map +1 -1
  442. package/dist/terminal-output/runs.d.ts +4 -1
  443. package/dist/terminal-output/runs.d.ts.map +1 -1
  444. package/dist/terminal-output/runs.js +5 -1
  445. package/dist/terminal-output/runs.js.map +1 -1
  446. package/dist/three/canvas.d.ts.map +1 -1
  447. package/dist/three/canvas.js +85 -7
  448. package/dist/three/canvas.js.map +1 -1
  449. package/dist/three/events.d.ts +22 -4
  450. package/dist/three/events.d.ts.map +1 -1
  451. package/dist/three/events.js +34 -4
  452. package/dist/three/events.js.map +1 -1
  453. package/dist/tree/index.d.ts.map +1 -1
  454. package/dist/tree/index.js +17 -0
  455. package/dist/tree/index.js.map +1 -1
  456. package/package.json +42 -33
  457. package/src/charts/node.ts +62 -26
  458. package/src/charts/render.ts +120 -30
  459. package/src/code/index.ts +36 -32
  460. package/src/code-editor/completion.ts +3 -2
  461. package/src/code-editor/index.ts +19 -0
  462. package/src/code-editor/node.ts +1574 -184
  463. package/src/code-language/index.ts +1 -1
  464. package/src/code-language/languages/glsl.ts +12 -2
  465. package/src/code-language/languages/javascript.ts +21 -4
  466. package/src/code-language/languages/json.ts +12 -2
  467. package/src/code-language/languages/shell.ts +12 -2
  468. package/src/code-language/languages/sql.ts +22 -2
  469. package/src/code-language/runs.ts +111 -1
  470. package/src/code-language/stream.ts +257 -17
  471. package/src/code-language/types.ts +5 -4
  472. package/src/codeblock/index.ts +68 -4
  473. package/src/flow/draw.ts +167 -41
  474. package/src/flow/gl/color.ts +85 -0
  475. package/src/flow/gl/index.ts +342 -0
  476. package/src/flow/gl/pack.ts +585 -0
  477. package/src/flow/gl/renderer.ts +679 -0
  478. package/src/flow/gl/shaders.ts +371 -0
  479. package/src/flow/gl/text.ts +1295 -0
  480. package/src/flow/index.ts +794 -67
  481. package/src/flow/node.ts +2496 -1256
  482. package/src/flow/paint.ts +511 -0
  483. package/src/flow/paths.ts +80 -15
  484. package/src/flow/scene.ts +2199 -0
  485. package/src/flow/types.ts +113 -1
  486. package/src/html/controls.ts +73 -2
  487. package/src/html/css/calc.ts +385 -0
  488. package/src/html/css/cascade.ts +1481 -62
  489. package/src/html/css/color.ts +755 -0
  490. package/src/html/css/content.ts +417 -0
  491. package/src/html/css/counter-styles.ts +973 -0
  492. package/src/html/css/decode.ts +130 -0
  493. package/src/html/css/parse.ts +1514 -160
  494. package/src/html/css/style.ts +4131 -223
  495. package/src/html/css/ua.ts +66 -17
  496. package/src/html/css/values.ts +150 -50
  497. package/src/html/css/vars.ts +348 -0
  498. package/src/html/dom.ts +284 -17
  499. package/src/html/fonts.ts +641 -0
  500. package/src/html/gif.ts +233 -0
  501. package/src/html/index.ts +180 -20
  502. package/src/html/layout/block.ts +3560 -208
  503. package/src/html/layout/boxes.ts +2141 -190
  504. package/src/html/layout/cache.ts +289 -0
  505. package/src/html/layout/collapse.ts +317 -0
  506. package/src/html/layout/css-grid.ts +1063 -0
  507. package/src/html/layout/flex.ts +1115 -106
  508. package/src/html/layout/floats.ts +128 -14
  509. package/src/html/layout/grid-lines.ts +141 -0
  510. package/src/html/layout/grid.ts +181 -0
  511. package/src/html/layout/inline.ts +4187 -192
  512. package/src/html/layout/shaping.ts +140 -0
  513. package/src/html/layout/table.ts +696 -186
  514. package/src/html/layout/tracks.ts +437 -0
  515. package/src/html/node.ts +1585 -156
  516. package/src/html/paint.ts +4582 -267
  517. package/src/html/resources.ts +161 -50
  518. package/src/html/surfaces.ts +81 -0
  519. package/src/html/svg.ts +504 -0
  520. package/src/html/url.ts +86 -0
  521. package/src/index.ts +2 -0
  522. package/src/internal/codelines.ts +200 -0
  523. package/src/internal/collate.ts +12 -0
  524. package/src/internal/markdown/ast.ts +11 -0
  525. package/src/internal/markdown/parse.ts +154 -11
  526. package/src/internal/prewarm.ts +45 -0
  527. package/src/internal/sdf.ts +227 -0
  528. package/src/internal/splice.ts +25 -0
  529. package/src/internal/window.ts +36 -5
  530. package/src/maps/anchors.ts +307 -1
  531. package/src/maps/controller.ts +116 -31
  532. package/src/maps/gl/buckets.ts +5 -1
  533. package/src/maps/gl/build-worker.ts +13 -2
  534. package/src/maps/gl/cover.ts +79 -44
  535. package/src/maps/gl/placement.ts +221 -69
  536. package/src/maps/gl/renderer.ts +104 -20
  537. package/src/maps/gl/shaders.ts +35 -32
  538. package/src/maps/gl/store.ts +66 -17
  539. package/src/maps/gl/text.ts +444 -71
  540. package/src/maps/gl/view.ts +361 -96
  541. package/src/maps/icons.ts +183 -0
  542. package/src/maps/index.ts +4 -0
  543. package/src/maps/labels.ts +269 -49
  544. package/src/maps/node.ts +82 -49
  545. package/src/maps/proj.ts +87 -0
  546. package/src/maps/sources.ts +5 -3
  547. package/src/maps/style.ts +32 -0
  548. package/src/maps/styles.ts +215 -4
  549. package/src/maps/tiles.ts +64 -31
  550. package/src/maps/types.ts +28 -4
  551. package/src/markdown/index.ts +293 -92
  552. package/src/markdown/spans.ts +5 -0
  553. package/src/qml/containers.tsx +6 -1
  554. package/src/qml/interaction.tsx +42 -5
  555. package/src/qml/layouts.tsx +21 -6
  556. package/src/qml/qtquick.tsx +9 -2
  557. package/src/qml/react.tsx +7 -5
  558. package/src/reorder/clock.ts +27 -0
  559. package/src/reorder/index.ts +100 -27
  560. package/src/rich-text-editor/index.ts +37 -12
  561. package/src/rich-text-editor/keymap.ts +1 -1
  562. package/src/rich-text-editor/keys.ts +135 -26
  563. package/src/rich-text-editor/markdown.ts +36 -1
  564. package/src/rich-text-editor/marks.ts +101 -0
  565. package/src/rich-text-editor/render.ts +49 -12
  566. package/src/rich-text-editor/replace.ts +85 -0
  567. package/src/rich-text-editor/toolbar.ts +1 -1
  568. package/src/rich-text-editor/virtual.ts +25 -0
  569. package/src/richtext/node.ts +235 -14
  570. package/src/richtext/runs.ts +23 -12
  571. package/src/table/index.ts +29 -0
  572. package/src/table/rows.ts +18 -8
  573. package/src/terminal/index.ts +4 -0
  574. package/src/terminal/vt/pty.ts +16 -2
  575. package/src/terminal-output/index.ts +129 -31
  576. package/src/terminal-output/runs.ts +16 -2
  577. package/src/three/canvas.ts +102 -8
  578. package/src/three/events.ts +49 -9
  579. package/src/tree/index.ts +19 -0
@@ -15,7 +15,11 @@
15
15
  // A shared module, not a component: no element registration, no React, and
16
16
  // nothing imported from either of its consumers (a component never imports
17
17
  // another component).
18
- import { codeRuns, autoTokenStyles } from '../code-language/index.js';
18
+ import {
19
+ codeRuns,
20
+ autoTokenStyles,
21
+ CodeRunCache,
22
+ } from '../code-language/index.js';
19
23
  import type { Language, TokenStyles } from '../code-language/index.js';
20
24
  import type { TextRun } from '../richtext/index.js';
21
25
  import { tint } from 'react-x11/style';
@@ -130,6 +134,49 @@ export function codeBlockRuns(
130
134
  }).map((run) => ({ ...run, family: look.family, size: look.size }));
131
135
  }
132
136
 
137
+ /**
138
+ * `codeBlockRuns` kept between calls, for a block of code that changes a
139
+ * little at a time — a fence being streamed, a source being appended to:
140
+ * the tokenizer is told which lines changed and the rest keep their runs
141
+ * (`CodeRunCache`). Call `dispose()` when done with it.
142
+ */
143
+ export class CodeBlockRunCache {
144
+ private cache: CodeRunCache<TextRun> | null = null;
145
+ private family: string | undefined;
146
+ private size: number | undefined;
147
+
148
+ runs(
149
+ source: string,
150
+ look: CodeBlockLook,
151
+ options: CodeBlockRunOptions = {},
152
+ ): TextRun[] {
153
+ if (!this.cache || this.family !== look.family || this.size !== look.size) {
154
+ this.cache?.dispose();
155
+ const { family, size } = look;
156
+ this.family = family;
157
+ this.size = size;
158
+ this.cache = new CodeRunCache<TextRun>((run) => ({
159
+ ...run,
160
+ family,
161
+ size,
162
+ }));
163
+ }
164
+ const { lang = '', language, resolveLanguage, highlight = true } = options;
165
+ return this.cache.runs(source, highlight ? lang : '', {
166
+ styles: look.styles,
167
+ color: look.color,
168
+ ...(highlight && language ? { language } : null),
169
+ ...(highlight && resolveLanguage ? { resolveLanguage } : null),
170
+ resolveToken: look.resolveToken,
171
+ });
172
+ }
173
+
174
+ dispose(): void {
175
+ this.cache?.dispose();
176
+ this.cache = null;
177
+ }
178
+ }
179
+
133
180
  /** The block's own box: fill, radius, padding. What surrounds it — a row
134
181
  * with a gutter, a column in a document — is the component's. */
135
182
  export function codeBlockStyle(look: CodeBlockLook): Style {
@@ -140,7 +187,24 @@ export function codeBlockStyle(look: CodeBlockLook): Style {
140
187
  };
141
188
  }
142
189
 
143
- /** The style the runs are laid out with, in both components. */
144
- export function codeTextStyle(look: CodeBlockLook): Style {
145
- return { lineHeight: look.lineHeight };
190
+ /**
191
+ * The style the runs are laid out with, in both components — `wrap` as the
192
+ * `<richtext>` is given it.
193
+ *
194
+ * Unwrapped, the text is as wide as its longest line, and at least as wide
195
+ * as its viewport. Stretched to the viewport, as a column stretches what it
196
+ * holds, its box held none of a line past the viewport's edge: the viewport
197
+ * had nothing to scroll to, and core, asked whether the text reached past
198
+ * the viewport, heard that it did not and left it unclipped — so a fence,
199
+ * with nothing round it to clip it either, drew the rest of a long line
200
+ * across whatever stood beside the document.
201
+ */
202
+ export function codeTextStyle(look: CodeBlockLook, wrap = true): Style {
203
+ return wrap
204
+ ? { lineHeight: look.lineHeight }
205
+ : {
206
+ lineHeight: look.lineHeight,
207
+ alignSelf: 'flex-start',
208
+ minWidth: '100%',
209
+ };
146
210
  }
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
+ }