@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
@@ -0,0 +1,679 @@
1
+ // A frame, drawn. Owns the programs, two layers of instance buffers and the
2
+ // order of the frame — and nothing about the graph, which is `../scene.ts`'s,
3
+ // or about what to draw, which is `./pack.ts`'s.
4
+ //
5
+ // The two layers are the whole of the optimisation that makes a pan cheap.
6
+ // The **world** — edges, heads, chips, nodes — is packed and uploaded only
7
+ // when the element says it changed, and drawn wherever `offset` puts it; a
8
+ // pan changes the offset and nothing else, so its frame is a few uniforms and
9
+ // a handful of draw calls over buffers already on the GPU. The **overlay** —
10
+ // the background, the grid, the selection, the minimap and the controls — is
11
+ // pinned to the pane, is a few dozen boxes, and is packed every frame.
12
+ import type { FlowFrameStats, FlowRect, XYPosition } from '../types.js';
13
+ import type { FlowScene } from '../scene.js';
14
+ import { BOX_STRIDE, LINE_STRIDE, ScenePacker, TRI_STRIDE } from './pack.js';
15
+ import type {
16
+ DrawRange,
17
+ PackedScene,
18
+ PackLayer,
19
+ DrawnLabel,
20
+ TextResolver,
21
+ WaitingLabel,
22
+ } from './pack.js';
23
+ import type { LabelAtlas } from './text.js';
24
+ import {
25
+ ATTRIBUTES,
26
+ BOX_FRAGMENT,
27
+ BOX_VERTEX,
28
+ GRID_FRAGMENT,
29
+ GRID_VERTEX,
30
+ LINE_FRAGMENT,
31
+ LINE_VERTEX,
32
+ linkProgram,
33
+ TRI_FRAGMENT,
34
+ TRI_VERTEX,
35
+ } from './shaders.js';
36
+ import type { GL, Program } from './shaders.js';
37
+ import { ColorCache } from './color.js';
38
+
39
+ /** One frame's drawing, counted; `<Flow>` adds the scene's share. */
40
+ export type FlowGlDrawStats = Omit<
41
+ FlowFrameStats,
42
+ 'sceneMs' | 'renderer' | 'bodies'
43
+ >;
44
+
45
+ /** Where the surface sits and how big it is: the pane's content box in
46
+ * logical window pixels, and the surface in device pixels. */
47
+ export interface FlowGlTarget {
48
+ origin: XYPosition;
49
+ scale: number;
50
+ width: number;
51
+ height: number;
52
+ }
53
+
54
+ /** What the element hands the renderer for one frame. */
55
+ export interface FlowGlFrame {
56
+ /** The graph, when it changed since the last frame — null to draw the one
57
+ * already on the GPU where `offset` now puts it. */
58
+ world: FlowScene | null;
59
+ /** Where the world's pinned origin lands in the window, in logical
60
+ * pixels: the pane's origin plus the viewport's translation. */
61
+ offset: XYPosition;
62
+ /** How much the world on the GPU is magnified: the view's zoom over the
63
+ * zoom it was built at. 1 — or absent — except while a zoom gesture
64
+ * moves, when the world is drawn scaled rather than rebuilt a step. */
65
+ zoom?: number;
66
+ /** The pane's furniture, every frame. */
67
+ overlay: FlowScene;
68
+ /** How far a marching dash has moved, in the world's logical pixels — a
69
+ * uniform, so the dash timer's tick redraws without a rebuild. */
70
+ phase: number;
71
+ /** A zoom gesture is moving: a stream of zoom steps, not a single one —
72
+ * what the label atlas holds new strings back for. */
73
+ moving?: boolean;
74
+ /**
75
+ * The nodes a drag is moving and their edges, lifted out of the world —
76
+ * which is built without them while they move — and packed on their own
77
+ * when they changed: absent to draw the ones already on the GPU, null for
78
+ * none. A drag step packs a card or two and their edges, where it packed
79
+ * the whole world: 3-4 ms a step at 2,000 nodes. Drawn in two halves, its
80
+ * edges under every card and its cards over them, as the painter orders
81
+ * a dragged node.
82
+ */
83
+ lifted?: FlowScene | null;
84
+ }
85
+
86
+ const UNIFORMS = [
87
+ 'u_origin',
88
+ 'u_offset',
89
+ 'u_scale',
90
+ 'u_zoom',
91
+ 'u_viewport',
92
+ ] as const;
93
+
94
+ /** The clock, through `globalThis`: `src/` compiles with `types: []`. */
95
+ const globals = globalThis as { performance?: { now(): number } };
96
+ export const now = (): number => globals.performance?.now() ?? Date.now();
97
+
98
+ const ZERO: XYPosition = { x: 0, y: 0 };
99
+
100
+ /** One layer: a packer, the three buffers its streams go into, and what it
101
+ * last packed. */
102
+ class Layer {
103
+ readonly packer = new ScenePacker();
104
+ readonly lines: unknown;
105
+ readonly boxes: unknown;
106
+ readonly tris: unknown;
107
+ packed: PackedScene | null = null;
108
+ scene: FlowScene | null = null;
109
+ /** Labels packed before their fields landed, not yet written in, and the
110
+ * atlas's generation they were last checked against. */
111
+ waiting: WaitingLabel[] = [];
112
+ checked = -1;
113
+ /** Labels drawn from their fields, and the atlas's count of dropped
114
+ * fields they were last checked against. */
115
+ drawn: DrawnLabel[] = [];
116
+ moved = -1;
117
+
118
+ constructor(private readonly gl: GL) {
119
+ this.lines = gl.createBuffer();
120
+ this.boxes = gl.createBuffer();
121
+ this.tris = gl.createBuffer();
122
+ }
123
+
124
+ /** Pack and upload; answers the bytes sent. Orphaning with `bufferData`
125
+ * rather than `bufferSubData`: the driver hands back fresh storage
126
+ * instead of waiting for the last frame's draws to finish reading the
127
+ * old. */
128
+ update(scene: FlowScene, layer: PackLayer, text?: TextResolver): number {
129
+ const gl = this.gl;
130
+ const packed = this.packer.pack(scene, layer, text);
131
+ this.packed = packed;
132
+ this.scene = scene;
133
+ this.waiting = packed.waiting;
134
+ this.checked = -1;
135
+ this.drawn = packed.drawn;
136
+ this.moved = -1;
137
+ let bytes = 0;
138
+ const put = (buf: unknown, data: Float32Array, used: number): void => {
139
+ if (used === 0) return;
140
+ const view = data.subarray(0, used);
141
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf);
142
+ gl.bufferData(gl.ARRAY_BUFFER, view, gl.DYNAMIC_DRAW);
143
+ bytes += view.byteLength;
144
+ };
145
+ put(this.lines, packed.lines, packed.lineCount * LINE_STRIDE);
146
+ put(this.boxes, packed.boxes, packed.boxCount * BOX_STRIDE);
147
+ put(this.tris, packed.tris, packed.triCount * TRI_STRIDE);
148
+ return bytes;
149
+ }
150
+
151
+ /** The box stream again, whole — orphaned as `update` does, so no draw
152
+ * of the last frame is waited for. Answers the bytes sent. */
153
+ uploadBoxes(): number {
154
+ const packed = this.packed;
155
+ if (!packed || packed.boxCount === 0) return 0;
156
+ const gl = this.gl;
157
+ const view = packed.boxes.subarray(0, packed.boxCount * BOX_STRIDE);
158
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.boxes);
159
+ gl.bufferData(gl.ARRAY_BUFFER, view, gl.DYNAMIC_DRAW);
160
+ return view.byteLength;
161
+ }
162
+
163
+ /** Nothing to draw, until the next `update`. */
164
+ clear(): void {
165
+ this.packed = null;
166
+ this.scene = null;
167
+ this.waiting = [];
168
+ this.drawn = [];
169
+ this.checked = -1;
170
+ this.moved = -1;
171
+ }
172
+
173
+ dispose(): void {
174
+ for (const buffer of [this.lines, this.boxes, this.tris]) {
175
+ this.gl.deleteBuffer(buffer);
176
+ }
177
+ }
178
+ }
179
+
180
+ export class FlowGlRenderer {
181
+ private readonly gl: GL;
182
+ private readonly line: Program;
183
+ private readonly box: Program;
184
+ private readonly tri: Program;
185
+ private readonly grid: Program;
186
+ private readonly vao: unknown;
187
+ private readonly quad: unknown;
188
+ private readonly world: Layer;
189
+ private readonly lifted: Layer;
190
+ private readonly overlay: Layer;
191
+ private readonly colors = new ColorCache();
192
+ /** Whether this context has had the atlas's texture made in it — a new
193
+ * renderer is a new context, into which every raster is uploaded again. */
194
+ private atlasBound = false;
195
+
196
+ constructor(gl: GL) {
197
+ this.gl = gl;
198
+ this.line = linkProgram(gl, LINE_VERTEX, LINE_FRAGMENT, [
199
+ ...UNIFORMS,
200
+ 'u_phase',
201
+ ]);
202
+ this.box = linkProgram(gl, BOX_VERTEX, BOX_FRAGMENT, [
203
+ ...UNIFORMS,
204
+ 'u_atlas',
205
+ 'u_spread',
206
+ ]);
207
+ // the label atlas is always on unit 0
208
+ gl.useProgram(this.box.program);
209
+ gl.uniform1i(this.box.uniforms.u_atlas, 0);
210
+ this.tri = linkProgram(gl, TRI_VERTEX, TRI_FRAGMENT, UNIFORMS);
211
+ this.grid = linkProgram(gl, GRID_VERTEX, GRID_FRAGMENT, [
212
+ ...UNIFORMS,
213
+ 'u_grid',
214
+ 'u_mark',
215
+ 'u_color',
216
+ ]);
217
+ // A core profile draws nothing with no vertex array bound. One is enough:
218
+ // every range re-points the attributes at its own offset anyway, because
219
+ // GLSL ES 1.00 has no base instance to do it for us.
220
+ this.vao = gl.createVertexArray();
221
+ gl.bindVertexArray(this.vao);
222
+ this.quad = gl.createBuffer();
223
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.quad);
224
+ gl.bufferData(
225
+ gl.ARRAY_BUFFER,
226
+ new Float32Array([0, -1, 1, -1, 0, 1, 1, 1]),
227
+ gl.STATIC_DRAW,
228
+ );
229
+ this.world = new Layer(gl);
230
+ this.lifted = new Layer(gl);
231
+ this.overlay = new Layer(gl);
232
+ }
233
+
234
+ /** A whole scene, in one layer, at no offset — what a test or a one-off
235
+ * render wants, and the same drawing the two-layer frame composes. */
236
+ draw(
237
+ scene: FlowScene,
238
+ target: FlowGlTarget,
239
+ atlas?: LabelAtlas,
240
+ ): FlowGlDrawStats {
241
+ const packStart = now();
242
+ const bytes = this.overlay.update(
243
+ scene,
244
+ 'all',
245
+ atlas ? (t) => atlas.quad(t) : undefined,
246
+ );
247
+ const drawStart = now();
248
+ this.begin(target, atlas);
249
+ const packed = this.overlay.packed!;
250
+ // Every marching edge in one scene has the same phase baked in.
251
+ const phase = scene.edges.find((e) => e.animated)?.dashOffset ?? 0;
252
+ const calls = this.ranges(
253
+ packed.ranges,
254
+ this.overlay,
255
+ scene,
256
+ ZERO,
257
+ 1,
258
+ phase,
259
+ target,
260
+ );
261
+ this.gl.disable(this.gl.SCISSOR_TEST);
262
+ return this.stats(packStart, drawStart, bytes, calls, [packed], false);
263
+ }
264
+
265
+ /** One frame: the overlay under the world, the world at its offset, the
266
+ * overlay over it. */
267
+ drawFrame(
268
+ frame: FlowGlFrame,
269
+ target: FlowGlTarget,
270
+ atlas?: LabelAtlas,
271
+ ): FlowGlDrawStats {
272
+ const packStart = now();
273
+ let bytes = 0;
274
+ const rebuilt = frame.world != null;
275
+ if (frame.world) {
276
+ atlas?.beginPack();
277
+ bytes += this.world.update(
278
+ frame.world,
279
+ 'world',
280
+ atlas ? (t) => atlas.quad(t) : undefined,
281
+ );
282
+ }
283
+ if (frame.lifted) {
284
+ bytes += this.lifted.update(
285
+ frame.lifted,
286
+ 'world',
287
+ atlas ? (t) => atlas.quad(t, true) : undefined,
288
+ );
289
+ } else if (frame.lifted === null) {
290
+ this.lifted.clear();
291
+ }
292
+ bytes += this.overlay.update(frame.overlay, 'overlay');
293
+ if (atlas) {
294
+ bytes += this.landLabels(this.world, atlas);
295
+ bytes += this.landLabels(this.lifted, atlas, true);
296
+ }
297
+ const drawStart = now();
298
+
299
+ this.begin(target, atlas);
300
+ const over = this.overlay.packed!;
301
+ let calls = this.ranges(
302
+ over.ranges.slice(0, over.split),
303
+ this.overlay,
304
+ frame.overlay,
305
+ ZERO,
306
+ 1,
307
+ 0,
308
+ target,
309
+ );
310
+ // The world's edges, the lifted edges, the world's cards, the lifted
311
+ // cards: a dragged node's edges go under every card, and it over them.
312
+ const world = this.world.packed;
313
+ const lifted = this.lifted.packed;
314
+ const half = (layer: Layer, first: boolean): void => {
315
+ const packed = layer.packed;
316
+ if (!packed || !layer.scene) return;
317
+ calls += this.ranges(
318
+ first
319
+ ? packed.ranges.slice(0, packed.nodesAt)
320
+ : packed.ranges.slice(packed.nodesAt),
321
+ layer,
322
+ layer.scene,
323
+ frame.offset,
324
+ frame.zoom ?? 1,
325
+ frame.phase,
326
+ target,
327
+ );
328
+ };
329
+ half(this.world, true);
330
+ half(this.lifted, true);
331
+ half(this.world, false);
332
+ half(this.lifted, false);
333
+ calls += this.ranges(
334
+ over.ranges.slice(over.split),
335
+ this.overlay,
336
+ frame.overlay,
337
+ ZERO,
338
+ 1,
339
+ 0,
340
+ target,
341
+ );
342
+ this.gl.disable(this.gl.SCISSOR_TEST);
343
+ const packs = [world, lifted, over].filter((p) => p != null);
344
+ return this.stats(packStart, drawStart, bytes, calls, packs, rebuilt);
345
+ }
346
+
347
+ /**
348
+ * The labels of a layer packed before their fields existed, drawn from
349
+ * them now they have landed: the flag, the place in the atlas and the
350
+ * quad written into each box, and the stream uploaded again.
351
+ * A label arriving used to be the world packed again once everything on
352
+ * screen had its field — every label at once, after all of them — and is
353
+ * now a few floats and one upload, as each lands. Answers the bytes sent.
354
+ *
355
+ * First, the other way: a label whose field the atlas dropped for one
356
+ * nearer the view — or set again somewhere else — is drawn as nothing
357
+ * and waits again, its field wanted from where it is. Only a full atlas
358
+ * drops anything, so a graph under the limit never walks this list.
359
+ */
360
+ private landLabels(layer: Layer, atlas: LabelAtlas, lifted = false): number {
361
+ const packed = layer.packed;
362
+ if (!packed) return 0;
363
+ const d = packed.boxes;
364
+ let lost = 0;
365
+ if (layer.moved !== atlas.moves) {
366
+ layer.moved = atlas.moves;
367
+ const kept: DrawnLabel[] = [];
368
+ for (const l of layer.drawn) {
369
+ if (atlas.slotOf(l.key) === l.slot) {
370
+ kept.push(l);
371
+ continue;
372
+ }
373
+ d[l.index * BOX_STRIDE + 6] = 2;
374
+ layer.waiting.push({ index: l.index, key: l.key, text: l.text });
375
+ atlas.want(l.key, l.text);
376
+ lost++;
377
+ }
378
+ if (lost > 0) {
379
+ layer.drawn = kept;
380
+ packed.gaps.text += lost;
381
+ layer.checked = -1;
382
+ }
383
+ }
384
+ if (layer.waiting.length === 0 || layer.checked === atlas.generation) {
385
+ return lost > 0 ? layer.uploadBoxes() : 0;
386
+ }
387
+ layer.checked = atlas.generation;
388
+ const still: WaitingLabel[] = [];
389
+ let landed = 0;
390
+ for (const w of layer.waiting) {
391
+ const q = atlas.landing(w.key, w.text, lifted);
392
+ if (!q) {
393
+ still.push(w);
394
+ continue;
395
+ }
396
+ layer.drawn.push({
397
+ index: w.index,
398
+ key: q.key,
399
+ text: w.text,
400
+ slot: q.slot,
401
+ });
402
+ // the whole quad: one the pack did not measure was a box of no size
403
+ const at = w.index * BOX_STRIDE;
404
+ d[at] = q.x;
405
+ d[at + 1] = q.y;
406
+ d[at + 2] = q.w;
407
+ d[at + 3] = q.h;
408
+ d[at + 4] = q.margin;
409
+ d[at + 5] = q.page;
410
+ d[at + 6] = 1;
411
+ d[at + 7] = q.texel;
412
+ d[at + 12] = q.u0;
413
+ d[at + 13] = q.v0;
414
+ d[at + 14] = q.u1;
415
+ d[at + 15] = q.v1;
416
+ landed++;
417
+ }
418
+ if (landed === 0) return lost > 0 ? layer.uploadBoxes() : 0;
419
+ layer.waiting = still;
420
+ packed.gaps.text -= landed;
421
+ return layer.uploadBoxes();
422
+ }
423
+
424
+ private stats(
425
+ packStart: number,
426
+ drawStart: number,
427
+ uploadBytes: number,
428
+ drawCalls: number,
429
+ packs: readonly PackedScene[],
430
+ worldRebuilt: boolean,
431
+ ): FlowGlDrawStats {
432
+ let lines = 0;
433
+ let boxes = 0;
434
+ let triangles = 0;
435
+ const gaps = { text: 0, custom: 0 };
436
+ for (const p of packs) {
437
+ lines += p.lineCount;
438
+ boxes += p.boxCount;
439
+ triangles += p.triCount / 3;
440
+ gaps.text += p.gaps.text;
441
+ gaps.custom += p.gaps.custom;
442
+ }
443
+ return {
444
+ packMs: drawStart - packStart,
445
+ drawMs: now() - drawStart,
446
+ drawCalls,
447
+ lines,
448
+ boxes,
449
+ triangles,
450
+ uploadBytes,
451
+ worldRebuilt,
452
+ gaps,
453
+ };
454
+ }
455
+
456
+ private begin(target: FlowGlTarget, atlas?: LabelAtlas): void {
457
+ const gl = this.gl;
458
+ if (atlas) {
459
+ atlas.bind(gl, !this.atlasBound);
460
+ this.atlasBound = true;
461
+ // how many texels a field's values span, for the label ramp
462
+ gl.useProgram(this.box.program);
463
+ gl.uniform1f(this.box.uniforms.u_spread, atlas.pad);
464
+ }
465
+ gl.bindVertexArray(this.vao);
466
+ gl.viewport(0, 0, target.width, target.height);
467
+ gl.disable(gl.DEPTH_TEST);
468
+ gl.enable(gl.BLEND);
469
+ // premultiplied, which is what every colour `./color.ts` hands back is
470
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
471
+ }
472
+
473
+ private ranges(
474
+ ranges: readonly DrawRange[],
475
+ layer: Layer,
476
+ scene: FlowScene,
477
+ offset: XYPosition,
478
+ zoom: number,
479
+ phase: number,
480
+ target: FlowGlTarget,
481
+ ): number {
482
+ let calls = 0;
483
+ for (const range of ranges) {
484
+ this.scissor(range.scissor, target);
485
+ if (range.kind === 'grid') {
486
+ if (!scene.grid) continue;
487
+ this.drawGrid(scene, target);
488
+ } else if (range.kind === 'line') {
489
+ this.drawInstances(
490
+ this.line,
491
+ layer.lines,
492
+ LINE_STRIDE,
493
+ range,
494
+ offset,
495
+ zoom,
496
+ target,
497
+ phase,
498
+ );
499
+ } else if (range.kind === 'box') {
500
+ this.drawInstances(
501
+ this.box,
502
+ layer.boxes,
503
+ BOX_STRIDE,
504
+ range,
505
+ offset,
506
+ zoom,
507
+ target,
508
+ );
509
+ } else {
510
+ this.drawTriangles(layer.tris, range, offset, zoom, target);
511
+ }
512
+ calls++;
513
+ }
514
+ return calls;
515
+ }
516
+
517
+ private uniforms(
518
+ program: Program,
519
+ offset: XYPosition,
520
+ zoom: number,
521
+ target: FlowGlTarget,
522
+ ): void {
523
+ const gl = this.gl;
524
+ gl.useProgram(program.program);
525
+ gl.uniform2f(program.uniforms.u_origin, target.origin.x, target.origin.y);
526
+ gl.uniform2f(program.uniforms.u_offset, offset.x, offset.y);
527
+ gl.uniform1f(program.uniforms.u_scale, target.scale);
528
+ gl.uniform1f(program.uniforms.u_zoom, zoom);
529
+ gl.uniform2f(program.uniforms.u_viewport, target.width, target.height);
530
+ }
531
+
532
+ /** The quad's corners at location 0, stepping per vertex. */
533
+ private corners(): void {
534
+ const gl = this.gl;
535
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.quad);
536
+ gl.enableVertexAttribArray(ATTRIBUTES.a_corner);
537
+ gl.vertexAttribPointer(ATTRIBUTES.a_corner, 2, gl.FLOAT, false, 0, 0);
538
+ gl.vertexAttribDivisor(ATTRIBUTES.a_corner, 0);
539
+ }
540
+
541
+ private drawInstances(
542
+ program: Program,
543
+ buffer: unknown,
544
+ stride: number,
545
+ range: DrawRange,
546
+ offset: XYPosition,
547
+ zoom: number,
548
+ target: FlowGlTarget,
549
+ phase?: number,
550
+ ): void {
551
+ const gl = this.gl;
552
+ this.uniforms(program, offset, zoom, target);
553
+ // only the line program declares it, and only after `uniforms` has made
554
+ // that program current
555
+ if (phase !== undefined) gl.uniform1f(program.uniforms.u_phase, phase);
556
+ this.corners();
557
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
558
+ const bytes = stride * 4;
559
+ const base = range.first * bytes;
560
+ const slots = [
561
+ ATTRIBUTES.a_i0,
562
+ ATTRIBUTES.a_i1,
563
+ ATTRIBUTES.a_i2,
564
+ ATTRIBUTES.a_i3,
565
+ ];
566
+ slots.forEach((location, i) => {
567
+ gl.enableVertexAttribArray(location);
568
+ gl.vertexAttribPointer(
569
+ location,
570
+ 4,
571
+ gl.FLOAT,
572
+ false,
573
+ bytes,
574
+ base + i * 16,
575
+ );
576
+ gl.vertexAttribDivisor(location, 1);
577
+ });
578
+ gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, range.count);
579
+ }
580
+
581
+ private drawTriangles(
582
+ buffer: unknown,
583
+ range: DrawRange,
584
+ offset: XYPosition,
585
+ zoom: number,
586
+ target: FlowGlTarget,
587
+ ): void {
588
+ const gl = this.gl;
589
+ this.uniforms(this.tri, offset, zoom, target);
590
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
591
+ const bytes = TRI_STRIDE * 4;
592
+ // Per vertex, not per instance: a triangle is three records.
593
+ gl.enableVertexAttribArray(ATTRIBUTES.a_corner);
594
+ gl.vertexAttribPointer(ATTRIBUTES.a_corner, 2, gl.FLOAT, false, bytes, 0);
595
+ gl.vertexAttribDivisor(ATTRIBUTES.a_corner, 0);
596
+ gl.enableVertexAttribArray(ATTRIBUTES.a_i0);
597
+ gl.vertexAttribPointer(ATTRIBUTES.a_i0, 4, gl.FLOAT, false, bytes, 8);
598
+ gl.vertexAttribDivisor(ATTRIBUTES.a_i0, 0);
599
+ for (const location of [
600
+ ATTRIBUTES.a_i1,
601
+ ATTRIBUTES.a_i2,
602
+ ATTRIBUTES.a_i3,
603
+ ]) {
604
+ gl.disableVertexAttribArray(location);
605
+ }
606
+ gl.drawArrays(gl.TRIANGLES, range.first, range.count);
607
+ }
608
+
609
+ private drawGrid(scene: FlowScene, target: FlowGlTarget): void {
610
+ const gl = this.gl;
611
+ const grid = scene.grid!;
612
+ this.uniforms(this.grid, ZERO, 1, target);
613
+ this.corners();
614
+ for (const location of [
615
+ ATTRIBUTES.a_i0,
616
+ ATTRIBUTES.a_i1,
617
+ ATTRIBUTES.a_i2,
618
+ ATTRIBUTES.a_i3,
619
+ ]) {
620
+ gl.disableVertexAttribArray(location);
621
+ }
622
+ const zoom = scene.viewport.zoom;
623
+ const variant =
624
+ grid.variant === 'lines' ? 1 : grid.variant === 'cross' ? 2 : 0;
625
+ // A mark's on-screen size, the 2D path's own arithmetic: a dot is
626
+ // `size * 2 * zoom` across (at least a pixel) and a cross's arm
627
+ // `size * 3 * zoom` (at least two).
628
+ const mark =
629
+ variant === 0
630
+ ? Math.max(1, Math.round(grid.size * 2 * zoom))
631
+ : variant === 2
632
+ ? Math.max(2, grid.size * 3 * zoom)
633
+ : 1;
634
+ const color = this.colors.get(grid.color);
635
+ gl.uniform3f(
636
+ this.grid.uniforms.u_grid,
637
+ grid.origin.x,
638
+ grid.origin.y,
639
+ grid.step,
640
+ );
641
+ gl.uniform2f(this.grid.uniforms.u_mark, variant, mark);
642
+ gl.uniform4f(
643
+ this.grid.uniforms.u_color,
644
+ color[0],
645
+ color[1],
646
+ color[2],
647
+ color[3],
648
+ );
649
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
650
+ }
651
+
652
+ private scissor(rect: FlowRect | undefined, target: FlowGlTarget): void {
653
+ const gl = this.gl;
654
+ if (!rect) {
655
+ gl.disable(gl.SCISSOR_TEST);
656
+ return;
657
+ }
658
+ const s = target.scale;
659
+ const x = Math.floor((rect.x - target.origin.x) * s);
660
+ const y = Math.floor((rect.y - target.origin.y) * s);
661
+ const w = Math.ceil(rect.width * s);
662
+ const h = Math.ceil(rect.height * s);
663
+ gl.enable(gl.SCISSOR_TEST);
664
+ // GL's scissor counts up from the bottom; the scene counts down.
665
+ gl.scissor(x, target.height - (y + h), w, h);
666
+ }
667
+
668
+ dispose(): void {
669
+ const gl = this.gl;
670
+ gl.deleteBuffer(this.quad);
671
+ this.world.dispose();
672
+ this.lifted.dispose();
673
+ this.overlay.dispose();
674
+ for (const program of [this.line, this.box, this.tri, this.grid]) {
675
+ gl.deleteProgram(program.program);
676
+ }
677
+ gl.deleteVertexArray(this.vao);
678
+ }
679
+ }