@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
@@ -18,7 +18,14 @@
18
18
  // projection — markers, overlays, labels, `project()`. `tileCover` reads a
19
19
  // smaller tile one level deeper instead, which puts every image at its own
20
20
  // natural size on the one world everything shares.
21
- import { DEFAULT_TILE_SIZE, tileCover, transformFor } from '../proj.js';
21
+ import {
22
+ BELOW,
23
+ DEFAULT_TILE_SIZE,
24
+ FILL_DEPTH,
25
+ fillFromBelow,
26
+ tileCover,
27
+ transformFor,
28
+ } from '../proj.js';
22
29
  import type { MapCamera, TileId, TilePyramid } from '../proj.js';
23
30
  import type { GlTileData } from './buckets.js';
24
31
  import type { RenderTile } from './renderer.js';
@@ -27,6 +34,17 @@ import type { RenderTile } from './renderer.js';
27
34
  * source has no data there, `undefined` while it is still to come. */
28
35
  export interface TileLookup {
29
36
  get(tile: TileId): GlTileData | null | undefined;
37
+ /**
38
+ * What the store has answered for at or under a tile: `'here'` for the
39
+ * tile itself, `'below'` for only tiles under it — within `FILL_DEPTH`
40
+ * levels — and `undefined` for neither.
41
+ *
42
+ * What lets a hole's search for pieces skip the parts of the pyramid that
43
+ * hold nothing. Without it the search asks `get` for every tile down to
44
+ * that depth — which costs lookups, and stamps a tile still loading as
45
+ * used, so a load the view has left is not cancelled.
46
+ */
47
+ holds?(tile: TileId): 'here' | 'below' | undefined;
30
48
  }
31
49
 
