@react-x11/components 0.9.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 (550) 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 +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/flow/draw.d.ts +50 -0
  49. package/dist/flow/draw.d.ts.map +1 -1
  50. package/dist/flow/draw.js +132 -33
  51. package/dist/flow/draw.js.map +1 -1
  52. package/dist/flow/gl/color.d.ts +13 -0
  53. package/dist/flow/gl/color.d.ts.map +1 -0
  54. package/dist/flow/gl/color.js +82 -0
  55. package/dist/flow/gl/color.js.map +1 -0
  56. package/dist/flow/gl/index.d.ts +60 -0
  57. package/dist/flow/gl/index.d.ts.map +1 -0
  58. package/dist/flow/gl/index.js +283 -0
  59. package/dist/flow/gl/index.js.map +1 -0
  60. package/dist/flow/gl/pack.d.ts +133 -0
  61. package/dist/flow/gl/pack.d.ts.map +1 -0
  62. package/dist/flow/gl/pack.js +408 -0
  63. package/dist/flow/gl/pack.js.map +1 -0
  64. package/dist/flow/gl/renderer.d.ts +95 -0
  65. package/dist/flow/gl/renderer.d.ts.map +1 -0
  66. package/dist/flow/gl/renderer.js +459 -0
  67. package/dist/flow/gl/renderer.js.map +1 -0
  68. package/dist/flow/gl/shaders.d.ts +79 -0
  69. package/dist/flow/gl/shaders.d.ts.map +1 -0
  70. package/dist/flow/gl/shaders.js +346 -0
  71. package/dist/flow/gl/shaders.js.map +1 -0
  72. package/dist/flow/gl/text.d.ts +318 -0
  73. package/dist/flow/gl/text.d.ts.map +1 -0
  74. package/dist/flow/gl/text.js +1103 -0
  75. package/dist/flow/gl/text.js.map +1 -0
  76. package/dist/flow/index.d.ts +1 -1
  77. package/dist/flow/index.d.ts.map +1 -1
  78. package/dist/flow/index.js +619 -64
  79. package/dist/flow/index.js.map +1 -1
  80. package/dist/flow/node.d.ts +621 -72
  81. package/dist/flow/node.d.ts.map +1 -1
  82. package/dist/flow/node.js +2253 -1018
  83. package/dist/flow/node.js.map +1 -1
  84. package/dist/flow/paint.d.ts +35 -0
  85. package/dist/flow/paint.d.ts.map +1 -0
  86. package/dist/flow/paint.js +393 -0
  87. package/dist/flow/paint.js.map +1 -0
  88. package/dist/flow/paths.d.ts +14 -0
  89. package/dist/flow/paths.d.ts.map +1 -1
  90. package/dist/flow/paths.js +45 -19
  91. package/dist/flow/paths.js.map +1 -1
  92. package/dist/flow/scene.d.ts +584 -0
  93. package/dist/flow/scene.d.ts.map +1 -0
  94. package/dist/flow/scene.js +1453 -0
  95. package/dist/flow/scene.js.map +1 -0
  96. package/dist/flow/types.d.ts +111 -1
  97. package/dist/flow/types.d.ts.map +1 -1
  98. package/dist/html/controls.d.ts +28 -0
  99. package/dist/html/controls.d.ts.map +1 -1
  100. package/dist/html/controls.js +52 -2
  101. package/dist/html/controls.js.map +1 -1
  102. package/dist/html/css/calc.d.ts +14 -0
  103. package/dist/html/css/calc.d.ts.map +1 -0
  104. package/dist/html/css/calc.js +344 -0
  105. package/dist/html/css/calc.js.map +1 -0
  106. package/dist/html/css/cascade.d.ts +240 -6
  107. package/dist/html/css/cascade.d.ts.map +1 -1
  108. package/dist/html/css/cascade.js +1327 -66
  109. package/dist/html/css/cascade.js.map +1 -1
  110. package/dist/html/css/color.d.ts +23 -0
  111. package/dist/html/css/color.d.ts.map +1 -0
  112. package/dist/html/css/color.js +740 -0
  113. package/dist/html/css/color.js.map +1 -0
  114. package/dist/html/css/content.d.ts +92 -0
  115. package/dist/html/css/content.d.ts.map +1 -0
  116. package/dist/html/css/content.js +388 -0
  117. package/dist/html/css/content.js.map +1 -0
  118. package/dist/html/css/counter-styles.d.ts +76 -0
  119. package/dist/html/css/counter-styles.d.ts.map +1 -0
  120. package/dist/html/css/counter-styles.js +893 -0
  121. package/dist/html/css/counter-styles.js.map +1 -0
  122. package/dist/html/css/decode.d.ts +12 -0
  123. package/dist/html/css/decode.d.ts.map +1 -0
  124. package/dist/html/css/decode.js +116 -0
  125. package/dist/html/css/decode.js.map +1 -0
  126. package/dist/html/css/parse.d.ts +110 -10
  127. package/dist/html/css/parse.d.ts.map +1 -1
  128. package/dist/html/css/parse.js +1473 -180
  129. package/dist/html/css/parse.js.map +1 -1
  130. package/dist/html/css/style.d.ts +498 -15
  131. package/dist/html/css/style.d.ts.map +1 -1
  132. package/dist/html/css/style.js +3698 -206
  133. package/dist/html/css/style.js.map +1 -1
  134. package/dist/html/css/ua.d.ts.map +1 -1
  135. package/dist/html/css/ua.js +57 -11
  136. package/dist/html/css/ua.js.map +1 -1
  137. package/dist/html/css/values.d.ts +37 -3
  138. package/dist/html/css/values.d.ts.map +1 -1
  139. package/dist/html/css/values.js +122 -48
  140. package/dist/html/css/values.js.map +1 -1
  141. package/dist/html/css/vars.d.ts +52 -0
  142. package/dist/html/css/vars.d.ts.map +1 -0
  143. package/dist/html/css/vars.js +358 -0
  144. package/dist/html/css/vars.js.map +1 -0
  145. package/dist/html/dom.d.ts +30 -4
  146. package/dist/html/dom.d.ts.map +1 -1
  147. package/dist/html/dom.js +278 -17
  148. package/dist/html/dom.js.map +1 -1
  149. package/dist/html/fonts.d.ts +106 -0
  150. package/dist/html/fonts.d.ts.map +1 -0
  151. package/dist/html/fonts.js +565 -0
  152. package/dist/html/fonts.js.map +1 -0
  153. package/dist/html/gif.d.ts +15 -0
  154. package/dist/html/gif.d.ts.map +1 -0
  155. package/dist/html/gif.js +229 -0
  156. package/dist/html/gif.js.map +1 -0
  157. package/dist/html/index.d.ts +50 -11
  158. package/dist/html/index.d.ts.map +1 -1
  159. package/dist/html/index.js +115 -9
  160. package/dist/html/index.js.map +1 -1
  161. package/dist/html/layout/block.d.ts +226 -3
  162. package/dist/html/layout/block.d.ts.map +1 -1
  163. package/dist/html/layout/block.js +2937 -197
  164. package/dist/html/layout/block.js.map +1 -1
  165. package/dist/html/layout/boxes.d.ts +340 -17
  166. package/dist/html/layout/boxes.d.ts.map +1 -1
  167. package/dist/html/layout/boxes.js +1714 -182
  168. package/dist/html/layout/boxes.js.map +1 -1
  169. package/dist/html/layout/cache.d.ts +58 -0
  170. package/dist/html/layout/cache.d.ts.map +1 -0
  171. package/dist/html/layout/cache.js +224 -0
  172. package/dist/html/layout/cache.js.map +1 -0
  173. package/dist/html/layout/collapse.d.ts +45 -0
  174. package/dist/html/layout/collapse.d.ts.map +1 -0
  175. package/dist/html/layout/collapse.js +246 -0
  176. package/dist/html/layout/collapse.js.map +1 -0
  177. package/dist/html/layout/css-grid.d.ts +7 -0
  178. package/dist/html/layout/css-grid.d.ts.map +1 -0
  179. package/dist/html/layout/css-grid.js +900 -0
  180. package/dist/html/layout/css-grid.js.map +1 -0
  181. package/dist/html/layout/flex.d.ts.map +1 -1
  182. package/dist/html/layout/flex.js +1025 -89
  183. package/dist/html/layout/flex.js.map +1 -1
  184. package/dist/html/layout/floats.d.ts +45 -6
  185. package/dist/html/layout/floats.d.ts.map +1 -1
  186. package/dist/html/layout/floats.js +113 -14
  187. package/dist/html/layout/floats.js.map +1 -1
  188. package/dist/html/layout/grid-lines.d.ts +39 -0
  189. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  190. package/dist/html/layout/grid-lines.js +119 -0
  191. package/dist/html/layout/grid-lines.js.map +1 -0
  192. package/dist/html/layout/grid.d.ts +53 -0
  193. package/dist/html/layout/grid.d.ts.map +1 -0
  194. package/dist/html/layout/grid.js +153 -0
  195. package/dist/html/layout/grid.js.map +1 -0
  196. package/dist/html/layout/inline.d.ts +151 -1
  197. package/dist/html/layout/inline.d.ts.map +1 -1
  198. package/dist/html/layout/inline.js +3375 -174
  199. package/dist/html/layout/inline.js.map +1 -1
  200. package/dist/html/layout/shaping.d.ts +6 -0
  201. package/dist/html/layout/shaping.d.ts.map +1 -0
  202. package/dist/html/layout/shaping.js +100 -0
  203. package/dist/html/layout/shaping.js.map +1 -0
  204. package/dist/html/layout/table.d.ts +3 -0
  205. package/dist/html/layout/table.d.ts.map +1 -1
  206. package/dist/html/layout/table.js +681 -175
  207. package/dist/html/layout/table.js.map +1 -1
  208. package/dist/html/layout/tracks.d.ts +44 -0
  209. package/dist/html/layout/tracks.d.ts.map +1 -0
  210. package/dist/html/layout/tracks.js +349 -0
  211. package/dist/html/layout/tracks.js.map +1 -0
  212. package/dist/html/node.d.ts +169 -4
  213. package/dist/html/node.d.ts.map +1 -1
  214. package/dist/html/node.js +1331 -100
  215. package/dist/html/node.js.map +1 -1
  216. package/dist/html/paint.d.ts +92 -3
  217. package/dist/html/paint.d.ts.map +1 -1
  218. package/dist/html/paint.js +3503 -141
  219. package/dist/html/paint.js.map +1 -1
  220. package/dist/html/resources.d.ts +60 -14
  221. package/dist/html/resources.d.ts.map +1 -1
  222. package/dist/html/resources.js +122 -36
  223. package/dist/html/resources.js.map +1 -1
  224. package/dist/html/surfaces.d.ts +23 -0
  225. package/dist/html/surfaces.d.ts.map +1 -0
  226. package/dist/html/surfaces.js +68 -0
  227. package/dist/html/surfaces.js.map +1 -0
  228. package/dist/html/svg.d.ts +80 -0
  229. package/dist/html/svg.d.ts.map +1 -0
  230. package/dist/html/svg.js +435 -0
  231. package/dist/html/svg.js.map +1 -0
  232. package/dist/html/url.d.ts +23 -0
  233. package/dist/html/url.d.ts.map +1 -0
  234. package/dist/html/url.js +80 -0
  235. package/dist/html/url.js.map +1 -0
  236. package/dist/index.d.ts +1 -1
  237. package/dist/index.d.ts.map +1 -1
  238. package/dist/index.js.map +1 -1
  239. package/dist/internal/collate.d.ts +3 -0
  240. package/dist/internal/collate.d.ts.map +1 -0
  241. package/dist/internal/collate.js +11 -0
  242. package/dist/internal/collate.js.map +1 -0
  243. package/dist/internal/markdown/ast.d.ts +11 -0
  244. package/dist/internal/markdown/ast.d.ts.map +1 -1
  245. package/dist/internal/markdown/parse.d.ts.map +1 -1
  246. package/dist/internal/markdown/parse.js +109 -8
  247. package/dist/internal/markdown/parse.js.map +1 -1
  248. package/dist/internal/prewarm.d.ts +18 -0
  249. package/dist/internal/prewarm.d.ts.map +1 -0
  250. package/dist/internal/prewarm.js +42 -0
  251. package/dist/internal/prewarm.js.map +1 -0
  252. package/dist/internal/sdf.d.ts +20 -0
  253. package/dist/internal/sdf.d.ts.map +1 -0
  254. package/dist/internal/sdf.js +216 -0
  255. package/dist/internal/sdf.js.map +1 -0
  256. package/dist/internal/splice.d.ts +12 -0
  257. package/dist/internal/splice.d.ts.map +1 -0
  258. package/dist/internal/splice.js +23 -0
  259. package/dist/internal/splice.js.map +1 -0
  260. package/dist/internal/window.d.ts +12 -0
  261. package/dist/internal/window.d.ts.map +1 -1
  262. package/dist/internal/window.js +23 -6
  263. package/dist/internal/window.js.map +1 -1
  264. package/dist/maps/anchors.d.ts +6 -1
  265. package/dist/maps/anchors.d.ts.map +1 -1
  266. package/dist/maps/anchors.js +260 -1
  267. package/dist/maps/anchors.js.map +1 -1
  268. package/dist/maps/controller.d.ts +57 -0
  269. package/dist/maps/controller.d.ts.map +1 -1
  270. package/dist/maps/controller.js +97 -18
  271. package/dist/maps/controller.js.map +1 -1
  272. package/dist/maps/gl/buckets.d.ts +5 -1
  273. package/dist/maps/gl/buckets.d.ts.map +1 -1
  274. package/dist/maps/gl/buckets.js +5 -2
  275. package/dist/maps/gl/buckets.js.map +1 -1
  276. package/dist/maps/gl/build-worker.d.ts +2 -0
  277. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  278. package/dist/maps/gl/build-worker.js +1 -1
  279. package/dist/maps/gl/build-worker.js.map +1 -1
  280. package/dist/maps/gl/cover.d.ts +23 -4
  281. package/dist/maps/gl/cover.d.ts.map +1 -1
  282. package/dist/maps/gl/cover.js +61 -48
  283. package/dist/maps/gl/cover.js.map +1 -1
  284. package/dist/maps/gl/placement.d.ts +21 -8
  285. package/dist/maps/gl/placement.d.ts.map +1 -1
  286. package/dist/maps/gl/placement.js +133 -58
  287. package/dist/maps/gl/placement.js.map +1 -1
  288. package/dist/maps/gl/renderer.d.ts +36 -4
  289. package/dist/maps/gl/renderer.d.ts.map +1 -1
  290. package/dist/maps/gl/renderer.js +81 -24
  291. package/dist/maps/gl/renderer.js.map +1 -1
  292. package/dist/maps/gl/shaders.d.ts +18 -17
  293. package/dist/maps/gl/shaders.d.ts.map +1 -1
  294. package/dist/maps/gl/shaders.js +34 -32
  295. package/dist/maps/gl/shaders.js.map +1 -1
  296. package/dist/maps/gl/store.d.ts +10 -0
  297. package/dist/maps/gl/store.d.ts.map +1 -1
  298. package/dist/maps/gl/store.js +47 -4
  299. package/dist/maps/gl/store.js.map +1 -1
  300. package/dist/maps/gl/text.d.ts +153 -24
  301. package/dist/maps/gl/text.d.ts.map +1 -1
  302. package/dist/maps/gl/text.js +379 -63
  303. package/dist/maps/gl/text.js.map +1 -1
  304. package/dist/maps/gl/view.d.ts +293 -2
  305. package/dist/maps/gl/view.d.ts.map +1 -1
  306. package/dist/maps/gl/view.js +317 -82
  307. package/dist/maps/gl/view.js.map +1 -1
  308. package/dist/maps/icons.d.ts +32 -0
  309. package/dist/maps/icons.d.ts.map +1 -0
  310. package/dist/maps/icons.js +151 -0
  311. package/dist/maps/icons.js.map +1 -0
  312. package/dist/maps/index.d.ts +2 -0
  313. package/dist/maps/index.d.ts.map +1 -1
  314. package/dist/maps/index.js +2 -0
  315. package/dist/maps/index.js.map +1 -1
  316. package/dist/maps/labels.d.ts +56 -4
  317. package/dist/maps/labels.d.ts.map +1 -1
  318. package/dist/maps/labels.js +213 -46
  319. package/dist/maps/labels.js.map +1 -1
  320. package/dist/maps/node.d.ts +17 -0
  321. package/dist/maps/node.d.ts.map +1 -1
  322. package/dist/maps/node.js +64 -30
  323. package/dist/maps/node.js.map +1 -1
  324. package/dist/maps/proj.d.ts +48 -0
  325. package/dist/maps/proj.d.ts.map +1 -1
  326. package/dist/maps/proj.js +73 -0
  327. package/dist/maps/proj.js.map +1 -1
  328. package/dist/maps/sources.d.ts +5 -3
  329. package/dist/maps/sources.d.ts.map +1 -1
  330. package/dist/maps/sources.js +5 -3
  331. package/dist/maps/sources.js.map +1 -1
  332. package/dist/maps/style.d.ts +35 -0
  333. package/dist/maps/style.d.ts.map +1 -1
  334. package/dist/maps/style.js.map +1 -1
  335. package/dist/maps/styles.d.ts +12 -0
  336. package/dist/maps/styles.d.ts.map +1 -1
  337. package/dist/maps/styles.js +120 -6
  338. package/dist/maps/styles.js.map +1 -1
  339. package/dist/maps/tiles.d.ts +31 -11
  340. package/dist/maps/tiles.d.ts.map +1 -1
  341. package/dist/maps/tiles.js +61 -27
  342. package/dist/maps/tiles.js.map +1 -1
  343. package/dist/maps/types.d.ts +28 -4
  344. package/dist/maps/types.d.ts.map +1 -1
  345. package/dist/markdown/index.d.ts.map +1 -1
  346. package/dist/markdown/index.js +112 -43
  347. package/dist/markdown/index.js.map +1 -1
  348. package/dist/markdown/spans.d.ts.map +1 -1
  349. package/dist/markdown/spans.js +6 -0
  350. package/dist/markdown/spans.js.map +1 -1
  351. package/dist/qml/containers.d.ts.map +1 -1
  352. package/dist/qml/containers.js +6 -1
  353. package/dist/qml/containers.js.map +1 -1
  354. package/dist/qml/interaction.d.ts.map +1 -1
  355. package/dist/qml/interaction.js +38 -5
  356. package/dist/qml/interaction.js.map +1 -1
  357. package/dist/qml/layouts.d.ts.map +1 -1
  358. package/dist/qml/layouts.js +21 -6
  359. package/dist/qml/layouts.js.map +1 -1
  360. package/dist/qml/qtquick.d.ts.map +1 -1
  361. package/dist/qml/qtquick.js +9 -2
  362. package/dist/qml/qtquick.js.map +1 -1
  363. package/dist/qml/react.d.ts.map +1 -1
  364. package/dist/qml/react.js +9 -7
  365. package/dist/qml/react.js.map +1 -1
  366. package/dist/reorder/clock.d.ts +7 -0
  367. package/dist/reorder/clock.d.ts.map +1 -0
  368. package/dist/reorder/clock.js +26 -0
  369. package/dist/reorder/clock.js.map +1 -0
  370. package/dist/reorder/index.d.ts +25 -3
  371. package/dist/reorder/index.d.ts.map +1 -1
  372. package/dist/reorder/index.js +64 -19
  373. package/dist/reorder/index.js.map +1 -1
  374. package/dist/rich-text-editor/index.d.ts +0 -11
  375. package/dist/rich-text-editor/index.d.ts.map +1 -1
  376. package/dist/rich-text-editor/index.js +35 -1
  377. package/dist/rich-text-editor/index.js.map +1 -1
  378. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  379. package/dist/rich-text-editor/keymap.js +2 -1
  380. package/dist/rich-text-editor/keymap.js.map +1 -1
  381. package/dist/rich-text-editor/keys.d.ts +17 -6
  382. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  383. package/dist/rich-text-editor/keys.js +135 -26
  384. package/dist/rich-text-editor/keys.js.map +1 -1
  385. package/dist/rich-text-editor/marks.d.ts +9 -0
  386. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  387. package/dist/rich-text-editor/marks.js +83 -0
  388. package/dist/rich-text-editor/marks.js.map +1 -0
  389. package/dist/rich-text-editor/render.d.ts.map +1 -1
  390. package/dist/rich-text-editor/render.js +28 -10
  391. package/dist/rich-text-editor/render.js.map +1 -1
  392. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  393. package/dist/rich-text-editor/toolbar.js +1 -1
  394. package/dist/rich-text-editor/toolbar.js.map +1 -1
  395. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  396. package/dist/rich-text-editor/virtual.js +17 -0
  397. package/dist/rich-text-editor/virtual.js.map +1 -1
  398. package/dist/richtext/node.d.ts +46 -2
  399. package/dist/richtext/node.d.ts.map +1 -1
  400. package/dist/richtext/node.js +187 -4
  401. package/dist/richtext/node.js.map +1 -1
  402. package/dist/richtext/runs.d.ts +13 -8
  403. package/dist/richtext/runs.d.ts.map +1 -1
  404. package/dist/richtext/runs.js +18 -8
  405. package/dist/richtext/runs.js.map +1 -1
  406. package/dist/table/index.d.ts.map +1 -1
  407. package/dist/table/index.js +23 -0
  408. package/dist/table/index.js.map +1 -1
  409. package/dist/table/rows.d.ts +3 -2
  410. package/dist/table/rows.d.ts.map +1 -1
  411. package/dist/table/rows.js +20 -6
  412. package/dist/table/rows.js.map +1 -1
  413. package/dist/terminal/index.d.ts.map +1 -1
  414. package/dist/terminal/index.js +4 -0
  415. package/dist/terminal/index.js.map +1 -1
  416. package/dist/terminal/vt/pty.d.ts +13 -2
  417. package/dist/terminal/vt/pty.d.ts.map +1 -1
  418. package/dist/terminal/vt/pty.js +18 -3
  419. package/dist/terminal/vt/pty.js.map +1 -1
  420. package/dist/terminal-output/index.d.ts.map +1 -1
  421. package/dist/terminal-output/index.js +6 -1
  422. package/dist/terminal-output/index.js.map +1 -1
  423. package/dist/three/canvas.d.ts.map +1 -1
  424. package/dist/three/canvas.js +85 -7
  425. package/dist/three/canvas.js.map +1 -1
  426. package/dist/three/events.d.ts +22 -4
  427. package/dist/three/events.d.ts.map +1 -1
  428. package/dist/three/events.js +34 -4
  429. package/dist/three/events.js.map +1 -1
  430. package/dist/tree/index.d.ts.map +1 -1
  431. package/dist/tree/index.js +17 -0
  432. package/dist/tree/index.js.map +1 -1
  433. package/package.json +42 -33
  434. package/src/charts/node.ts +62 -26
  435. package/src/charts/render.ts +120 -30
  436. package/src/code/index.ts +3 -1
  437. package/src/code-editor/completion.ts +3 -2
  438. package/src/code-editor/index.ts +19 -0
  439. package/src/code-editor/node.ts +1574 -184
  440. package/src/code-language/languages/glsl.ts +12 -2
  441. package/src/code-language/languages/javascript.ts +21 -4
  442. package/src/code-language/languages/json.ts +12 -2
  443. package/src/code-language/languages/shell.ts +12 -2
  444. package/src/code-language/languages/sql.ts +22 -2
  445. package/src/code-language/stream.ts +257 -17
  446. package/src/code-language/types.ts +5 -4
  447. package/src/codeblock/index.ts +20 -3
  448. package/src/flow/draw.ts +167 -41
  449. package/src/flow/gl/color.ts +85 -0
  450. package/src/flow/gl/index.ts +342 -0
  451. package/src/flow/gl/pack.ts +585 -0
  452. package/src/flow/gl/renderer.ts +679 -0
  453. package/src/flow/gl/shaders.ts +371 -0
  454. package/src/flow/gl/text.ts +1295 -0
  455. package/src/flow/index.ts +794 -67
  456. package/src/flow/node.ts +2496 -1256
  457. package/src/flow/paint.ts +511 -0
  458. package/src/flow/paths.ts +80 -15
  459. package/src/flow/scene.ts +2199 -0
  460. package/src/flow/types.ts +113 -1
  461. package/src/html/controls.ts +73 -2
  462. package/src/html/css/calc.ts +385 -0
  463. package/src/html/css/cascade.ts +1403 -62
  464. package/src/html/css/color.ts +755 -0
  465. package/src/html/css/content.ts +417 -0
  466. package/src/html/css/counter-styles.ts +973 -0
  467. package/src/html/css/decode.ts +130 -0
  468. package/src/html/css/parse.ts +1514 -160
  469. package/src/html/css/style.ts +4102 -222
  470. package/src/html/css/ua.ts +58 -12
  471. package/src/html/css/values.ts +150 -50
  472. package/src/html/css/vars.ts +348 -0
  473. package/src/html/dom.ts +284 -17
  474. package/src/html/fonts.ts +641 -0
  475. package/src/html/gif.ts +233 -0
  476. package/src/html/index.ts +180 -20
  477. package/src/html/layout/block.ts +3456 -230
  478. package/src/html/layout/boxes.ts +2100 -190
  479. package/src/html/layout/cache.ts +289 -0
  480. package/src/html/layout/collapse.ts +317 -0
  481. package/src/html/layout/css-grid.ts +1063 -0
  482. package/src/html/layout/flex.ts +1115 -106
  483. package/src/html/layout/floats.ts +128 -14
  484. package/src/html/layout/grid-lines.ts +141 -0
  485. package/src/html/layout/grid.ts +181 -0
  486. package/src/html/layout/inline.ts +3943 -192
  487. package/src/html/layout/shaping.ts +140 -0
  488. package/src/html/layout/table.ts +696 -186
  489. package/src/html/layout/tracks.ts +437 -0
  490. package/src/html/node.ts +1481 -118
  491. package/src/html/paint.ts +4293 -169
  492. package/src/html/resources.ts +161 -50
  493. package/src/html/surfaces.ts +81 -0
  494. package/src/html/svg.ts +493 -0
  495. package/src/html/url.ts +86 -0
  496. package/src/index.ts +2 -0
  497. package/src/internal/collate.ts +12 -0
  498. package/src/internal/markdown/ast.ts +11 -0
  499. package/src/internal/markdown/parse.ts +154 -11
  500. package/src/internal/prewarm.ts +45 -0
  501. package/src/internal/sdf.ts +227 -0
  502. package/src/internal/splice.ts +25 -0
  503. package/src/internal/window.ts +36 -5
  504. package/src/maps/anchors.ts +307 -1
  505. package/src/maps/controller.ts +116 -31
  506. package/src/maps/gl/buckets.ts +5 -1
  507. package/src/maps/gl/build-worker.ts +13 -2
  508. package/src/maps/gl/cover.ts +79 -44
  509. package/src/maps/gl/placement.ts +221 -69
  510. package/src/maps/gl/renderer.ts +104 -20
  511. package/src/maps/gl/shaders.ts +35 -32
  512. package/src/maps/gl/store.ts +66 -17
  513. package/src/maps/gl/text.ts +444 -71
  514. package/src/maps/gl/view.ts +361 -96
  515. package/src/maps/icons.ts +183 -0
  516. package/src/maps/index.ts +4 -0
  517. package/src/maps/labels.ts +269 -49
  518. package/src/maps/node.ts +82 -49
  519. package/src/maps/proj.ts +87 -0
  520. package/src/maps/sources.ts +5 -3
  521. package/src/maps/style.ts +32 -0
  522. package/src/maps/styles.ts +215 -4
  523. package/src/maps/tiles.ts +64 -31
  524. package/src/maps/types.ts +28 -4
  525. package/src/markdown/index.ts +149 -67
  526. package/src/markdown/spans.ts +5 -0
  527. package/src/qml/containers.tsx +6 -1
  528. package/src/qml/interaction.tsx +42 -5
  529. package/src/qml/layouts.tsx +21 -6
  530. package/src/qml/qtquick.tsx +9 -2
  531. package/src/qml/react.tsx +7 -5
  532. package/src/reorder/clock.ts +27 -0
  533. package/src/reorder/index.ts +100 -27
  534. package/src/rich-text-editor/index.ts +34 -1
  535. package/src/rich-text-editor/keymap.ts +1 -1
  536. package/src/rich-text-editor/keys.ts +135 -26
  537. package/src/rich-text-editor/marks.ts +101 -0
  538. package/src/rich-text-editor/render.ts +49 -12
  539. package/src/rich-text-editor/toolbar.ts +1 -1
  540. package/src/rich-text-editor/virtual.ts +25 -0
  541. package/src/richtext/node.ts +235 -14
  542. package/src/richtext/runs.ts +23 -12
  543. package/src/table/index.ts +29 -0
  544. package/src/table/rows.ts +18 -8
  545. package/src/terminal/index.ts +4 -0
  546. package/src/terminal/vt/pty.ts +16 -2
  547. package/src/terminal-output/index.ts +6 -1
  548. package/src/three/canvas.ts +102 -8
  549. package/src/three/events.ts +49 -9
  550. package/src/tree/index.ts +19 -0
