@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
@@ -0,0 +1,511 @@
1
+ // The second half of drawing: a {@link FlowScene} issued through a
2
+ // `FlowPainter`.
3
+ //
4
+ // `./scene.ts` decided what the frame shows; this decides how few requests
5
+ // show it. That division is deliberate — every batching rule below is a
6
+ // property of *this* renderer, measured against ntk's 2D context, and none
7
+ // of it would be right for a GPU (`docs/prd-flow-gl.md`). A scene is
8
+ // renderer-neutral precisely because the buckets live here.
9
+ //
10
+ // Z-order is the order of the calls, and it is load-bearing: the grid, then
11
+ // every edge's stroke, then every arrowhead, then every label chip, then
12
+ // every label, then the nodes, then the pane's furniture. An edge label that
13
+ // drew with its own edge would be crossed out by the next edge over.
14
+ import type { FlowPainter, StrokeOptions, XYPosition } from './types.js';
15
+ import type {
16
+ FlowScene,
17
+ SceneEdge,
18
+ SceneGrid,
19
+ SceneNodeItem,
20
+ SceneRect,
21
+ SceneRule,
22
+ SceneText,
23
+ } from './scene.js';
24
+
25
+ /** How a renderer draws the grid, when it can do better than the runs below
26
+ * — the element's pattern-tile path (ntk#263). Answers whether it did. */
27
+ export type GridPainter = (painter: FlowPainter, grid: SceneGrid) => boolean;
28
+
29
+ function paintRect(painter: FlowPainter, item: SceneRect): void {
30
+ painter.rect(
31
+ item.rect.x,
32
+ item.rect.y,
33
+ item.rect.width,
34
+ item.rect.height,
35
+ item.radius,
36
+ { fill: item.fill, stroke: item.stroke, lineWidth: item.lineWidth },
37
+ );
38
+ }
39
+
40
+ function paintText(painter: FlowPainter, item: SceneText): void {
41
+ painter.text(item.text, item.x, item.y, {
42
+ size: item.size,
43
+ color: item.color,
44
+ weight: item.weight,
45
+ align: item.align,
46
+ baseline: item.baseline,
47
+ maxWidth: item.maxWidth,
48
+ });
49
+ }
50
+
51
+ /**
52
+ * Strokes grouped by the pen that will draw them, for a pane whose edges are
53
+ * stroked a pen at a time (`FlowScene.batch`, `EDGE_BATCH` in `scene.ts`).
54
+ *
55
+ * Everything a graph strokes is the same two or three pens — the default
56
+ * edge, the selected one, the animated dash — so grouping collapses a
57
+ * per-edge request into a per-pen one. The key carries the dash *and* its
58
+ * offset: two edges marching out of phase cannot share a path, because the
59
+ * offset is set on the context, not on the subpath. And it leads with the
60
+ * layer, so that the pens are stroked in the same order by every pass —
61
+ * the order a pass happened to meet them in put the default pen over the
62
+ * selected one in one pass and under it in the next.
63
+ */
64
+ class StrokeBuckets {
65
+ private readonly byPen = new Map<
66
+ string,
67
+ { options: StrokeOptions; runs: (readonly XYPosition[])[] }
68
+ >();
69
+
70
+ push(
71
+ points: readonly XYPosition[],
72
+ layer: number,
73
+ stroke: string,
74
+ lineWidth: number,
75
+ dash: readonly number[] | undefined,
76
+ dashOffset: number,
77
+ ): void {
78
+ const key = `${layer}|${stroke}|${lineWidth}|${dash?.join(',') ?? ''}|${dashOffset}`;
79
+ let entry = this.byPen.get(key);
80
+ if (!entry) {
81
+ entry = { options: { stroke, lineWidth, dash, dashOffset }, runs: [] };
82
+ this.byPen.set(key, entry);
83
+ }
84
+ entry.runs.push(points);
85
+ }
86
+
87
+ paint(painter: FlowPainter): void {
88
+ for (const key of [...this.byPen.keys()].sort()) {
89
+ const { options, runs } = this.byPen.get(key)!;
90
+ painter.strokeRuns(runs, options);
91
+ }
92
+ }
93
+ }
94
+
95
+ /** Arrowheads piled by colour: the filled heads and the open ones share one,
96
+ * and differ only in which list they land in. */
97
+ interface MarkerBucket {
98
+ color: string;
99
+ lineWidth: number;
100
+ filled: (readonly XYPosition[])[];
101
+ open: (readonly XYPosition[])[];
102
+ }
103
+
104
+ /** The runs a pass strokes of an edge — the part of the route it reaches,
105
+ * where it reaches only part. */
106
+ function runsOf(edge: SceneEdge): readonly (readonly XYPosition[])[] {
107
+ return edge.runs ?? [edge.points];
108
+ }
109
+
110
+ function paintEdges(
111
+ painter: FlowPainter,
112
+ edges: readonly SceneEdge[],
113
+ batch: boolean,
114
+ ): void {
115
+ if (batch) paintEdgesByPen(painter, edges);
116
+ else paintEdgesInOrder(painter, edges);
117
+
118
+ // The chips and then the labels, both above every edge — which is the
119
+ // point of a chip. The text is not collected, because a glyph run is
120
+ // already one request and nothing is gained by holding it.
121
+ for (const edge of edges) {
122
+ if (edge.chip) paintRect(painter, edge.chip);
123
+ }
124
+ for (const edge of edges) {
125
+ if (edge.label) paintText(painter, edge.label);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Every run of a pen as one path, and every arrowhead of a colour. A pass
131
+ * draws the pens it reaches in the same order and with the same compositing
132
+ * as the whole pane does: where two of a pen's runs overlap, their coverage
133
+ * adds, in a pass as in a repaint.
134
+ */
135
+ function paintEdgesByPen(
136
+ painter: FlowPainter,
137
+ edges: readonly SceneEdge[],
138
+ ): void {
139
+ const strokes = new StrokeBuckets();
140
+ const markers = new Map<string, MarkerBucket>();
141
+ for (const edge of edges) {
142
+ const layer = edge.layer ?? 0;
143
+ // a dashed run picking its pattern up where it starts along the edge
144
+ const runs = runsOf(edge);
145
+ for (let i = 0; i < runs.length; i++) {
146
+ const points = runs[i];
147
+ if (points.length < 2) continue;
148
+ strokes.push(
149
+ points,
150
+ layer,
151
+ edge.stroke,
152
+ edge.lineWidth,
153
+ edge.dash,
154
+ edge.dashOffset + (edge.runStarts?.[i] ?? 0),
155
+ );
156
+ }
157
+ for (const marker of edge.markers) {
158
+ const key = `${layer}|${marker.color}|${marker.lineWidth}`;
159
+ let bucket = markers.get(key);
160
+ if (!bucket) {
161
+ bucket = {
162
+ color: marker.color,
163
+ lineWidth: marker.lineWidth,
164
+ filled: [],
165
+ open: [],
166
+ };
167
+ markers.set(key, bucket);
168
+ }
169
+ (marker.filled ? bucket.filled : bucket.open).push(marker.points);
170
+ }
171
+ }
172
+ strokes.paint(painter);
173
+ for (const key of [...markers.keys()].sort()) {
174
+ const bucket = markers.get(key)!;
175
+ if (bucket.filled.length > 0) {
176
+ painter.polygons(bucket.filled, { fill: bucket.color });
177
+ }
178
+ if (bucket.open.length > 0) {
179
+ painter.strokeRuns(bucket.open, {
180
+ stroke: bucket.color,
181
+ lineWidth: bucket.lineWidth,
182
+ });
183
+ }
184
+ }
185
+ }
186
+
187
+ /**
188
+ * An edge at a time, in the graph's order, and the arrowheads after all of
189
+ * them: what a pane with few edges draws, where a path per pen would be a
190
+ * mask the size of the pane (`EDGE_BATCH`). One edge is still one path,
191
+ * however many pieces a pass cut it into: a step edge that doubles back
192
+ * along its own line adds its two legs' coverage in one path and lays one
193
+ * over the other in two, and a pass that drew the pieces apart drew the
194
+ * shared line lighter at its edges than a repaint did. A dashed edge's
195
+ * pieces are the exception — each picks its pattern up where it starts, and
196
+ * a dash offset is the context's, not a subpath's.
197
+ */
198
+ function paintEdgesInOrder(
199
+ painter: FlowPainter,
200
+ edges: readonly SceneEdge[],
201
+ ): void {
202
+ for (const edge of edges) {
203
+ const runs = runsOf(edge);
204
+ const pen = {
205
+ stroke: edge.stroke,
206
+ lineWidth: edge.lineWidth,
207
+ dash: edge.dash,
208
+ dashOffset: edge.dashOffset,
209
+ };
210
+ if (edge.dash && edge.runStarts) {
211
+ for (let i = 0; i < runs.length; i++) {
212
+ if (runs[i].length < 2) continue;
213
+ painter.polyline(runs[i], {
214
+ ...pen,
215
+ dashOffset: edge.dashOffset + (edge.runStarts[i] ?? 0),
216
+ });
217
+ }
218
+ } else if (runs.length === 1) {
219
+ painter.polyline(runs[0], pen);
220
+ } else {
221
+ painter.strokeRuns(runs, pen);
222
+ }
223
+ }
224
+ for (const edge of edges) {
225
+ for (const marker of edge.markers) {
226
+ if (marker.filled) {
227
+ painter.polygon(marker.points, { fill: marker.color });
228
+ } else {
229
+ painter.strokeRuns([marker.points], {
230
+ stroke: marker.color,
231
+ lineWidth: marker.lineWidth,
232
+ });
233
+ }
234
+ }
235
+ }
236
+ }
237
+
238
+ function paintInk(
239
+ painter: FlowPainter,
240
+ ink: readonly (SceneText | SceneRule)[],
241
+ ): void {
242
+ for (const item of ink) {
243
+ if (item.kind === 'text') paintText(painter, item);
244
+ else {
245
+ painter.strokeRuns([item.points], {
246
+ stroke: item.color,
247
+ lineWidth: item.lineWidth,
248
+ });
249
+ }
250
+ }
251
+ }
252
+
253
+ /** One node — card, ink, handles, grips — as the scene paints it; the
254
+ * scene is read for its zoom and palette only. */
255
+ export function paintNodeItem(
256
+ painter: FlowPainter,
257
+ item: SceneNodeItem,
258
+ scene: Pick<FlowScene, 'viewport' | 'palette'>,
259
+ ): void {
260
+ paintNode(painter, item, scene as FlowScene);
261
+ }
262
+
263
+ function paintNode(
264
+ painter: FlowPainter,
265
+ item: SceneNodeItem,
266
+ scene: FlowScene,
267
+ ): void {
268
+ if (item.custom) {
269
+ // Never batched: a type that draws its own body is drawing whatever it
270
+ // likes, in an order only it knows.
271
+ item.custom.type.paint!({
272
+ node: item.custom.node,
273
+ rect: item.rect,
274
+ zoom: scene.viewport.zoom,
275
+ selected: item.selected,
276
+ hovered: item.hovered,
277
+ palette: scene.palette,
278
+ painter,
279
+ handles: item.custom.anchors,
280
+ });
281
+ } else if (item.card) {
282
+ paintRect(painter, item.card.shape);
283
+ if (item.card.accent) paintRect(painter, item.card.accent);
284
+ paintInk(painter, item.ink);
285
+ }
286
+
287
+ // Handles are drawn one disc at a time, and that is the measured answer
288
+ // rather than the obvious one. Batching them into a single path halved the
289
+ // requests and made the frame *slower*: a path's mask is its bounding box,
290
+ // so forty dots scattered across the pane rasterize to a paneful of mask —
291
+ // three quarters of a megabyte — where forty small ones cost a kilobyte
292
+ // each. Batching pays for the edges because an edge already spans that
293
+ // box; it does not pay for anything small and scattered.
294
+ for (const handle of item.handles) {
295
+ painter.circle(handle.at.x, handle.at.y, handle.radius, {
296
+ fill: handle.fill,
297
+ stroke: handle.stroke,
298
+ lineWidth: handle.lineWidth,
299
+ });
300
+ if (handle.label) paintText(painter, handle.label);
301
+ }
302
+ for (const grip of item.grips) paintRect(painter, grip);
303
+ }
304
+
305
+ /** The runs a grid variant is made of, when there is no faster path.
306
+ * `mark` is a mark's size on screen — the scene's is in graph units. */
307
+ function gridRuns(
308
+ grid: SceneGrid,
309
+ mark: number,
310
+ ): {
311
+ runs: XYPosition[][];
312
+ dots: XYPosition[];
313
+ } {
314
+ const { step, origin, region: r, variant } = grid;
315
+ // Alignment stays anchored to the viewport origin, so the region never
316
+ // changes where a dot falls.
317
+ const firstX = origin.x + Math.ceil((r.x - origin.x) / step) * step;
318
+ const firstY = origin.y + Math.ceil((r.y - origin.y) / step) * step;
319
+ const runs: XYPosition[][] = [];
320
+ const dots: XYPosition[] = [];
321
+
322
+ if (variant === 'lines') {
323
+ for (let gx = firstX; gx <= r.x + r.width; gx += step) {
324
+ runs.push([
325
+ { x: gx, y: r.y },
326
+ { x: gx, y: r.y + r.height },
327
+ ]);
328
+ }
329
+ for (let gy = firstY; gy <= r.y + r.height; gy += step) {
330
+ runs.push([
331
+ { x: r.x, y: gy },
332
+ { x: r.x + r.width, y: gy },
333
+ ]);
334
+ }
335
+ return { runs, dots };
336
+ }
337
+
338
+ if (variant === 'cross') {
339
+ const arm = Math.max(2, mark * 3);
340
+ for (let gx = firstX; gx <= r.x + r.width; gx += step) {
341
+ for (let gy = firstY; gy <= r.y + r.height; gy += step) {
342
+ runs.push([
343
+ { x: gx - arm, y: gy },
344
+ { x: gx + arm, y: gy },
345
+ ]);
346
+ runs.push([
347
+ { x: gx, y: gy - arm },
348
+ { x: gx, y: gy + arm },
349
+ ]);
350
+ }
351
+ }
352
+ return { runs, dots };
353
+ }
354
+
355
+ for (let gx = firstX; gx <= r.x + r.width; gx += step) {
356
+ for (let gy = firstY; gy <= r.y + r.height; gy += step) {
357
+ dots.push({ x: gx, y: gy });
358
+ }
359
+ }
360
+ return { runs, dots };
361
+ }
362
+
363
+ /** The grid, the slow and universal way. A mark's size arrives in graph
364
+ * units, so it is sized against the same zoom the pitch was. */
365
+ export function paintGrid(
366
+ painter: FlowPainter,
367
+ grid: SceneGrid,
368
+ zoom: number,
369
+ ): void {
370
+ const { runs, dots } = gridRuns(grid, grid.size * zoom);
371
+ if (runs.length > 0) {
372
+ painter.strokeRuns(runs, { stroke: grid.color, lineWidth: 1 });
373
+ }
374
+ if (dots.length > 0) {
375
+ painter.dots(
376
+ dots,
377
+ Math.max(1, Math.round(grid.size * 2 * zoom)),
378
+ grid.color,
379
+ );
380
+ }
381
+ }
382
+
383
+ /**
384
+ * Draw a scene.
385
+ *
386
+ * `grid` is the element's accelerated grid painter, if it has one: it
387
+ * answers false when it could not, and the runs path takes over.
388
+ */
389
+ export function paintScene(
390
+ painter: FlowPainter,
391
+ scene: FlowScene,
392
+ grid?: GridPainter,
393
+ ): void {
394
+ if (!scene.region) return;
395
+ paintGround(painter, scene, grid);
396
+ paintGraph(painter, scene);
397
+ paintFloat(painter, scene);
398
+ }
399
+
400
+ /** Under the graph, pinned to the pane: the background and the grid. */
401
+ export function paintGround(
402
+ painter: FlowPainter,
403
+ scene: FlowScene,
404
+ grid?: GridPainter,
405
+ ): void {
406
+ if (scene.background) paintRect(painter, scene.background);
407
+ if (scene.grid && !(grid?.(painter, scene.grid) ?? false)) {
408
+ paintGrid(painter, scene.grid, scene.viewport.zoom);
409
+ }
410
+ }
411
+
412
+ /** The graph: edges, nodes, and the line a connection gesture draws. What
413
+ * a 2D zoom gesture composites scaled from one paint of it. */
414
+ export function paintGraph(painter: FlowPainter, scene: FlowScene): void {
415
+ paintGraphEdges(painter, scene);
416
+ paintGraphNodes(painter, scene);
417
+ }
418
+
419
+ /** The graph's edges alone: the first half of `paintGraph`, which a drag's
420
+ * pictures take apart so the dragged node's edges go between them. */
421
+ export function paintGraphEdges(painter: FlowPainter, scene: FlowScene): void {
422
+ paintEdges(painter, scene.edges, scene.batch);
423
+ }
424
+
425
+ /** The graph's nodes, and the connection line over them: the second half. */
426
+ export function paintGraphNodes(painter: FlowPainter, scene: FlowScene): void {
427
+ for (const item of scene.nodes) paintNode(painter, item, scene);
428
+ if (scene.connection) {
429
+ painter.polyline(scene.connection.points, {
430
+ stroke: scene.connection.stroke,
431
+ lineWidth: scene.connection.lineWidth,
432
+ dash: scene.connection.dash,
433
+ });
434
+ const tip = scene.connection.tip;
435
+ painter.circle(tip.at.x, tip.at.y, tip.radius, { fill: tip.fill });
436
+ }
437
+ }
438
+
439
+ /** Over the graph, pinned to the pane: the selection box and the panels. */
440
+ export function paintFloat(painter: FlowPainter, scene: FlowScene): void {
441
+ if (scene.selection) paintRect(painter, scene.selection);
442
+ paintPanels(painter, scene);
443
+ }
444
+
445
+ /** The panels that float over the graph — the minimap and the controls —
446
+ * alone: the last of a scene's paint, and what `<Flow>` paints on its own
447
+ * canvases over mounted bodies (`FlowGraphNode.paintPanels`). */
448
+ export function paintPanels(
449
+ painter: FlowPainter,
450
+ scene: Pick<FlowScene, 'miniMap' | 'controls'>,
451
+ ): void {
452
+ if (scene.miniMap) {
453
+ const map = scene.miniMap;
454
+ paintRect(painter, map.panel);
455
+ painter.save();
456
+ painter.clipRect(
457
+ map.panel.rect.x,
458
+ map.panel.rect.y,
459
+ map.panel.rect.width,
460
+ map.panel.rect.height,
461
+ 4,
462
+ );
463
+ // A run of square, unstroked nodes of one colour is one path and one
464
+ // fill — every node of a graph's minimap is usually one run, and a call
465
+ // apiece was 400 of them on every repaint of a drag. The scene says
466
+ // which run a node is in, worked out over the whole graph, so a pass
467
+ // that kept a few of a run fills them as the whole run's path does.
468
+ const nodes = map.nodes;
469
+ for (let i = 0; i < nodes.length;) {
470
+ const first = nodes[i];
471
+ let end = i + 1;
472
+ while (end < nodes.length && nodes[end].run === first.run) end++;
473
+ if (first.batched) {
474
+ const shapes: XYPosition[][] = [];
475
+ for (let k = i; k < end; k++) {
476
+ const { x, y, width, height } = nodes[k].rect;
477
+ shapes.push([
478
+ { x, y },
479
+ { x: x + width, y },
480
+ { x: x + width, y: y + height },
481
+ { x, y: y + height },
482
+ ]);
483
+ }
484
+ painter.polygons(shapes, { fill: first.fill });
485
+ } else {
486
+ paintRect(painter, first);
487
+ }
488
+ i = end;
489
+ }
490
+ paintRect(painter, map.view);
491
+ painter.restore();
492
+ }
493
+
494
+ if (scene.controls) {
495
+ paintRect(painter, scene.controls.panel);
496
+ for (const rule of scene.controls.rules) {
497
+ painter.strokeRuns([rule.points], {
498
+ stroke: rule.color,
499
+ lineWidth: rule.lineWidth,
500
+ });
501
+ }
502
+ // One path per button rather than one for the panel: a button's marks
503
+ // share a tiny mask, and the panel's would span every button.
504
+ for (const glyph of scene.controls.glyphs) {
505
+ painter.strokeRuns(glyph.runs, {
506
+ stroke: glyph.color,
507
+ lineWidth: glyph.lineWidth,
508
+ });
509
+ }
510
+ }
511
+ }
package/src/flow/paths.ts CHANGED
@@ -5,8 +5,11 @@
5
5
  // representation means one implementation of each rather than four;
6
6
  // - ntk's `bezierCurveTo` flattens to segments anyway, so sampling costs
7
7
  // nothing a curve was not already paying;
8
- // - the sample count comes off the on-screen length, so a curve is as
9
- // smooth as the zoom can show and no smoother.
8
+ // - the sample count comes off the curve's on-screen **shape** (Wang's
9
+ // formula, `segmentsFor`): enough that no chord strays more than
10
+ // `tolerance` screen pixels from the true curve, so a curve is as smooth
11
+ // as the zoom can show and no smoother — a gentle one gets a few
12
+ // segments, a tight bend zoomed in gets hundreds.
10
13
  //
11
14
  // Everything here works in whatever space its inputs are in. The pane builds
12
15
  // paths in **screen** space, so the pixel-shaped constants it passes in
@@ -31,6 +34,35 @@ export interface PathOptions {
31
34
  /** Both ends are on the same node: route a loop rather than a line back
32
35
  * on itself. */
33
36
  loop?: boolean;
37
+ /** How far, in the endpoints' units, a chord may stray from the curve it
38
+ * stands for. {@link CURVE_TOLERANCE} when left out. */
39
+ tolerance?: number;
40
+ }
41
+
42
+ /**
43
+ * A fifth of a screen pixel: under a device pixel at a display scale of 2,
44
+ * so a curve's chords are invisible at any zoom. The count was a fixed
45
+ * `clamp(length / 6, 8, 48)` before — 48 chords of 10–20 px each for a
46
+ * curve across a zoomed-in pane, and no more samples in a tight bend than
47
+ * along a straight run, which is what a faceted S-bend looked like.
48
+ */
49
+ export const CURVE_TOLERANCE = 0.2;
50
+
51
+ /** Segments past this many are not worth their vertices whatever the
52
+ * formula says — a curve thousands of pixels long, most of it off screen. */
53
+ const MAX_SEGMENTS = 512;
54
+
55
+ /**
56
+ * Wang's formula: the fewest uniform-t segments that keep a degree-`degree`
57
+ * Bézier within `tolerance` of its chords. `m` is the largest second
58
+ * difference of the control points — how hard the curve bends, in the
59
+ * curve's own units — so it answers for shape and for zoom at once.
60
+ */
61
+ function segmentsFor(m: number, degree: number, tolerance: number): number {
62
+ const n = Math.ceil(
63
+ Math.sqrt((degree * (degree - 1) * m) / (8 * Math.max(tolerance, 1e-3))),
64
+ );
65
+ return Math.max(1, Math.min(MAX_SEGMENTS, n));
34
66
  }
35
67
 
36
68
  const BEZIER_CURVATURE = 0.25;
@@ -94,6 +126,16 @@ function shoulder(distance: number, scale: number): number {
94
126
  return BEZIER_CURVATURE * 25 * Math.sqrt(scale * -distance);
95
127
  }
96
128
 
129
+ /** A `'bezier'` edge's two control points — the curve `edgePath` samples,
130
+ * exported so a test can hold the samples to the curve itself. */
131
+ export function bezierControls(
132
+ source: PathEnd,
133
+ target: PathEnd,
134
+ scale: number,
135
+ ): [XYPosition, XYPosition] {
136
+ return [control(source, target, scale), control(target, source, scale)];
137
+ }
138
+
97
139
  function control(end: PathEnd, other: XYPosition, scale: number): XYPosition {
98
140
  switch (end.position) {
99
141
  case 'left':
@@ -112,14 +154,13 @@ function sampleCubic(
112
154
  c0: XYPosition,
113
155
  c1: XYPosition,
114
156
  p1: XYPosition,
157
+ tolerance: number,
115
158
  ): XYPosition[] {
116
- // The control polygon bounds the curve's length, so it is a cheap and
117
- // always-sufficient basis for how finely to sample it.
118
- const rough =
119
- Math.hypot(c0.x - p0.x, c0.y - p0.y) +
120
- Math.hypot(c1.x - c0.x, c1.y - c0.y) +
121
- Math.hypot(p1.x - c1.x, p1.y - c1.y);
122
- const steps = Math.max(8, Math.min(48, Math.round(rough / 6)));
159
+ const m = Math.max(
160
+ Math.hypot(p0.x - 2 * c0.x + c1.x, p0.y - 2 * c0.y + c1.y),
161
+ Math.hypot(c0.x - 2 * c1.x + p1.x, c0.y - 2 * c1.y + p1.y),
162
+ );
163
+ const steps = segmentsFor(m, 3, tolerance);
123
164
  const points: XYPosition[] = [];
124
165
  for (let i = 0; i <= steps; i++) {
125
166
  const t = i / steps;
@@ -189,6 +230,7 @@ function stepPoints(
189
230
  function roundCorners(
190
231
  points: readonly XYPosition[],
191
232
  radius: number,
233
+ tolerance: number,
192
234
  ): XYPosition[] {
193
235
  if (points.length < 3 || radius <= 0) return points as XYPosition[];
194
236
  const out: XYPosition[] = [points[0]];
@@ -213,7 +255,14 @@ function roundCorners(
213
255
  x: corner.x + ((next.x - corner.x) / outLen) * r,
214
256
  y: corner.y + ((next.y - corner.y) / outLen) * r,
215
257
  };
216
- out.push(start, ...sampleQuadratic(start, corner, end, 5));
258
+ const m = Math.hypot(
259
+ start.x - 2 * corner.x + end.x,
260
+ start.y - 2 * corner.y + end.y,
261
+ );
262
+ out.push(
263
+ start,
264
+ ...sampleQuadratic(start, corner, end, segmentsFor(m, 2, tolerance)),
265
+ );
217
266
  }
218
267
  out.push(points[points.length - 1]);
219
268
  return dedupe(out);
@@ -226,6 +275,7 @@ function loopPoints(
226
275
  source: PathEnd,
227
276
  target: PathEnd,
228
277
  offset: number,
278
+ tolerance: number,
229
279
  ): XYPosition[] {
230
280
  const sd = handleDirection(source.position);
231
281
  const td = handleDirection(target.position);
@@ -238,7 +288,7 @@ function loopPoints(
238
288
  x: target.x + td.x * reach + td.y * reach * 0.7,
239
289
  y: target.y + td.y * reach - td.x * reach * 0.7,
240
290
  };
241
- return dedupe(sampleCubic(source, c0, c1, target));
291
+ return dedupe(sampleCubic(source, c0, c1, target, tolerance));
242
292
  }
243
293
 
244
294
  /** The polyline for one edge. */
@@ -248,7 +298,14 @@ export function edgePath(
248
298
  target: PathEnd,
249
299
  options: PathOptions,
250
300
  ): XYPosition[] {
251
- if (options.loop) return loopPoints(source, target, options.stepOffset);
301
+ if (options.loop) {
302
+ return loopPoints(
303
+ source,
304
+ target,
305
+ options.stepOffset,
306
+ options.tolerance ?? CURVE_TOLERANCE,
307
+ );
308
+ }
252
309
  switch (type) {
253
310
  case 'straight':
254
311
  return dedupe([
@@ -261,11 +318,19 @@ export function edgePath(
261
318
  return roundCorners(
262
319
  stepPoints(source, target, options.stepOffset),
263
320
  options.radius,
321
+ options.tolerance ?? CURVE_TOLERANCE,
264
322
  );
265
323
  default: {
266
- const c0 = control(source, target, options.scale);
267
- const c1 = control(target, source, options.scale);
268
- return dedupe(sampleCubic(source, c0, c1, target));
324
+ const [c0, c1] = bezierControls(source, target, options.scale);
325
+ return dedupe(
326
+ sampleCubic(
327
+ source,
328
+ c0,
329
+ c1,
330
+ target,
331
+ options.tolerance ?? CURVE_TOLERANCE,
332
+ ),
333
+ );
269
334
  }
270
335
  }
271
336
  }