32
50
  export interface CoverResult {
@@ -53,10 +71,18 @@ const MAX_ANCESTOR = 8;
53
71
  * The frame's tiles, centre-out, each with its screen square and its clip.
54
72
  *
55
73
  * A hole — a tile still loading, or one the source has no data for — is
56
- * covered from whichever side has geometry: the nearest ancestor, drawn at
57
- * its own larger size and clipped to the hole; or, zooming out, the four
58
- * children, when all of them are in hand. `AGENTS.md`'s rule for the
59
- * retained cache holds here too: a pyramid has two neighbours.
74
+ * covered from whichever side has geometry. Zooming out, that is the tiles
75
+ * under it: each quarter from the nearest level that has it, down to
76
+ * `FILL_DEPTH`. Whatever they leave, and the whole of a hole with nothing
77
+ * under it, is the nearest ancestor's, drawn at its own larger size and
78
+ * clipped to each gap. `AGENTS.md`'s rule for the retained cache holds here
79
+ * too: a pyramid has two neighbours.
80
+ *
81
+ * The first cut tried the ancestor first, and the children only when all
82
+ * four of them were in hand. A zoom out leaves the level it came from in
83
+ * the middle of the view, covering only part of the tiles at the edges, and
84
+ * a quick one leaves it two or three levels down: both were the background,
85
+ * with the sharper tiles in hand.
60
86
  */
61
87
  export function renderCover(
62
88
  camera: MapCamera,
@@ -118,53 +144,62 @@ export function renderCover(
118
144
  own++;
119
145
  continue;
120
146
  }
121
- // An ancestor: the same ground, `2^k` times the size, from `sub` cells
122
- // above and to the left of this entry's square.
123
- let found = false;
147
+ // Under it: a tile with no data has nothing under it either, and past
148
+ // the pyramid's depth there is nothing to find.
124
149
  const { z, x, y } = entry.tile;
150
+ const below = fillFromBelow(
151
+ entry.tile,
152
+ data === null ? 0 : Math.min(FILL_DEPTH, pyramid.maxZoom - z),
153
+ (under) => {
154
+ const held = lookup.holds ? lookup.holds(under) : 'here';
155
+ if (held === undefined) return undefined;
156
+ if (held === 'below') return BELOW;
157
+ const got = lookup.get(under);
158
+ return got === undefined ? BELOW : got;
159
+ },
160
+ );
161
+ for (const piece of below.pieces) {
162
+ const size = clip.width / piece.span;
163
+ const px = clip.x + piece.x * size;
164
+ const py = clip.y + piece.y * size;
165
+ tiles.push({
166
+ data: piece.value,
167
+ x: px,
168
+ y: py,
169
+ size,
170
+ clip: { x: px, y: py, width: size, height: size },
171
+ });
172
+ }
173
+ if (below.covered) descendants++;
174
+ if (below.gaps.length === 0) continue;
175
+ // Over it: an ancestor, the same ground `2^k` times the size, from
176
+ // `sub` cells above and to the left of this entry's square — drawn once
177
+ // for each gap, clipped to it.
125
178
  for (let k = 1; k <= MAX_ANCESTOR && z - k >= pyramid.minZoom; k++) {
126
179
  const ancestor = { z: z - k, x: x >> k, y: y >> k };
127
180
  const stand = lookup.get(ancestor);
128
181
  if (!stand) continue;
129
- const span = 1 << k;
130
- const size = clip.width * span;
131
- tiles.push({
132
- data: stand,
133
- x: clip.x - (x - (ancestor.x << k)) * clip.width,
134
- y: clip.y - (y - (ancestor.y << k)) * clip.width,
135
- size,
136
- clip,
137
- });
182
+ const size = clip.width * (1 << k);
183
+ const sx = clip.x - (x - (ancestor.x << k)) * clip.width;
184
+ const sy = clip.y - (y - (ancestor.y << k)) * clip.width;
185
+ for (const gap of below.gaps) {
186
+ const edge = clip.width / gap.span;
187
+ tiles.push({
188
+ data: stand,
189
+ x: sx,
190
+ y: sy,
191
+ size,
192
+ clip: {
193
+ x: clip.x + gap.x * edge,
194
+ y: clip.y + gap.y * edge,
195
+ width: edge,
196
+ height: edge,
197
+ },
198
+ });
199
+ }
138
200
  ancestors++;
139
- found = true;
140
201
  break;
141
202
  }
142
- if (found || data === null || z + 1 > pyramid.maxZoom) continue;
143
- // Zooming out: the finer level is what is in hand. Only when all four
144
- // children have answered, or the hole would be patched with holes.
145
- const children: (GlTileData | null)[] = [];
146
- for (let dy = 0; dy < 2; dy++) {
147
- for (let dx = 0; dx < 2; dx++) {
148
- const child = lookup.get({ z: z + 1, x: x * 2 + dx, y: y * 2 + dy });
149
- if (child === undefined) break;
150
- children.push(child);
151
- }
152
- }
153
- if (children.length !== 4) continue;
154
- const half = clip.width / 2;
155
- children.forEach((child, i) => {
156
- if (!child) return;
157
- const cx = clip.x + (i % 2) * half;
158
- const cy = clip.y + Math.floor(i / 2) * half;
159
- tiles.push({
160
- data: child,
161
- x: cx,
162
- y: cy,
163
- size: half,
164
- clip: { x: cx, y: cy, width: half, height: half },
165
- });
166
- });
167
- descendants++;
168
203
  }
169
204
  return { tiles, missing, level, own, ancestors, descendants, inView };
170
205
  }
@@ -17,7 +17,7 @@
17
17
  // fits its street at this zoom, it would be cut by the edge, or something
18
18
  // that outranks it arrives.
19
19
  // - **Labels fade**, in and out, over {@link FADE_MS}. A label never pops;
20
- // one whose raster is still being set waits, invisibly, and fades in
20
+ // one whose field is still being set waits, invisibly, and fades in
21
21
  // when it lands.
22
22
  // - **Labels do not slide.** Anchors are fixed ground, so a label moves
23
23
  // exactly with the map; when a street's label leaves the view another
@@ -42,8 +42,16 @@ import {
42
42
  estimateWidth,
43
43
  } from '../anchors.js';
44
44
  import type { GlLabelData } from '../anchors.js';
45
- import { haloReach } from './text.js';
45
+ import { fieldReach } from './text.js';
46
46
  import type { AtlasEntry, LabelAtlas } from './text.js';
47
+ import {
48
+ DEFAULT_ICON_COLOR,
49
+ DEFAULT_ICON_GLYPH_COLOR,
50
+ DEFAULT_ICON_SIZE,
51
+ ICON_GAP,
52
+ isMapIcon,
53
+ } from '../icons.js';
54
+ import type { MapIcon } from '../icons.js';
47
55
 
48
56
  /** A rectangle in device pixels. */