@@ -36,8 +36,10 @@
36
36
  // Everything leaves as one Float32Array and a string table, so a worker can
37
37
  // hand it over with the buckets (see `./gl/store.ts`).
38
38
  import { GeomType, GeometryBuffer } from './mvt.js';
39
- import type { FeatureCursor, VectorTile } from './mvt.js';
39
+ import type { FeatureCursor, VectorTile, VectorTileLayer } from './mvt.js';
40
40
  import type { PreparedStyle } from './paint.js';
41
+ import { latFromMercatorY } from './proj.js';
42
+ import type { TileId } from './proj.js';
41
43
  import type { SymbolLayer } from './style.js';
42
44
 
43
45
  // --- the fit rules both renderers place by ------------------------------------
@@ -241,6 +243,10 @@ export function buildTileLabels(
241
243
  tile: VectorTile,
242
244
  prepared: PreparedStyle,
243
245
  extent: number,
246
+ /** Which tile: what turns a `snapInto` distance in metres into tile
247
+ * units. Without it no distance can be known, and only a point already
248
+ * inside a polygon moves. */
249
+ id?: TileId,
244
250
  ): GlLabelData {
245
251
  const started = now();
246
252
  const texts: string[] = [];
@@ -259,6 +265,11 @@ export function buildTileLabels(
259
265
  const groups = new Map<number, LineGroup>();
260
266
  // Which name first touched each vertex, or -1 once a second did.
261
267
  const touched = new Map<number, number>();
268
+ // A layer that snaps into polygons collects its points first — x, y,
269
+ // text, priority — since which point a polygon belongs to depends on
270
+ // every other point that could claim it.
271
+ const snap = symbol.snapInto;
272
+ const snaps: number[] | null = snap ? [] : null;
262
273
 
263
274
  for (let f = 0; f < source.length; f++) {
264
275
  source.seek(f, cursor);
@@ -309,10 +320,23 @@ export function buildTileLabels(
309
320
  if (!anchor) continue;
310
321
  const x = anchor.x * k;
311
322
  const y = anchor.y * k;
323
+ if (snaps && cursor.type === GeomType.Point) {
324
+ // The buffer's points too, and judged before the tile's square:
325
+ // a polygon near the edge is claimed by points on either side of
326
+ // it, and both tiles that hold it must see the same claims.
327
+ snaps.push(x, y, t, priority);
328
+ continue;
329
+ }
312
330
  if (x < 0 || y < 0 || x >= extent || y >= extent) continue;
313
331
  out.point(x, y, t, i, priority);
314
332
  }
315
333
 
334
+ if (snap && snaps) {
335
+ const polygons = tile.layers.get(snap.sourceLayer);
336
+ const within = (snap.within ?? SNAP_WITHIN) / metresPerUnit(id, extent);
337
+ snapPoints(polygons, within, snaps, extent, i, out, buffer);
338
+ }
339
+
316
340
  for (const group of groups.values()) {
317
341
  for (const chain of mergeParts(group.parts)) {
318
342
  anchorChain(chain, touched, extent, group, i, out);
@@ -323,6 +347,288 @@ export function buildTileLabels(
323
347
  return { texts, anchors: out.take(), count: out.count, ms: now() - started };
324
348
  }
325
349
 
350
+ /** How far a point is taken to belong to a polygon it is outside, metres,
351
+ * where the layer does not say. An address point in the lot sits a few
352
+ * metres off its house; much past this, the nearest building is as often
353
+ * a neighbour's — the house the number is for not being mapped at all. */
354
+ const SNAP_WITHIN = 15;
355
+ /** The earth's circumference at the equator, metres (Web Mercator's). */
356
+ const EQUATOR = 40075016.686;
357
+
358
+ /** Metres on the ground per tile unit, at the tile's middle row. */
359
+ function metresPerUnit(id: TileId | undefined, extent: number): number {
360
+ const n = 2 ** (id?.z ?? 0);
361
+ const lat = id ? latFromMercatorY((id.y + 0.5) / n) : 0;
362
+ return (EQUATOR * Math.cos((lat * Math.PI) / 180)) / (n * extent);
363
+ }
364
+
365
+ /** One polygon's outer ring, in tile units: its points, its box, and the
366
+ * point inside it a label moved into it is set on. */
367
+ interface SnapRing {
368
+ points: number[];
369
+ x0: number;
370
+ y0: number;
371
+ x1: number;
372
+ y1: number;
373
+ cx: number;
374
+ cy: number;
375
+ }
376
+
377
+ /** The grid rings are found by, in tile units: a z14 tile is 16 cells a
378
+ * side, a few dozen buildings each. */
379
+ const SNAP_CELL = 256;
380
+ const snapCell = (gx: number, gy: number): number =>
381
+ (gx + 1024) * 4096 + (gy + 1024);
382
+
383
+ /**
384
+ * Point labels moved into the polygon each one belongs to — a house number
385
+ * into its house.
386
+ *
387
+ * A point inside a polygon belongs to it; one outside, to the nearest
388
+ * polygon whose outline is within `within` tile units. It moves only if it
389
+ * is the **one** point its polygon is claimed by: a duplex's two numbers, or
390
+ * a garage nearer the street than the house, would otherwise pile several
391
+ * numbers onto one roof — and collision would then keep one of them, on a
392
+ * building that is not only its own. Every point that does not move stays
393
+ * exactly where the data put it.
394
+ *
395
+ * `points` are the whole tile's, buffer included, so a polygon near the edge
396
+ * is claimed alike in both tiles that hold it; each point is then anchored
397
+ * only in the tile its own position is in, as every other point is. One
398
+ * whose polygon's middle is in the next tile over stays put rather than
399
+ * move out of the tile that offers it.
400
+ */
401
+ function snapPoints(
402
+ polygons: VectorTileLayer | undefined,
403
+ within: number,
404
+ points: readonly number[],
405
+ extent: number,
406
+ layer: number,
407
+ out: AnchorWriter,
408
+ buffer: GeometryBuffer,
409
+ ): void {
410
+ const count = points.length / 4;
411
+ const target = new Int32Array(count).fill(-1);
412
+ const rings = polygons ? snapRings(polygons, extent, buffer) : [];
413
+ if (rings.length > 0) {
414
+ const grid = new Map<number, number[]>();
415
+ rings.forEach((ring, r) => {
416
+ for (let gx = cellOf(ring.x0); gx <= cellOf(ring.x1); gx++) {
417
+ for (let gy = cellOf(ring.y0); gy <= cellOf(ring.y1); gy++) {
418
+ const key = snapCell(gx, gy);
419
+ const list = grid.get(key);
420
+ if (list) list.push(r);
421
+ else grid.set(key, [r]);
422
+ }
423
+ }
424
+ });
425
+ const claims = new Int32Array(rings.length);
426
+ // Which query last looked at each ring: a ring spanning several cells
427
+ // is one candidate, not several.
428
+ const seen = new Int32Array(rings.length).fill(-1);
429
+ for (let p = 0; p < count; p++) {
430
+ const r = ownerOf(
431
+ rings,
432
+ grid,
433
+ seen,
434
+ p,
435
+ points[p * 4],
436
+ points[p * 4 + 1],
437
+ within,
438
+ );
439
+ if (r >= 0) {
440
+ target[p] = r;
441
+ claims[r]++;
442
+ }
443
+ }
444
+ for (let p = 0; p < count; p++) {
445
+ if (target[p] >= 0 && claims[target[p]] !== 1) target[p] = -1;
446
+ }
447
+ }
448
+ for (let p = 0; p < count; p++) {
449
+ let x = points[p * 4];
450
+ let y = points[p * 4 + 1];
451
+ if (x < 0 || y < 0 || x >= extent || y >= extent) continue;
452
+ const r = target[p];
453
+ if (r >= 0) {
454
+ const ring = rings[r];
455
+ if (
456
+ ring.cx >= 0 &&
457
+ ring.cy >= 0 &&
458
+ ring.cx < extent &&
459
+ ring.cy < extent
460
+ ) {
461
+ x = ring.cx;
462
+ y = ring.cy;
463
+ }
464
+ }
465
+ out.point(x, y, points[p * 4 + 2], layer, points[p * 4 + 3]);
466
+ }
467
+ }
468
+
469
+ const cellOf = (v: number): number => Math.floor(v / SNAP_CELL);
470
+
471
+ /** Every polygon's outer rings, in tile units. Holes are not a building's
472
+ * own ground, and a courtyard is not where a number goes. */
473
+ function snapRings(
474
+ source: VectorTileLayer,
475
+ extent: number,
476
+ buffer: GeometryBuffer,
477
+ ): SnapRing[] {
478
+ const k = extent / source.extent;
479
+ const cursor = source.feature(0);
480
+ const rings: SnapRing[] = [];
481
+ for (let f = 0; f < source.length; f++) {
482
+ source.seek(f, cursor);
483
+ if (cursor.type !== GeomType.Polygon) continue;
484
+ cursor.readGeometry(buffer);
485
+ for (let part = 0; part < buffer.parts; part++) {
486
+ if (buffer.areas[part] <= 0) continue;
487
+ const from = buffer.starts[part];
488
+ const to = buffer.starts[part + 1];
489
+ if (to - from < 3) continue;
490
+ const points: number[] = [];
491
+ let x0 = Infinity;
492
+ let y0 = Infinity;
493
+ let x1 = -Infinity;
494
+ let y1 = -Infinity;
495
+ for (let p = from; p < to; p++) {
496
+ const x = buffer.coords[p * 2] * k;
497
+ const y = buffer.coords[p * 2 + 1] * k;
498
+ points.push(x, y);
499
+ if (x < x0) x0 = x;
500
+ if (x > x1) x1 = x;
501
+ if (y < y0) y0 = y;
502
+ if (y > y1) y1 = y;
503
+ }
504
+ const [cx, cy] = interiorPoint(points, x0, y0, x1, y1);
505
+ rings.push({ points, x0, y0, x1, y1, cx, cy });
506
+ }
507
+ }
508
+ return rings;
509
+ }
510
+
511
+ /**
512
+ * A point inside a ring to set a label on: its centroid, which is inside
513
+ * for all but the most contorted outline — 99.8% of the building rings in
514
+ * the tiles this was measured on — and where it is not, the middle of the
515
+ * widest span of the ring along the centroid's row.
516
+ */
517
+ function interiorPoint(
518
+ points: readonly number[],
519
+ x0: number,
520
+ y0: number,
521
+ x1: number,
522
+ y1: number,
523
+ ): [number, number] {
524
+ let area = 0;
525
+ let sx = 0;
526
+ let sy = 0;
527
+ const n = points.length;
528
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
529
+ const cross = points[j] * points[i + 1] - points[i] * points[j + 1];
530
+ area += cross;
531
+ sx += (points[j] + points[i]) * cross;
532
+ sy += (points[j + 1] + points[i + 1]) * cross;
533
+ }
534
+ if (area === 0) return [(x0 + x1) / 2, (y0 + y1) / 2];
535
+ const cx = sx / (3 * area);
536
+ const cy = sy / (3 * area);
537
+ if (insideRing(points, cx, cy)) return [cx, cy];
538
+ const crossings: number[] = [];
539
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
540
+ const ay = points[j + 1];
541
+ const by = points[i + 1];
542
+ if (ay > cy !== by > cy) {
543
+ crossings.push(
544
+ points[j] + ((cy - ay) / (by - ay)) * (points[i] - points[j]),
545
+ );
546
+ }
547
+ }
548
+ crossings.sort((a, b) => a - b);
549
+ let best = -1;
550
+ let mid = (x0 + x1) / 2;
551
+ for (let c = 0; c + 1 < crossings.length; c += 2) {
552
+ const span = crossings[c + 1] - crossings[c];
553
+ if (span > best) {
554
+ best = span;
555
+ mid = (crossings[c] + crossings[c + 1]) / 2;
556
+ }
557
+ }
558
+ return [mid, cy];
559
+ }
560
+
561
+ /** Even-odd: whether `x, y` is inside the ring. */
562
+ function insideRing(points: readonly number[], x: number, y: number): boolean {
563
+ let inside = false;
564
+ const n = points.length;
565
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
566
+ const xi = points[i];
567
+ const yi = points[i + 1];
568
+ const xj = points[j];
569
+ const yj = points[j + 1];
570
+ if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {
571
+ inside = !inside;
572
+ }
573
+ }
574
+ return inside;
575
+ }
576
+
577
+ /** How far `x, y` is from the ring's outline. */
578
+ function distanceToRing(points: readonly number[], x: number, y: number) {
579
+ let best = Infinity;
580
+ const n = points.length;
581
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
582
+ const ax = points[j];
583
+ const ay = points[j + 1];
584
+ const dx = points[i] - ax;
585
+ const dy = points[i + 1] - ay;
586
+ const length = dx * dx + dy * dy;
587
+ const t =
588
+ length > 0
589
+ ? Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / length))
590
+ : 0;
591
+ const d = Math.hypot(x - ax - t * dx, y - ay - t * dy);
592
+ if (d < best) best = d;
593
+ }
594
+ return best;
595
+ }
596
+
597
+ /** The ring a point belongs to — the one it is inside, else the nearest
598
+ * within `within` — or -1. */
599
+ function ownerOf(
600
+ rings: readonly SnapRing[],
601
+ grid: Map<number, number[]>,
602
+ seen: Int32Array,
603
+ query: number,
604
+ x: number,
605
+ y: number,
606
+ within: number,
607
+ ): number {
608
+ let best = -1;
609
+ let bestDistance = within;
610
+ for (let gx = cellOf(x - within); gx <= cellOf(x + within); gx++) {
611
+ for (let gy = cellOf(y - within); gy <= cellOf(y + within); gy++) {
612
+ for (const r of grid.get(snapCell(gx, gy)) ?? []) {
613
+ if (seen[r] === query) continue;
614
+ seen[r] = query;
615
+ const ring = rings[r];
616
+ // Past the box by more than the distance allowed: not a candidate.
617
+ const bx = Math.max(ring.x0 - x, 0, x - ring.x1);
618
+ const by = Math.max(ring.y0 - y, 0, y - ring.y1);
619
+ if (bx > bestDistance || by > bestDistance) continue;
620
+ if (bx === 0 && by === 0 && insideRing(ring.points, x, y)) return r;
621
+ const d = distanceToRing(ring.points, x, y);
622
+ if (d <= bestDistance) {
623
+ best = r;
624
+ bestDistance = d;
625
+ }
626
+ }
627
+ }
628
+ }
629
+ return best;
630
+ }
631
+
326
632
  /**
327
633
  * Where a point-like feature's label goes: the point, or for a polygon the
328
634
  * middle of its largest ring's box — a cheap stand-in for the pole of
@@ -240,18 +240,6 @@ const timers = globalThis as {
240
240
  performance?: { now(): number };
241
241
  };
242
242
 
243
- /**
244
- * The clock a glide is measured on.
245
- *
246
- * `performance.now()` rather than the `Date.now()` the settle window uses:
247
- * this one is compared across two frames of a 60Hz display, and `Date.now()`
248
- * counts whole milliseconds, so a sixth of the step would be error. Reached
249
- * through `globalThis` because `src/` compiles with `types: []`.
250
- */
251
- function now(): number {
252
- return timers.performance?.now() ?? Date.now();
253
- }
254
-
255
243
  /**
256
244
  * The settle timer, unref'd where the runtime allows it.
257
245
  *
@@ -266,6 +254,29 @@ function arm(tick: () => void, ms: number): unknown {
266
254
  return handle;
267
255
  }
268
256
 
257
+ /**
258
+ * The clock a glide is measured on, and the timer that steps it.
259
+ *
260
+ * `performance.now()` rather than the `Date.now()` the settle window uses:
261
+ * this one is compared across two frames of a 60Hz display, and `Date.now()`
262
+ * counts whole milliseconds, so a sixth of the step would be error. Reached
263
+ * through `globalThis` because `src/` compiles with `types: []`.
264
+ *
265
+ * One object, exported from this module though not from the package, so a
266
+ * test can stand in for both and step a glide a frame at a time. The glide
267
+ * is wall-clock time on purpose, and a runner slow enough to spend the whole
268
+ * of one inside a single `await` finds it over before it can look.
269
+ */
270
+ export const glideClock = {
271
+ now(): number {
272
+ return timers.performance?.now() ?? Date.now();
273
+ },
274
+ arm,
275
+ disarm(handle: unknown): void {
276
+ timers.clearTimeout?.(handle);
277
+ },
278
+ };
279
+
269
280
  function clamp(value: number, low: number, high: number): number {
270
281
  return value < low ? low : value > high ? high : value;
271
282
  }
