@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
@@ -63,7 +63,7 @@ import type { OverlayBucket } from './overlays.js';
63
63
  import { GL_PANE } from './pane.js';
64
64
  import { LABEL_INSTANCE, LabelPlacer } from './placement.js';
65
65
  import type { LabelBatch, PlacementFrame } from './placement.js';
66
- import { GlMapRenderer } from './renderer.js';
66
+ import { GlMapRenderer, gatesAt } from './renderer.js';
67
67
  import type {
68
68
  AttributionDraw,
69
69
  FadeFrame,
@@ -72,7 +72,7 @@ import type {
72
72
  RenderTile,
73
73
  } from './renderer.js';
74
74
  import { GlTileStore } from './store.js';
75
- import { LabelAtlas, SurfaceTextEngine } from './text.js';
75
+ import { LabelAtlas, SurfaceTextEngine, fieldBase } from './text.js';
76
76
 
77
77
  const h = React.createElement;
78
78
 
@@ -193,6 +193,12 @@ const BUILD_BUDGET_MS = 6;
193
193
  * — the one label cost that can be large (the first strings on X11 load
194
194
  * fonts and rasterize glyphs in JS). Placement's remainder waits a frame. */
195
195
  const TEXT_BUDGET_MOVING_MS = 1;
196
+ /** Milliseconds a frame may spend making label fields (`text.ts`), about
197
+ * 0.2 ms each, when there are any to make. */
198
+ const FIELD_BUDGET_MS = 4;
199
+ /** With `labelsWhileMoving`: milliseconds a frame may spend setting the
200
+ * text of names it has just placed, so they draw in it. */
201
+ const LIVE_TEXT_BUDGET_MS = 8;
196
202
  const TEXT_BUDGET_SETTLED_MS = 4;
197
203
  /**
198
204
  * How often a moving view is placed again, in milliseconds — every other
@@ -246,12 +252,161 @@ const EMPTY_COVER: CoverResult = {
246
252
  };
247
253
 
248
254
  /** Which levels a frame shows: one, or two while the second fades in. */
249
- interface LevelPlan {
255
+ export interface LevelPlan {
250
256
  base: CoverResult;
251
257
  next: CoverResult | null;
252
258
  alpha: number;
253
259
  }
254
260
 
261
+ /**
262
+ * The level fade: which level the frame is drawn from, and the one fading
263
+ * in over it.
264
+ *
265
+ * A new level is waited for — briefly, until every tile of it in view has
266
+ * answered — so the fade shows it arriving rather than a stand-in for it;
267
+ * then it fades in over the level it replaces, with an ease at both ends.
268
+ * A level more than one step away is not faded (the view it would fade
269
+ * from is sixteen times the tiles), and a change of target halfway
270
+ * through a fade takes the half-shown level as the one it fades from.
271
+ *
272
+ * What it cannot carry is a layer the style starts or stops drawing, which
273
+ * is {@link GateFader}'s: see there for why that is a separate thing and
274
+ * not a scene of its own.
275
+ */
276
+ export class LevelFader {
277
+ /** The level the frame is drawn from, once one has been drawn. */
278
+ shown: number | null = null;
279
+ private _fade: {
280
+ to: number;
281
+ start: number | null;
282
+ waitSince: number;
283
+ } | null = null;
284
+
285
+ /** Whether a fade is running or waiting to start. */
286
+ get fading(): boolean {
287
+ return this._fade !== null;
288
+ }
289
+
290
+ plan(
291
+ target: CoverResult,
292
+ cover: (level: number) => CoverResult,
293
+ options: { at: number; fadeMs: number },
294
+ ): LevelPlan {
295
+ const { at, fadeMs } = options;
296
+ const to = target.level;
297
+ const plain = { base: target, next: null, alpha: 0 };
298
+ if (fadeMs <= 0 || this.shown === null || Math.abs(to - this.shown) > 1) {
299
+ this.shown = to;
300
+ this._fade = null;
301
+ return plain;
302
+ }
303
+ if (to === this.shown) {
304
+ this._fade = null;
305
+ return plain;
306
+ }
307
+ let fade = this._fade;
308
+ if (!fade || fade.to !== to) {
309
+ if (fade && fade.start !== null && (at - fade.start) / fadeMs >= 0.5) {
310
+ this.shown = fade.to;
311
+ }
312
+ if (this.shown === to) {
313
+ this._fade = null;
314
+ return plain;
315
+ }
316
+ fade = this._fade = { to, start: null, waitSince: at };
317
+ }
318
+ const base = cover(this.shown);
319
+ if (fade.start === null) {
320
+ if (target.missing.length > 0 && at - fade.waitSince < FADE_WAIT_MS) {
321
+ return { base, next: null, alpha: 0 };
322
+ }
323
+ fade.start = at;
324
+ }
325
+ const p = (at - fade.start) / fadeMs;
326
+ if (p >= 1) {
327
+ this.shown = to;
328
+ this._fade = null;
329
+ return plain;
330
+ }
331
+ return { base, next: target, alpha: p * p * (3 - 2 * p) };
332
+ }
333
+ }
334
+
335
+ /**
336
+ * The zoom gate's fade: how much of each style layer to draw, as the camera
337
+ * zooms past the `minZoom` and `maxZoom` the style gives them.
338
+ *
339
+ * **Why this is not a scene.** A level fade cross-fades two whole pictures,
340
+ * and a picture is the natural unit for a change of level. A layer ending
341
+ * is not: `minZoom` is a zoom, the pyramid changes level at a different
342
+ * zoom, and the two flips land on different frames — so carrying the gate
343
+ * as a second scene means a fade retargeted in the middle of another one,
344
+ * which can only either snap to the arriving scene or restart from the
345
+ * outgoing one. Both are a step in the picture, and stepping is what the
346
+ * fade is for. That is what made buildings vanish for one wheel notch and
347
+ * come back for the next. An opacity per layer has no such conflict: each
348
+ * layer's number moves on its own, through any number of level fades, and
349
+ * both scenes of a level fade draw with the same numbers — so the one
350
+ * thing an opacity ramp is bad at, a map dissolving layer by layer, cannot
351
+ * happen here, because only the layers actually crossing a gate move.
352
+ */
353
+ export class GateFader {
354
+ /** Per style layer, in the prepared style's order. */
355
+ private _alpha: number[] = [];
356
+ private _at: number | null = null;
357
+ private _fading = false;
358
+
359
+ /** Whether any layer is between the gate's ends — a frame to ask for. */
360
+ get fading(): boolean {
361
+ return this._fading;
362
+ }
363
+
364
+ /**
365
+ * The frame's `layerAlpha`, or null for "what the gate says" — which is
366
+ * every frame where nothing is crossing one, and every frame at all with
367
+ * the fade turned off.
368
+ */
369
+ step(
370
+ style: PreparedStyle,
371
+ options: {
372
+ at: number;
373
+ fadeMs: number;
374
+ zoom: number;
375
+ /** Adaptive quality's, from the rung this frame is drawn at. */
376
+ detail: number;
377
+ },
378
+ ): readonly number[] | null {
379
+ const { at, fadeMs, zoom, detail } = options;
380
+ const targets = gatesAt(style, zoom, detail);
381
+ // The first frame, a restyle that changes the layer count, and the fade
382
+ // turned off: the gate, with nothing to advance.
383
+ const first = this._at === null || this._alpha.length !== targets.length;
384
+ if (fadeMs <= 0 || first) {
385
+ this._alpha = targets;
386
+ this._at = at;
387
+ this._fading = false;
388
+ return null;
389
+ }
390
+ const step = (at - (this._at ?? at)) / fadeMs;
391
+ this._at = at;
392
+ let fading = false;
393
+ let moved = false;
394
+ for (let i = 0; i < targets.length; i++) {
395
+ const to = targets[i];
396
+ const from = this._alpha[i];
397
+ if (from !== to) {
398
+ const next =
399
+ to > from ? Math.min(to, from + step) : Math.max(to, from - step);
400
+ this._alpha[i] = next;
401
+ if (next !== to) fading = true;
402
+ }
403
+ if (this._alpha[i] !== to) moved = true;
404
+ }
405
+ this._fading = fading;
406
+ return moved ? this._alpha : null;
407
+ }
408
+ }
409
+
255
410
  /** One source on the map, as a frame found it. */
256
411
  interface SourceCover {
257
412
  source: MapSource;
@@ -278,7 +433,13 @@ export interface GlMapPaneProps {
278
433
  children?: ReactNode;
279
434
  }
280
435
 
281
- class GlMapDriver implements MapView {
436
+ /**
437
+ * The driver: everything a frame is, between the controller's camera and
438
+ * the renderer. Exported for the tests that drive it against a recording
439
+ * GL table — there is no other way to see a whole frame's decisions, and
440
+ * this host cannot render one (indirect GLX has no shaders).
441
+ */
442
+ export class GlMapDriver implements MapView {
282
443
  props: GlMapPaneProps;
283
444
  theme: unknown = null;
284
445
  private readonly _controller: MapController;
@@ -301,13 +462,18 @@ class GlMapDriver implements MapView {
301
462
  private _zoomedAt = -Infinity;
302
463
  private _rung = 0;
303
464
  private readonly _cost = new CostModel();
304
- private _shown: number | null = null;
305
- private _fade: {
306
- to: number;
307
- start: number | null;
308
- waitSince: number;
309
- } | null = null;
465
+ private readonly _fader = new LevelFader();
466
+ private readonly _gates = new GateFader();
310
467
  private readonly _placer = new LabelPlacer();
468
+ /** Places the labels of the view a glide stops at, and shows nothing:
469
+ * what it asks the atlas for is measured and set while the glide is
470
+ * still being drawn. */
471
+ private readonly _scout = new LabelPlacer();
472
+ /** The destination the scout last placed, and whether that placement
473
+ * measured everything it offered — a frame's text budget can run out
474
+ * first, and then the next frame places it again. */
475
+ private _scoutedFor = '';
476
+ private _scoutDone = false;
311
477
  private readonly _markers = new MarkerBatcher();
312
478
  /** The overlays' bucket, and what it was built from. */
313
479
  private _overlay: {
@@ -323,7 +489,7 @@ class GlMapDriver implements MapView {
323
489
  /** The attribution's one instance. */
324
490
  private readonly _attributionText = new Float32Array(LABEL_INSTANCE);
325
491
  /** An attribution a frame could not draw yet — its string not measured,
326
- * or its raster not in the texture — and the size it is set at. */
492
+ * or its field not in the texture — and the size it is drawn at. */
327
493
  private _attributionWanted: { text: string; size: number } | null = null;
328
494
  /** When labels were last placed. */
329
495
  private _placedAt = -Infinity;
@@ -544,6 +710,9 @@ class GlMapDriver implements MapView {
544
710
  this._frame(gl, info);
545
711
  } finally {
546
712
  controller.painting = false;
713
+ // `onFrame` ran inside that, and a camera animation drives itself
714
+ // from it — so whatever it asked for is scheduled here.
715
+ controller.paintEnded();
547
716
  }
548
717
  } catch (error) {
549
718
  // Core hands an `onDraw` throw to `<glarea onError>` and nothing else;
@@ -604,69 +773,30 @@ class GlMapDriver implements MapView {
604
773
  return out;
605
774
  }
606
775
 
776
+ /**
777
+ * How long a moving frame may take, or null for "as long as it likes".
778
+ *
779
+ * **On unless turned off.** A renderer with no budget spends whatever a
780
+ * frame costs and asks for the next one on the following compositor tick
781
+ * regardless, so at the expensive end of a zoom sweep it takes the whole
782
+ * thread — and the app around it stops getting its timers. Measured on a
783
+ * fly across ten levels: without a budget the loop went a second at a time
784
+ * without running a `setTimeout`, and nothing inside it was slow, because
785
+ * the cost was spread over a hundred frames rather than spent in one call.
786
+ * With the budget, none. An embedding app should not have to know that to
787
+ * keep its own clock.
788
+ *
789
+ * What it costs is detail while the camera moves, and only while it moves:
790
+ * the frame after it settles draws everything again.
791
+ */
607
792
  private _budget(): number | null {
608
793
  const adaptive = this.props.map.adaptive;
609
- if (!adaptive) return null;
794
+ if (adaptive === false) return null;
610
795
  return typeof adaptive === 'object'
611
796
  ? (adaptive.budgetMs ?? DEFAULT_BUDGET_MS)
612
797
  : DEFAULT_BUDGET_MS;
613
798
  }
614
799
 
615
- /**
616
- * The level fade: which level the frame is drawn from, and the one fading
617
- * in over it.
618
- *
619
- * A new level is waited for — briefly, until every tile of it in view has
620
- * answered — so the fade shows it arriving rather than a stand-in for it;
621
- * then it fades in over the level it replaces, with an ease at both ends.
622
- * A level more than one step away is not faded (the view it would fade
623
- * from is sixteen times the tiles), and a change of target halfway
624
- * through a fade takes the half-shown level as the one it fades from.
625
- */
626
- private _planLevels(
627
- target: CoverResult,
628
- cover: (level: number) => CoverResult,
629
- at: number,
630
- ): LevelPlan {
631
- const fadeMs = this.props.map.levelFade ?? 0;
632
- const to = target.level;
633
- const plain = { base: target, next: null, alpha: 0 };
634
- if (fadeMs <= 0 || this._shown === null || Math.abs(to - this._shown) > 1) {
635
- this._shown = to;
636
- this._fade = null;
637
- return plain;
638
- }
639
- if (to === this._shown) {
640
- this._fade = null;
641
- return plain;
642
- }
643
- let fade = this._fade;
644
- if (!fade || fade.to !== to) {
645
- if (fade && fade.start !== null && (at - fade.start) / fadeMs >= 0.5) {
646
- this._shown = fade.to;
647
- }
648
- if (this._shown === to) {
649
- this._fade = null;
650
- return plain;
651
- }
652
- fade = this._fade = { to, start: null, waitSince: at };
653
- }
654
- const base = cover(this._shown);
655
- if (fade.start === null) {
656
- if (target.missing.length > 0 && at - fade.waitSince < FADE_WAIT_MS) {
657
- return { base, next: null, alpha: 0 };
658
- }
659
- fade.start = at;
660
- }
661
- const p = (at - fade.start) / fadeMs;
662
- if (p >= 1) {
663
- this._shown = to;
664
- this._fade = null;
665
- return plain;
666
- }
667
- return { base, next: target, alpha: p * p * (3 - 2 * p) };
668
- }
669
-
670
800
  private _frame(gl: unknown, info: DrawInfo): void {
671
801
  const map = this.props.map;
672
802
  const controller = this._controller;
@@ -716,6 +846,24 @@ class GlMapDriver implements MapView {
716
846
  return { source, store, pyramid, target };
717
847
  });
718
848
 
849
+ // Where a wheel's glide stops, while one is running: its tiles are
850
+ // asked for after the view's own, so the view the glide lands on is
851
+ // loaded — and its labels set, below — by the time it gets there.
852
+ const destination = moving ? controller.destination() : null;
853
+ const ahead = destination
854
+ ? covers.map((c) => {
855
+ const cover = renderCover(
856
+ destination,
857
+ pane,
858
+ scale,
859
+ c.pyramid,
860
+ c.store,
861
+ );
862
+ c.store.want(cover.missing);
863
+ return cover;
864
+ })
865
+ : null;
866
+
719
867
  // The level fade and adaptive quality are the first source's — the
720
868
  // basemap's; a pyramid over it is drawn at its own level throughout.
721
869
  const primary = covers[0] ?? null;
@@ -725,8 +873,9 @@ class GlMapDriver implements MapView {
725
873
  level,
726
874
  })
727
875
  : EMPTY_COVER;
876
+ const fadeMs = map.levelFade ?? 0;
728
877
  const plan: LevelPlan = primary
729
- ? this._planLevels(primary.target, coverAt, at)
878
+ ? this._fader.plan(primary.target, coverAt, { at, fadeMs })
730
879
  : { base: EMPTY_COVER, next: null, alpha: 0 };
731
880
  if (primary && plan.base !== primary.target) {
732
881
  primary.store.want(plan.base.missing);
@@ -769,13 +918,28 @@ class GlMapDriver implements MapView {
769
918
  };
770
919
  let rung = 0;
771
920
  let predictedMs = 0;
921
+ // An overview of the view: its ancestors every other level up to the
922
+ // pyramid's root, asked for after the view's own tiles and looked up
923
+ // every frame, so they stay loaded. A view is a speck at those levels,
924
+ // so this is a tile or two a level. It is what a fast zoom out lands
925
+ // on: a trackpad's momentum can cross fifteen levels in a quarter of a
926
+ // second, and every level it passes that has no tile draws the style's
927
+ // background alone — a frame of one flat colour, labels gone with the
928
+ // tiles, where a coarser tile would have drawn the place, blurred. With
929
+ // one level of it in reach two levels up, a hole is always filled from
930
+ // above (`renderCover`'s ancestors reach eight). The level just above
931
+ // the view comes first: it is also what the ladder's last rungs draw.
932
+ if (primary) {
933
+ const top = primary.pyramid.minZoom;
934
+ for (
935
+ let level = primary.target.level - 1;
936
+ level >= top;
937
+ level = level - 2 < top && level > top ? top : level - 2
938
+ ) {
939
+ primary.store.want(coverAt(level).missing);
940
+ }
941
+ }
772
942
  if (budget !== null && moving && primary) {
773
- // The coarser level is what the ladder's last rungs draw, so ask for
774
- // it too — after the view's own tiles, which come first.
775
- primary.store.want(
776
- coverAt(Math.max(primary.pyramid.minZoom, primary.target.level - 1))
777
- .missing,
778
- );
779
943
  const predict = (r: number): number => {
780
944
  const built = build(r);
781
945
  const work =
@@ -789,6 +953,24 @@ class GlMapDriver implements MapView {
789
953
  this._rung = rung;
790
954
  const { frame, fade } = build(rung);
791
955
 
956
+ // A layer crossing a gate — the style's `minZoom`, or this rung's
957
+ // `detail` — is ramped rather than cut, and both of a level fade's
958
+ // scenes draw it at the same ramp. Decided after the rung, because the
959
+ // rung is one of the gates: a moving frame that drops the style's
960
+ // newest layers to make its budget would otherwise take them out in
961
+ // one frame and hand them back in one more when the camera settled,
962
+ // which is a flicker on exactly the layers a zoom is looking at.
963
+ const layerAlpha = this._gates.step(prepared, {
964
+ at,
965
+ fadeMs,
966
+ zoom: camera.zoom,
967
+ detail: QUALITY_LADDER[rung].detail,
968
+ });
969
+ if (layerAlpha) {
970
+ frame.layerAlpha = layerAlpha;
971
+ if (fade) fade.frame.layerAlpha = layerAlpha;
972
+ }
973
+
792
974
  // The text: the labels, and the attribution, set in the same atlas.
793
975
  let labels: LabelBatch | null = null;
794
976
  let attribution: AttributionDraw | null = null;
@@ -798,14 +980,31 @@ class GlMapDriver implements MapView {
798
980
  try {
799
981
  const atlas = this._atlasFor(info.node, style, scale);
800
982
  if (atlas) {
801
- atlas.beginFrame(
802
- now() + (moving ? TEXT_BUDGET_MOVING_MS : TEXT_BUDGET_SETTLED_MS),
803
- );
983
+ // Live labels measure at the settled budget while moving too:
984
+ // what they admit mid-zoom has to be measured mid-zoom.
985
+ const live = map.labelsWhileMoving === true;
986
+ const textDeadline =
987
+ now() +
988
+ (moving && !live ? TEXT_BUDGET_MOVING_MS : TEXT_BUDGET_SETTLED_MS);
989
+ atlas.beginFrame(textDeadline);
804
990
  // The attribution before the names: it is one string, measured
805
991
  // once, and a frame whose budget went on names would leave it
806
992
  // for a later one — for as long as names keep arriving.
807
993
  attribution = this._attributionFor(atlas, frame);
808
994
  labels = this._labelsFor(atlas, frame, fade, at, moving);
995
+ if (destination && ahead) {
996
+ this._scoutFor(atlas, frame, destination, ahead, at);
997
+ } else if (this._scoutedFor !== '') {
998
+ this._scout.reset();
999
+ this._scoutedFor = '';
1000
+ }
1001
+ // The fields of strings already read back, on a budget of their
1002
+ // own: the text budget moving is 1 ms, five fields, and a jump
1003
+ // somewhere new reads back sixty names at once — they came in
1004
+ // over two hundred milliseconds that way, against none for the
1005
+ // coverage rasters fields replaced. This frame's draw uploads
1006
+ // what it makes.
1007
+ atlas.makeFields(Math.max(textDeadline, now() + FIELD_BUDGET_MS));
809
1008
  this._pumpSoon();
810
1009
  }
811
1010
  } catch (error) {
@@ -928,7 +1127,7 @@ class GlMapDriver implements MapView {
928
1127
  uploadBytes: stats.uploadBytes,
929
1128
  offscreen: stats.offscreen,
930
1129
  level,
931
- shownLevel: this._shown ?? level,
1130
+ shownLevel: this._fader.shown ?? level,
932
1131
  fade: stats.fade,
933
1132
  quality: rung,
934
1133
  predictedMs,
@@ -940,21 +1139,29 @@ class GlMapDriver implements MapView {
940
1139
  textPending: this._atlas?.pending ?? false,
941
1140
  },
942
1141
  };
943
- // A label still fading, strings this frame had no budget to measure, or
944
- // rasters still to go into the texture want the next frame; a raster
945
- // in flight asks for one itself when it lands.
1142
+ // A label still fading, strings this frame had no budget to measure,
1143
+ // fields still to be made, or fields still to go into the texture want
1144
+ // the next frame; a batch in flight asks for one itself when it lands.
946
1145
  const labelling =
947
1146
  labels !== null &&
948
1147
  (this._placer.animating ||
949
1148
  this._atlas?.starved === true ||
1149
+ this._atlas?.fielding === true ||
950
1150
  this._atlas?.uploading === true);
951
1151
  // An attribution this frame could not draw may have gone into the
952
1152
  // texture during it — the upload happens as the labels draw, after the
953
1153
  // frame chose what to draw — and then it is the next frame's.
954
1154
  const wanted = this._attributionWanted;
955
1155
  const attributing =
956
- wanted !== null && this._atlas?.entry(wanted.text, wanted.size) != null;
957
- if (more || this._fade || labelling || attributing) this.request();
1156
+ wanted !== null && this._atlas?.entry(wanted.text) != null;
1157
+ if (
1158
+ more ||
1159
+ this._fader.fading ||
1160
+ this._gates.fading ||
1161
+ labelling ||
1162
+ attributing
1163
+ )
1164
+ this.request();
958
1165
  if (!this._announced) {
959
1166
  this._announced = true;
960
1167
  this._pane?.notifyA11ySceneChanged?.();
@@ -1035,9 +1242,9 @@ class GlMapDriver implements MapView {
1035
1242
  this._noText = true;
1036
1243
  return null;
1037
1244
  }
1038
- // Margin for a halo of two logical pixels, and the texel either side
1039
- // that keeps its samples inside it (see `quadInset`).
1040
- this._atlas = new LabelAtlas(engine, { pad: 2 * Math.ceil(2 * scale) + 2 });
1245
+ // Fields set at a base size that follows the display's scale, so a
1246
+ // label on a 2x panel is sampled from a field twice as fine.
1247
+ this._atlas = new LabelAtlas(engine, { base: fieldBase(scale) });
1041
1248
  this._atlas.onChange = this.request;
1042
1249
  this._atlasKey = key;
1043
1250
  this._placer.reset();
@@ -1056,6 +1263,7 @@ class GlMapDriver implements MapView {
1056
1263
  at: number,
1057
1264
  moving: boolean,
1058
1265
  ): LabelBatch {
1266
+ const live = this.props.map.labelsWhileMoving === true;
1059
1267
  const from = fade && fade.alpha >= 0.5 ? fade.frame : frame;
1060
1268
  const centre = project(this._controller.camera().center);
1061
1269
  const placement: PlacementFrame = {
@@ -1070,21 +1278,76 @@ class GlMapDriver implements MapView {
1070
1278
  // The projection's world, which the cover lays every source out on.
1071
1279
  world: worldSize(frame.zoom, DEFAULT_TILE_SIZE) * frame.scale,
1072
1280
  now: at,
1073
- admit: at - this._zoomedAt >= ZOOM_QUIET_MS,
1074
- moving,
1281
+ // Live: every name the view offers, at every step of a zoom.
1282
+ admit: live || at - this._zoomedAt >= ZOOM_QUIET_MS,
1075
1283
  };
1076
- if (!moving || at - this._placedAt >= PLACE_INTERVAL_MS) {
1284
+ if (live || !moving || at - this._placedAt >= PLACE_INTERVAL_MS) {
1077
1285
  this._placer.place(placement, atlas);
1078
1286
  this._placedAt = at;
1079
1287
  }
1288
+ // Live: what placement asked for is set now, before the batch, so a
1289
+ // name placed in this frame is drawn in it — its field goes into the
1290
+ // texture ahead of the cap, before this frame's labels draw.
1291
+ if (live) atlas.setNow(now() + LIVE_TEXT_BUDGET_MS);
1080
1292
  return this._placer.batch(placement, atlas);
1081
1293
  }
1082
1294
 
1295
+ /**
1296
+ * Render ahead: place the labels of the view a glide stops at, so that
1297
+ * every string it will show is measured and asked of the atlas while the
1298
+ * glide's own frames are drawn. Nothing it places is drawn — the frame's
1299
+ * placer places the destination again when it gets there, and finds every
1300
+ * box measured and every field in the texture, so the labels fade in
1301
+ * when the view settles rather than a readback and an upload after.
1302
+ *
1303
+ * A fresh placement each time (the scout keeps no labels between runs;
1304
+ * holding a place is for what is on screen), and not every frame: when
1305
+ * the destination moves — another notch — or more of its tiles land, or
1306
+ * the last placement ran out of the frame's text budget before it had
1307
+ * measured everything. It measures out of that budget, after the frame's
1308
+ * own labels.
1309
+ */
1310
+ private _scoutFor(
1311
+ atlas: LabelAtlas,
1312
+ frame: RenderFrame,
1313
+ destination: MapCamera,
1314
+ covers: readonly CoverResult[],
1315
+ at: number,
1316
+ ): void {
1317
+ // The destination is recomputed from each frame's camera, so its last
1318
+ // digits wander; to a millionth of a degree it is the same place. And
1319
+ // it is a different question once more of its tiles are in hand.
1320
+ let held = 0;
1321
+ for (const c of covers) held += c.own;
1322
+ const key = `${destination.zoom}|${destination.center.lon.toFixed(6)}|${destination.center.lat.toFixed(6)}|${held}`;
1323
+ if (key === this._scoutedFor && this._scoutDone) return;
1324
+ this._scoutedFor = key;
1325
+ const centre = project(destination.center);
1326
+ this._scout.reset();
1327
+ this._scout.place(
1328
+ {
1329
+ width: frame.width,
1330
+ height: frame.height,
1331
+ scale: frame.scale,
1332
+ zoom: destination.zoom,
1333
+ style: frame.style,
1334
+ tiles: covers.flatMap((c) => c.tiles),
1335
+ centerX: centre.x,
1336
+ centerY: centre.y,
1337
+ world: worldSize(destination.zoom, DEFAULT_TILE_SIZE) * frame.scale,
1338
+ now: at,
1339
+ admit: true,
1340
+ },
1341
+ atlas,
1342
+ );
1343
+ this._scoutDone = !atlas.starved;
1344
+ }
1345
+
1083
1346
  /**
1084
1347
  * The attribution, as the retained renderer draws it: the same box on the
1085
1348
  * same pixels (`attributionLayout`), the text in the labels' face, from
1086
1349
  * the labels' atlas. Null while there is none to draw — `attribution=""`,
1087
- * or no source that names one — and until its raster is in the texture,
1350
+ * or no source that names one — and until its field is in the texture,
1088
1351
  * so the box and its text arrive together.
1089
1352
  */
1090
1353
  private _attributionFor(
@@ -1098,7 +1361,7 @@ class GlMapDriver implements MapView {
1098
1361
  const s = frame.scale;
1099
1362
  const size = ATTRIBUTION_SIZE * s;
1100
1363
  const box = atlas.measure(text, size);
1101
- const entry = box ? atlas.entry(text, size) : null;
1364
+ const entry = box ? atlas.entry(text) : null;
1102
1365
  if (!box || !entry) {
1103
1366
  this._attributionWanted = { text, size };
1104
1367
  return null;
@@ -1109,12 +1372,13 @@ class GlMapDriver implements MapView {
1109
1372
  s,
1110
1373
  );
1111
1374
  const palette = overlayPalette(this.theme);
1112
- // The string sits `pad` inside its raster, and a level label's quad is
1113
- // centred on its anchor and set on whole pixels: this anchor puts the
1114
- // string's corner on the layout's.
1375
+ // The string sits `pad` texels inside its field, the field is drawn
1376
+ // `k` device pixels a texel, and a level label's quad is centred on its
1377
+ // anchor: this anchor puts the string's corner on the layout's.
1378
+ const k = size / atlas.base;
1115
1379
  const d = this._attributionText;
1116
- d[0] = at.x - atlas.pad + entry.width / 2;
1117
- d[1] = at.y - atlas.pad + entry.height / 2;
1380
+ d[0] = at.x + (entry.width / 2 - atlas.pad) * k;
1381
+ d[1] = at.y + (entry.height / 2 - atlas.pad) * k;
1118
1382
  d[2] = 1;
1119
1383
  d[3] = 0;
1120
1384
  d[4] = entry.x;
@@ -1124,6 +1388,7 @@ class GlMapDriver implements MapView {
1124
1388
  d.set(premultiplied(parseColor(palette.text) ?? BLACK), 8);
1125
1389
  d.fill(0, 12, 17); // no halo: the box is what it reads against
1126
1390
  d[17] = 1;
1391
+ d[18] = k;
1127
1392
  return {
1128
1393
  box: at.box,
1129
1394
  boxColor: premultiplied(