49
57
  interface Rect {
@@ -85,23 +93,25 @@ export interface PlacementFrame {
85
93
  * must, and what the zoom uncovers is named once it stops — not labels
86
94
  * arriving and leaving at every step of it. `true` by default. */
87
95
  admit?: boolean;
88
- /** The camera is moving: a label keeps the raster it has, rather than
89
- * asking for one at each size its zoom ramp passes through. */
90
- moving?: boolean;
91
96
  }
92
97
 
93
98
  /** Floats per label instance; the layout `renderer.ts` binds. */
94
- export const LABEL_INSTANCE = 18;
99
+ export const LABEL_INSTANCE = 19;
95
100
 
96
101
  /** The frame's labels, ready to draw. */
97
102
  export interface LabelBatch {
98
103
  atlas: LabelAtlas;
99
104
  /** {@link LABEL_INSTANCE} floats per label: centre x, y (device
100
- * pixels); cos, sin of the baseline; the atlas rect x, y, w, h; ink
101
- * and halo colour, premultiplied and faded; halo radius; `1` to set
102
- * the label on whole pixels. */
105
+ * pixels); cos, sin of the baseline; the field's rect in the atlas x,
106
+ * y, w, h (texels); ink and halo colour, premultiplied and faded; halo
107
+ * radius (device pixels); `1` to set the label on whole pixels; and
108
+ * device pixels per field texel — the drawn size over the atlas's
109
+ * base. */
103
110
  instances: Float32Array;
104
111
  count: number;
112
+ /** Labels drawn: fewer than `count` where an icon is two instances of
113
+ * its own beside its name's. `count` where absent. */
114
+ labels?: number;
105
115
  }
106
116
 
107
117
  export interface PlacementStats {
@@ -130,12 +140,23 @@ const CELL = 64;
130
140
  interface LayerLabels {
131
141
  id: string;
132
142
  rank: number;
133
- /** Device pixels, whole — the raster's size. */
143
+ /** Device pixels — not rounded: one field draws any size. */
134
144
  size: number;
135
145
  repeat: number;
136
146
  ink: Rgba;
137
147
  halo: Rgba | null;
138
148
  haloPx: number;
149
+ icon: LayerIcon | null;
150
+ }
151
+
152
+ /** A layer's icon at a zoom: device pixels across, the gap to the name,
153
+ * and its two colours. */
154
+ interface LayerIcon {
155
+ name: MapIcon;
156
+ size: number;
157
+ gap: number;
158
+ plate: Rgba;
159
+ glyph: Rgba;
139
160
  }
140
161
 
141
162
  /** A label on screen, or fading. Its ground is mercator, so it outlives
@@ -158,8 +179,6 @@ interface Shown {
158
179
  priority: number;
159
180
  opacity: number;
160
181
  placed: boolean;
161
- /** The size it has a raster at — drawn until the current size's lands. */
162
- drawn: number;
163
182
  }
164
183
 