@@ -287,6 +298,10 @@ export class MapController {
287
298
  * claims nothing and starts no gesture.
288
299
  */
289
300
  painting = false;
301
+ /** A camera move made while `painting`, waiting for the frame to end —
302
+ * `previous` is the camera the *first* such move started from, so the
303
+ * view is told the whole delta however many were fused. */
304
+ private _paintMove: { previous: MapCamera } | null = null;
290
305
 
291
306
  private _props: MapControllerProps = {};
292
307
  /** The camera, when the application does not control it. */
@@ -361,7 +376,7 @@ export class MapController {
361
376
  dispose(): void {
362
377
  if (this._settleTimer !== null) timers.clearTimeout?.(this._settleTimer);
363
378
  this._settleTimer = null;
364
- if (this._glideTimer !== null) timers.clearTimeout?.(this._glideTimer);
379
+ if (this._glideTimer !== null) glideClock.disarm(this._glideTimer);
365
380
  this._glideTimer = null;
366
381
  this._glide = null;
367
382
  }
@@ -443,11 +458,49 @@ export class MapController {
443
458
  const controlled = this._props.camera !== undefined;
444
459
  if (!controlled) this._camera = camera;
445
460
  this._props.onCameraChange?.(camera);
446
- if (this.painting) return;
461
+ if (this.painting) {
462
+ // A camera set from **inside** a frame, which is how every camera
463
+ // animation is written: the map's own `onFrame` is the clock, and the
464
+ // GL view calls it while it is still painting. Re-entering the paint
465
+ // is not on, but returning here used to drop the move's *scheduling*
466
+ // as well as its redraw — so the animation had nothing to ask for the
467
+ // next frame with, and stopped until something unrelated re-rendered.
468
+ //
469
+ // In the maps-gl example that something was the status bar's
470
+ // half-second interval, and it showed as exactly that: frames every
471
+ // 11ms, then a 511ms hole with the next request arriving at +508 —
472
+ // nobody asking, rather than anyone being slow. Manual panning never
473
+ // hit it because an input event is not inside a paint.
474
+ //
475
+ // So the move is remembered, with the camera it started from, and
476
+ // finished when the frame ends.
477
+ this._paintMove ??= { previous };
478
+ return;
479
+ }
447
480
  this.touch();
448
481
  if (!controlled) this._view?.moved(previous, camera, blit);
449
482
  }
450
483
 
484
+ /**
485
+ * A frame finished: do whatever `apply` deferred because it was painting.
486
+ * Called from both painters (`gl/view.ts`, `node.ts`) wherever `painting`
487
+ * goes back to false.
488
+ *
489
+ * Never a blit. A blit needs the exact transform it is shifting from, and
490
+ * what is flushed here may be several moves fused into one; a full redraw
491
+ * of a frame that was going to be drawn anyway costs nothing next to
492
+ * getting that wrong.
493
+ */
494
+ paintEnded(): void {
495
+ const move = this._paintMove;
496
+ if (!move) return;
497
+ this._paintMove = null;
498
+ this.touch();
499
+ if (this._props.camera === undefined) {
500
+ this._view?.moved(move.previous, this.camera(), false);
501
+ }
502
+ }
503
+
451
504
  getCamera(): MapCamera {
452
505
  const camera = this.camera();
453
506
  return { center: { ...camera.center }, zoom: camera.zoom };
@@ -501,6 +554,17 @@ export class MapController {
501
554
  this._maxZoom(),
502
555
  );
503
556
  if (zoom === camera.zoom) return;
557
+ this.apply(this._zoomedAbout(camera, zoom, x, y), false);
558
+ }
559
+
560
+ /** `camera` at `zoom`, with the point at pane-local `x`, `y` where it
561
+ * was: what {@link zoomAbout} moves to, and what a glide arrives at. */
562
+ private _zoomedAbout(
563
+ camera: MapCamera,
564
+ zoom: number,
565
+ x: number,
566
+ y: number,
567
+ ): MapCamera {
504
568
  const before = this.transform(camera);
505
569
  const anchor = unprojectPoint(before, x, y);
506
570
  const after = this.transform({ center: camera.center, zoom });
@@ -509,21 +573,42 @@ export class MapController {
509
573
  const moved = projectLngLat(after, anchor);
510
574
  const dx = (moved.x - x) / after.world;
511
575
  const dy = (moved.y - y) / after.world;
512
- this.apply(
513
- {
514
- zoom,
515
- center: unprojectPoint(
516
- {
517
- ...after,
518
- centerX: after.centerX + dx,
519
- centerY: after.centerY + dy,
520
- },
521
- after.paneX,
522
- after.paneY,
523
- ),
524
- },
525
- false,
576
+ return {
577
+ zoom,
578
+ center: unprojectPoint(
579
+ {
580
+ ...after,
581
+ centerX: after.centerX + dx,
582
+ centerY: after.centerY + dy,
583
+ },
584
+ after.paneX,
585
+ after.paneY,
586
+ ),
587
+ };
588
+ }
589
+
590
+ /**
591
+ * Where the camera is going, when that is known before it gets there: the
592
+ * end of a wheel's glide. Null while nothing is gliding — a touchpad's
593
+ * stream, a drag or an application's own animation go wherever the next
594
+ * event says, and the view has only the camera to go on.
595
+ *
596
+ * What a renderer does with it is get there first: the tiles and label
597
+ * rasters of the view the glide stops at are asked for while the frames
598
+ * of the glide are still being drawn, so the settle has them in hand.
599
+ */
600
+ destination(): MapCamera | null {
601
+ const glide = this._glide;
602
+ if (!glide || !glide.easing) return null;
603
+ const camera = this.camera();
604
+ if (glide.applied !== camera.zoom) return null;
605
+ const zoom = clamp(
606
+ quantizeZoom(glide.target),
607
+ this._minZoom(),
608
+ this._maxZoom(),
526
609
  );
610
+ if (zoom === camera.zoom) return null;
611
+ return this._zoomedAbout(camera, zoom, glide.x, glide.y);
527
612
  }
528
613
 
529
614
  /**
@@ -550,7 +635,7 @@ export class MapController {
550
635
  y: number,
551
636
  smooth: boolean,
552
637
  ): void {
553
- const at = now();
638
+ const at = glideClock.now();
554
639
  const camera = this.camera();
555
640
  const glide = this._glide;
556
641
  // Where this delta counts from: the target the wheel has already asked
@@ -590,13 +675,13 @@ export class MapController {
590
675
  this._glideTimer = null;
591
676
  const glide = this._glide;
592
677
  if (glide?.easing !== true) return;
593
- const at = now();
678
+ const at = glideClock.now();
594
679
  // `stepZoom` clears the record when the target is reached or the
595
680
  // camera refuses a step, and this re-arms only while one is left.
596
681
  this.stepZoom(at, at - glide.at);
597
682
  this._armGlide();
598
683
  };
599
- this._glideTimer = arm(tick, GLIDE_TICK_MS);
684
+ this._glideTimer = glideClock.arm(tick, GLIDE_TICK_MS);
600
685
  }
601
686
 
602
687
  /**
@@ -38,6 +38,7 @@ import { GeomType, GeometryBuffer } from '../mvt.js';
38
38
  import type { FeatureCursor, VectorTile } from '../mvt.js';
39
39
  import type { PreparedLayer, PreparedStyle } from '../paint.js';
40
40
  import type { MapStyleLayer } from '../style.js';
41
+ import type { TileId } from '../proj.js';
41
42
  import { buildTileLabels } from '../anchors.js';
42
43
  import type { GlLabelData } from '../anchors.js';
43
44
 
@@ -324,6 +325,9 @@ interface Group {
324
325
  export function buildTileBuckets(
325
326
  tile: VectorTile,
326
327
  prepared: PreparedStyle,
328
+ /** Which tile — what a label layer's `snapInto` distance is measured
329
+ * against (`../anchors.ts`). */
330
+ id?: TileId,
327
331
  ): GlTileData {
328
332
  const started = now();
329
333
  const line = new Stream(1024);
@@ -445,7 +449,7 @@ export function buildTileBuckets(
445
449
  fill: fill.take(),
446
450
  fillRecords: fill.count,
447
451
  draws,
448
- labels: buildTileLabels(tile, prepared, TILE_EXTENT),
452
+ labels: buildTileLabels(tile, prepared, TILE_EXTENT, id),
449
453
  stats: {
450
454
  features,
451
455
  lineRecords: line.count,
@@ -12,6 +12,7 @@
12
12
  // specifier would make every build depend on Node's type declarations.
13
13
  import { prepareStyle } from '../paint.js';
14
14
  import type { PreparedStyle } from '../paint.js';
15
+ import type { TileId } from '../proj.js';
15
16
  import { parseVectorTile } from '../sources.js';
16
17
  import type { MapStyleLayer } from '../style.js';
17
18
  import { buildTileBuckets } from './buckets.js';
@@ -19,7 +20,13 @@ import { buildTileBuckets } from './buckets.js';
19
20
  /** What the store sends. */
20
21
  export type BuildRequest =
21
22
  | { type: 'style'; id: number; layers: MapStyleLayer[] }
22
- | { type: 'build'; job: number; style: number; bytes: Uint8Array };
23
+ | {
24
+ type: 'build';
25
+ job: number;
26
+ style: number;
27
+ bytes: Uint8Array;
28
+ tile: TileId;
29
+ };
23
30
 
24
31
  interface Port {
25
32
  on(event: 'message', listener: (message: unknown) => void): void;
@@ -45,7 +52,11 @@ parentPort?.on('message', (message) => {
45
52
  try {
46
53
  const prepared = styles.get(request.style);
47
54
  if (!prepared) throw new Error(`style ${request.style} was never sent`);
48
- const data = buildTileBuckets(parseVectorTile(request.bytes), prepared);
55
+ const data = buildTileBuckets(
56
+ parseVectorTile(request.bytes),
57
+ prepared,
58
+ request.tile,
59
+ );
49
60
  const transfer = [data.line, data.fill];
50
61
  if (data.labels) transfer.push(data.labels.anchors.buffer as ArrayBuffer);
51
62
  parentPort.postMessage({ job: request.job, data }, transfer);