165
184
  interface Candidate {
@@ -172,6 +191,9 @@ interface Candidate {
172
191
  point: boolean;
173
192
  sx: number;
174
193
  sy: number;
194
+ /** How far right of `sx` its box's centre is: an icon's name is set
195
+ * beside it. Device pixels; set once the box is measured. */
196
+ ox: number;
175
197
  angle: number;
176
198
  cos: number;
177
199
  sin: number;
@@ -226,7 +248,7 @@ export class LabelPlacer {
226
248
 
227
249
  /**
228
250
  * Choose the frame's labels. Asks `atlas` for each contender's box, as
229
- * the frame's budget allows, and for each winner's raster.
251
+ * the frame's budget allows, and for each winner's field.
230
252
  */
231
253
  place(frame: PlacementFrame, atlas: LabelAtlas): void {
232
254
  const started = now();
@@ -372,18 +394,28 @@ export class LabelPlacer {
372
394
  }
373
395
  const box = atlas.measure(c.text, c.size);
374
396
  if (!box || box.width === 0) continue;
375
- const w = box.width;
376
- const h = box.height;
397
+ let w = box.width;
398
+ let h = box.height;
377
399
  if (!c.point) {
378
400
  const need = w / 2 + h * LINE_MARGIN;
379
401
  if (c.avail < (c.shown ? need * 0.9 : need)) continue;
380
402
  }
403
+ // An icon on the point and the name beside it are one box, placed
404
+ // and given way as one.
405
+ const icon = this._icon(layers[c.layer], c.point, atlas);
406
+ if (icon) {
407
+ const full = icon.size + icon.gap + w;
408
+ c.ox = (full - icon.size) / 2;
409
+ w = full;
410
+ h = Math.max(h, icon.size);
411
+ }
412
+ const bx = c.sx + c.ox;
381
413
  const hw = (Math.abs(c.cos) * w + Math.abs(c.sin) * h) / 2;
382
414
  const hh = (Math.abs(c.sin) * w + Math.abs(c.cos) * h) / 2;
383
415
  if (
384
- c.sx - hw < inset ||
416
+ bx - hw < inset ||
385
417
  c.sy - hh < inset ||
386
- c.sx + hw > width - inset ||
418
+ bx + hw > width - inset ||
387
419
  c.sy + hh > height - inset
388
420
  ) {
389
421
  continue;
@@ -425,7 +457,6 @@ export class LabelPlacer {
425
457
  size: c.size,
426
458
  opacity: 0,
427
459
  placed: false,
428
- drawn: 0,
429
460
  } as Shown);
430
461
  fresh.mx = c.mx;
431
462
  fresh.my = c.my;
@@ -442,8 +473,12 @@ export class LabelPlacer {
442
473
  }
443
474
  shown.placed = true;
444
475
  shown.size = c.size;
445
- if (!frame.moving || shown.drawn === 0)
446
- atlas.entry(shown.text, shown.size);
476
+ atlas.entry(shown.text);
477
+ const icon = this._icon(layers[shown.layer], shown.point, atlas);
478
+ if (icon) {
479
+ atlas.icon(icon.name, 'plate');
480
+ atlas.icon(icon.name, 'glyph');
481
+ }
447
482
  }
448
483
 
449
484
  this.stats = {
@@ -464,24 +499,27 @@ export class LabelPlacer {
464
499
  this._last = frame.now;
465
500
  const step = dt / FADE_MS;
466
501
  const layers = this._layersAt(frame.style, frame.zoom, frame.scale);
467
- const reach = haloReach(atlas.pad);
502
+ // How far past its glyphs a field sees, in its own texels: the widest
503
+ // halo it can draw, times the label's scale.
504
+ const reach = fieldReach(atlas.pad);
468
505
  const halfW = frame.width / 2;
469
506
  const halfH = frame.height / 2;
470
507
  let count = 0;
508
+ let labels = 0;
471
509
  for (const shown of [...this._shown]) {
472
510
  const layer = layers[shown.layer];
473
- let entry: AtlasEntry | null;
474
- if (frame.moving && shown.drawn > 0 && shown.drawn !== shown.size) {
475
- // Its zoom ramp has moved on; the size it has serves until the
476
- // view is still.
477
- entry = atlas.entry(shown.text, shown.drawn);
478
- } else {
479
- entry = atlas.entry(shown.text, shown.size);
480
- if (entry) shown.drawn = shown.size;
481
- else if (shown.drawn > 0) entry = atlas.entry(shown.text, shown.drawn);
482
- }
511
+ // One field for every size: a zoom ramp that grows the type draws the
512
+ // same raster larger, the frame it changes.
513
+ const entry = atlas.entry(shown.text);
514
+ // A name set beside an icon waits for the icon as well: the name
515
+ // alone is what the icon is there to explain.
516
+ const icon = this._icon(layer, shown.point, atlas);
517
+ const plate = icon ? atlas.icon(icon.name, 'plate') : null;
518
+ const glyph = icon ? atlas.icon(icon.name, 'glyph') : null;
519
+ const ready =
520
+ entry !== null && (!icon || (plate !== null && glyph !== null));
483
521
  // Nothing to show yet: wait at zero rather than fade in unseen.
484
- if (entry && layer) {
522
+ if (ready && layer) {
485
523
  shown.opacity = shown.placed
486
524
  ? Math.min(1, shown.opacity + step)
487
525
  : Math.max(0, shown.opacity - step);
@@ -492,44 +530,111 @@ export class LabelPlacer {
492
530
  this._shown.delete(shown);
493
531
  continue;
494
532
  }
495
- if (!entry || !layer || shown.opacity <= 0) continue;
533
+ if (!ready || !entry || !layer || shown.opacity <= 0) continue;
496
534
  let dx = shown.mx - frame.centerX;
497
535
  dx -= Math.round(dx);
498
536
  const sx = halfW + dx * frame.world;
499
537
  const sy = halfH + (shown.my - frame.centerY) * frame.world;
500
538
  const eased = shown.opacity * shown.opacity * (3 - 2 * shown.opacity);
501
- if (this._instances.length < (count + 1) * LABEL_INSTANCE) {
502
- const grown = new Float32Array(this._instances.length * 2);
503
- grown.set(this._instances);
504
- this._instances = grown;
505
- }
506
- const d = this._instances;
507
- const at = count * LABEL_INSTANCE;
508
- const level = shown.angle === 0;
509
- d[at] = sx;
510
- d[at + 1] = sy;
511
- d[at + 2] = level ? 1 : Math.cos(shown.angle);
512
- d[at + 3] = level ? 0 : Math.sin(shown.angle);
513
- d[at + 4] = entry.x;
514
- d[at + 5] = entry.y;
515
- d[at + 6] = entry.width;
516
- d[at + 7] = entry.height;
517
539
  const ink = premultiplied(layer.ink, eased);
518
- d[at + 8] = ink[0];
519
- d[at + 9] = ink[1];
520
- d[at + 10] = ink[2];
521
- d[at + 11] = ink[3];
522
540
  const halo = layer.halo ? premultiplied(layer.halo, eased) : ZERO;
523
- d[at + 12] = halo[0];
524
- d[at + 13] = halo[1];
525
- d[at + 14] = halo[2];
526
- d[at + 15] = halo[3];
527
- d[at + 16] = layer.halo ? Math.min(layer.haloPx, reach) : 0;
528
- d[at + 17] = level ? 1 : 0;
529
- count++;
541
+ const k = shown.size / atlas.base;
542
+ const haloPx = layer.halo ? Math.min(layer.haloPx, reach * k) : 0;
543
+ if (icon && plate && glyph) {
544
+ // The plate under its halo, the glyph on it, and the name level
545
+ // beside it: the string is its field less the margin, and its
546
+ // left edge goes the gap past the plate's right.
547
+ const ki = icon.size / atlas.base;
548
+ const plateHalo = layer.halo ? Math.min(layer.haloPx, reach * ki) : 0;
549
+ count = this._put(
550
+ count,
551
+ sx,
552
+ sy,
553
+ 0,
554
+ plate,
555
+ premultiplied(icon.plate, eased),
556
+ halo,
557
+ plateHalo,
558
+ ki,
559
+ );
560
+ count = this._put(
561
+ count,
562
+ sx,
563
+ sy,
564
+ 0,
565
+ glyph,
566
+ premultiplied(icon.glyph, eased),
567
+ ZERO,
568
+ 0,
569
+ ki,
570
+ );
571
+ const tx =
572
+ sx +
573
+ icon.size / 2 +
574
+ icon.gap +
575
+ ((entry.width - 2 * atlas.pad) * k) / 2;
576
+ count = this._put(count, tx, sy, 0, entry, ink, halo, haloPx, k);
577
+ } else {
578
+ count = this._put(
579
+ count,
580
+ sx,
581
+ sy,
582
+ shown.angle,
583
+ entry,
584
+ ink,
585
+ halo,
586
+ haloPx,
587
+ k,
588
+ );
589
+ }
590
+ labels++;
530
591
  }
531
- this.stats.drawn = count;
532
- return { atlas, instances: this._instances, count };
592
+ this.stats.drawn = labels;
593
+ return { atlas, instances: this._instances, count, labels };
594
+ }
595
+
596
+ /** One instance — a label's string, or a piece of its icon — written at
597
+ * `count`: answers the count after it. Level (`angle` 0) is set on
598
+ * whole pixels. */
599
+ private _put(
600
+ count: number,
601
+ x: number,
602
+ y: number,
603
+ angle: number,
604
+ entry: AtlasEntry,
605
+ ink: Rgba,
606
+ halo: Rgba,
607
+ haloPx: number,
608
+ scale: number,
609
+ ): number {
610
+ if (this._instances.length < (count + 1) * LABEL_INSTANCE) {
611
+ const grown = new Float32Array(this._instances.length * 2);
612
+ grown.set(this._instances);
613
+ this._instances = grown;
614
+ }
615
+ const d = this._instances;
616
+ const at = count * LABEL_INSTANCE;
617
+ const level = angle === 0;
618
+ d[at] = x;
619
+ d[at + 1] = y;
620
+ d[at + 2] = level ? 1 : Math.cos(angle);
621
+ d[at + 3] = level ? 0 : Math.sin(angle);
622
+ d[at + 4] = entry.x;
623
+ d[at + 5] = entry.y;
624
+ d[at + 6] = entry.width;
625
+ d[at + 7] = entry.height;
626
+ d[at + 8] = ink[0];
627
+ d[at + 9] = ink[1];
628
+ d[at + 10] = ink[2];
629
+ d[at + 11] = ink[3];
630
+ d[at + 12] = halo[0];
631
+ d[at + 13] = halo[1];
632
+ d[at + 14] = halo[2];
633
+ d[at + 15] = halo[3];
634
+ d[at + 16] = haloPx;
635
+ d[at + 17] = level ? 1 : 0;
636
+ d[at + 18] = scale;
637
+ return count + 1;
533
638
  }
534
639
 
535
640
  // --- internals -------------------------------------------------------------
@@ -587,6 +692,7 @@ export class LabelPlacer {
587
692
  point,
588
693
  sx,
589
694
  sy,
695
+ ox: 0,
590
696
  angle: a,
591
697
  cos: Math.cos(a),
592
698
  sin: Math.sin(a),
@@ -607,6 +713,18 @@ export class LabelPlacer {
607
713
  };
608
714
  }
609
715
 
716
+ /** The icon a label of `layer` is set with: none for a name along a
717
+ * street, and none where the atlas cannot draw it — the name is then set
718
+ * alone rather than not at all. */
719
+ private _icon(
720
+ layer: LayerLabels | null | undefined,
721
+ point: boolean,
722
+ atlas: LabelAtlas,
723
+ ): LayerIcon | null {
724
+ const icon = point ? (layer?.icon ?? null) : null;
725
+ return icon && !atlas.iconFailed(icon.name) ? icon : null;
726
+ }
727
+
610
728
  /** Each symbol layer's labelling at this zoom, by layer index — null
611
729
  * where it does not label. */
612
730
  private _layersAt(
@@ -630,13 +748,13 @@ export class LabelPlacer {
630
748
  symbol.textHaloWidth === undefined
631
749
  ? 1
632
750
  : resolveZoomed(symbol.textHaloWidth, zoom);
751
+ // Not rounded: a field draws any size, so a ramp grows the type
752
+ // continuously rather than a whole pixel at a time.
633
753
  const size = Math.max(
634
754
  1,
635
- Math.round(
636
- (symbol.textSize === undefined
637
- ? 12
638
- : resolveZoomed(symbol.textSize, zoom)) * scale,
639
- ),
755
+ (symbol.textSize === undefined
756
+ ? 12
757
+ : resolveZoomed(symbol.textSize, zoom)) * scale,
640
758
  );
641
759
  return {
642
760
  id: layer.id,
@@ -646,10 +764,43 @@ export class LabelPlacer {
646
764
  ink,
647
765
  halo: halo && haloWidth > 0 ? halo : null,
648
766
  haloPx: haloWidth * scale,
767
+ icon: this._iconOf(symbol, zoom, scale),
649
768
  };
650
769
  });
651
770
  }
652
771
 
772
+ /** A layer's icon at this zoom, or null where it sets none — or names
773
+ * one this version does not draw, or a colour that does not parse. */
774
+ private _iconOf(
775
+ symbol: SymbolLayer,
776
+ zoom: number,
777
+ scale: number,
778
+ ): LayerIcon | null {
779
+ if (!isMapIcon(symbol.icon)) return null;
780
+ const plate = this._color(
781
+ symbol.iconColor
782
+ ? resolveZoomed(symbol.iconColor, zoom)
783
+ : DEFAULT_ICON_COLOR,
784
+ );
785
+ const glyph = this._color(
786
+ symbol.iconGlyphColor
787
+ ? resolveZoomed(symbol.iconGlyphColor, zoom)
788
+ : DEFAULT_ICON_GLYPH_COLOR,
789
+ );
790
+ if (!plate || !glyph) return null;
791
+ const size =
792
+ symbol.iconSize === undefined
793
+ ? DEFAULT_ICON_SIZE
794
+ : resolveZoomed(symbol.iconSize, zoom);
795
+ return {
796
+ name: symbol.icon,
797
+ size: Math.max(1, Math.round(size * scale)),
798
+ gap: ICON_GAP * scale,
799
+ plate,
800
+ glyph,
801
+ };
802
+ }
803
+
653
804
  private _color(value: string): Rgba | null {
654
805
  let color = this._colors.get(value);
655
806
  if (color === undefined) {
@@ -743,11 +894,12 @@ class CollisionGrid {
743
894
  const out = this._scratch;
744
895
  out.length = 0;
745
896
  if (c.angle === 0) {
897
+ const x = c.sx + c.ox;
746
898
  out.push(
747
899
  0,
748
- c.sx - w / 2 - pad,
900
+ x - w / 2 - pad,
749
901
  c.sy - h / 2 - pad,
750
- c.sx + w / 2 + pad,
902
+ x + w / 2 + pad,
751
903
  c.sy + h / 2 + pad,
752
904
  );
753
905
  return out;