@react-x11/components 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (579) hide show
  1. package/README.md +10 -4
  2. package/dist/charts/node.d.ts +11 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +44 -14
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +27 -24
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/index.d.ts +1 -1
  24. package/dist/code-language/index.d.ts.map +1 -1
  25. package/dist/code-language/index.js +1 -1
  26. package/dist/code-language/index.js.map +1 -1
  27. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  28. package/dist/code-language/languages/glsl.js +10 -2
  29. package/dist/code-language/languages/glsl.js.map +1 -1
  30. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  31. package/dist/code-language/languages/javascript.js +18 -3
  32. package/dist/code-language/languages/javascript.js.map +1 -1
  33. package/dist/code-language/languages/json.d.ts.map +1 -1
  34. package/dist/code-language/languages/json.js +10 -2
  35. package/dist/code-language/languages/json.js.map +1 -1
  36. package/dist/code-language/languages/shell.d.ts.map +1 -1
  37. package/dist/code-language/languages/shell.js +10 -2
  38. package/dist/code-language/languages/shell.js.map +1 -1
  39. package/dist/code-language/languages/sql.d.ts.map +1 -1
  40. package/dist/code-language/languages/sql.js +20 -2
  41. package/dist/code-language/languages/sql.js.map +1 -1
  42. package/dist/code-language/runs.d.ts +31 -0
  43. package/dist/code-language/runs.d.ts.map +1 -1
  44. package/dist/code-language/runs.js +105 -0
  45. package/dist/code-language/runs.js.map +1 -1
  46. package/dist/code-language/stream.d.ts +22 -0
  47. package/dist/code-language/stream.d.ts.map +1 -1
  48. package/dist/code-language/stream.js +259 -9
  49. package/dist/code-language/stream.js.map +1 -1
  50. package/dist/code-language/types.d.ts +5 -4
  51. package/dist/code-language/types.d.ts.map +1 -1
  52. package/dist/codeblock/index.d.ts +26 -2
  53. package/dist/codeblock/index.d.ts.map +1 -1
  54. package/dist/codeblock/index.js +57 -4
  55. package/dist/codeblock/index.js.map +1 -1
  56. package/dist/flow/draw.d.ts +50 -0
  57. package/dist/flow/draw.d.ts.map +1 -1
  58. package/dist/flow/draw.js +132 -33
  59. package/dist/flow/draw.js.map +1 -1
  60. package/dist/flow/gl/color.d.ts +13 -0
  61. package/dist/flow/gl/color.d.ts.map +1 -0
  62. package/dist/flow/gl/color.js +82 -0
  63. package/dist/flow/gl/color.js.map +1 -0
  64. package/dist/flow/gl/index.d.ts +60 -0
  65. package/dist/flow/gl/index.d.ts.map +1 -0
  66. package/dist/flow/gl/index.js +283 -0
  67. package/dist/flow/gl/index.js.map +1 -0
  68. package/dist/flow/gl/pack.d.ts +133 -0
  69. package/dist/flow/gl/pack.d.ts.map +1 -0
  70. package/dist/flow/gl/pack.js +408 -0
  71. package/dist/flow/gl/pack.js.map +1 -0
  72. package/dist/flow/gl/renderer.d.ts +95 -0
  73. package/dist/flow/gl/renderer.d.ts.map +1 -0
  74. package/dist/flow/gl/renderer.js +459 -0
  75. package/dist/flow/gl/renderer.js.map +1 -0
  76. package/dist/flow/gl/shaders.d.ts +79 -0
  77. package/dist/flow/gl/shaders.d.ts.map +1 -0
  78. package/dist/flow/gl/shaders.js +346 -0
  79. package/dist/flow/gl/shaders.js.map +1 -0
  80. package/dist/flow/gl/text.d.ts +318 -0
  81. package/dist/flow/gl/text.d.ts.map +1 -0
  82. package/dist/flow/gl/text.js +1103 -0
  83. package/dist/flow/gl/text.js.map +1 -0
  84. package/dist/flow/index.d.ts +1 -1
  85. package/dist/flow/index.d.ts.map +1 -1
  86. package/dist/flow/index.js +619 -64
  87. package/dist/flow/index.js.map +1 -1
  88. package/dist/flow/node.d.ts +621 -72
  89. package/dist/flow/node.d.ts.map +1 -1
  90. package/dist/flow/node.js +2253 -1018
  91. package/dist/flow/node.js.map +1 -1
  92. package/dist/flow/paint.d.ts +35 -0
  93. package/dist/flow/paint.d.ts.map +1 -0
  94. package/dist/flow/paint.js +393 -0
  95. package/dist/flow/paint.js.map +1 -0
  96. package/dist/flow/paths.d.ts +14 -0
  97. package/dist/flow/paths.d.ts.map +1 -1
  98. package/dist/flow/paths.js +45 -19
  99. package/dist/flow/paths.js.map +1 -1
  100. package/dist/flow/scene.d.ts +584 -0
  101. package/dist/flow/scene.d.ts.map +1 -0
  102. package/dist/flow/scene.js +1453 -0
  103. package/dist/flow/scene.js.map +1 -0
  104. package/dist/flow/types.d.ts +111 -1
  105. package/dist/flow/types.d.ts.map +1 -1
  106. package/dist/html/controls.d.ts +28 -0
  107. package/dist/html/controls.d.ts.map +1 -1
  108. package/dist/html/controls.js +52 -2
  109. package/dist/html/controls.js.map +1 -1
  110. package/dist/html/css/calc.d.ts +14 -0
  111. package/dist/html/css/calc.d.ts.map +1 -0
  112. package/dist/html/css/calc.js +344 -0
  113. package/dist/html/css/calc.js.map +1 -0
  114. package/dist/html/css/cascade.d.ts +262 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1373 -67
  117. package/dist/html/css/cascade.js.map +1 -1
  118. package/dist/html/css/color.d.ts +23 -0
  119. package/dist/html/css/color.d.ts.map +1 -0
  120. package/dist/html/css/color.js +740 -0
  121. package/dist/html/css/color.js.map +1 -0
  122. package/dist/html/css/content.d.ts +92 -0
  123. package/dist/html/css/content.d.ts.map +1 -0
  124. package/dist/html/css/content.js +388 -0
  125. package/dist/html/css/content.js.map +1 -0
  126. package/dist/html/css/counter-styles.d.ts +76 -0
  127. package/dist/html/css/counter-styles.d.ts.map +1 -0
  128. package/dist/html/css/counter-styles.js +893 -0
  129. package/dist/html/css/counter-styles.js.map +1 -0
  130. package/dist/html/css/decode.d.ts +12 -0
  131. package/dist/html/css/decode.d.ts.map +1 -0
  132. package/dist/html/css/decode.js +116 -0
  133. package/dist/html/css/decode.js.map +1 -0
  134. package/dist/html/css/parse.d.ts +110 -10
  135. package/dist/html/css/parse.d.ts.map +1 -1
  136. package/dist/html/css/parse.js +1473 -180
  137. package/dist/html/css/parse.js.map +1 -1
  138. package/dist/html/css/style.d.ts +501 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3729 -206
  141. package/dist/html/css/style.js.map +1 -1
  142. package/dist/html/css/ua.d.ts.map +1 -1
  143. package/dist/html/css/ua.js +65 -16
  144. package/dist/html/css/ua.js.map +1 -1
  145. package/dist/html/css/values.d.ts +37 -3
  146. package/dist/html/css/values.d.ts.map +1 -1
  147. package/dist/html/css/values.js +122 -48
  148. package/dist/html/css/values.js.map +1 -1
  149. package/dist/html/css/vars.d.ts +52 -0
  150. package/dist/html/css/vars.d.ts.map +1 -0
  151. package/dist/html/css/vars.js +358 -0
  152. package/dist/html/css/vars.js.map +1 -0
  153. package/dist/html/dom.d.ts +30 -4
  154. package/dist/html/dom.d.ts.map +1 -1
  155. package/dist/html/dom.js +278 -17
  156. package/dist/html/dom.js.map +1 -1
  157. package/dist/html/fonts.d.ts +106 -0
  158. package/dist/html/fonts.d.ts.map +1 -0
  159. package/dist/html/fonts.js +565 -0
  160. package/dist/html/fonts.js.map +1 -0
  161. package/dist/html/gif.d.ts +15 -0
  162. package/dist/html/gif.d.ts.map +1 -0
  163. package/dist/html/gif.js +229 -0
  164. package/dist/html/gif.js.map +1 -0
  165. package/dist/html/index.d.ts +50 -11
  166. package/dist/html/index.d.ts.map +1 -1
  167. package/dist/html/index.js +115 -9
  168. package/dist/html/index.js.map +1 -1
  169. package/dist/html/layout/block.d.ts +226 -3
  170. package/dist/html/layout/block.d.ts.map +1 -1
  171. package/dist/html/layout/block.js +3077 -219
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +367 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1742 -182
  176. package/dist/html/layout/boxes.js.map +1 -1
  177. package/dist/html/layout/cache.d.ts +58 -0
  178. package/dist/html/layout/cache.d.ts.map +1 -0
  179. package/dist/html/layout/cache.js +224 -0
  180. package/dist/html/layout/cache.js.map +1 -0
  181. package/dist/html/layout/collapse.d.ts +45 -0
  182. package/dist/html/layout/collapse.d.ts.map +1 -0
  183. package/dist/html/layout/collapse.js +246 -0
  184. package/dist/html/layout/collapse.js.map +1 -0
  185. package/dist/html/layout/css-grid.d.ts +7 -0
  186. package/dist/html/layout/css-grid.d.ts.map +1 -0
  187. package/dist/html/layout/css-grid.js +900 -0
  188. package/dist/html/layout/css-grid.js.map +1 -0
  189. package/dist/html/layout/flex.d.ts.map +1 -1
  190. package/dist/html/layout/flex.js +1025 -89
  191. package/dist/html/layout/flex.js.map +1 -1
  192. package/dist/html/layout/floats.d.ts +45 -6
  193. package/dist/html/layout/floats.d.ts.map +1 -1
  194. package/dist/html/layout/floats.js +113 -14
  195. package/dist/html/layout/floats.js.map +1 -1
  196. package/dist/html/layout/grid-lines.d.ts +39 -0
  197. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  198. package/dist/html/layout/grid-lines.js +119 -0
  199. package/dist/html/layout/grid-lines.js.map +1 -0
  200. package/dist/html/layout/grid.d.ts +53 -0
  201. package/dist/html/layout/grid.d.ts.map +1 -0
  202. package/dist/html/layout/grid.js +153 -0
  203. package/dist/html/layout/grid.js.map +1 -0
  204. package/dist/html/layout/inline.d.ts +154 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3598 -175
  207. package/dist/html/layout/inline.js.map +1 -1
  208. package/dist/html/layout/shaping.d.ts +6 -0
  209. package/dist/html/layout/shaping.d.ts.map +1 -0
  210. package/dist/html/layout/shaping.js +100 -0
  211. package/dist/html/layout/shaping.js.map +1 -0
  212. package/dist/html/layout/table.d.ts +3 -0
  213. package/dist/html/layout/table.d.ts.map +1 -1
  214. package/dist/html/layout/table.js +681 -175
  215. package/dist/html/layout/table.js.map +1 -1
  216. package/dist/html/layout/tracks.d.ts +44 -0
  217. package/dist/html/layout/tracks.d.ts.map +1 -0
  218. package/dist/html/layout/tracks.js +349 -0
  219. package/dist/html/layout/tracks.js.map +1 -0
  220. package/dist/html/node.d.ts +169 -4
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1429 -137
  223. package/dist/html/node.js.map +1 -1
  224. package/dist/html/paint.d.ts +92 -3
  225. package/dist/html/paint.d.ts.map +1 -1
  226. package/dist/html/paint.js +3635 -107
  227. package/dist/html/paint.js.map +1 -1
  228. package/dist/html/resources.d.ts +60 -14
  229. package/dist/html/resources.d.ts.map +1 -1
  230. package/dist/html/resources.js +122 -36
  231. package/dist/html/resources.js.map +1 -1
  232. package/dist/html/surfaces.d.ts +23 -0
  233. package/dist/html/surfaces.d.ts.map +1 -0
  234. package/dist/html/surfaces.js +68 -0
  235. package/dist/html/surfaces.js.map +1 -0
  236. package/dist/html/svg.d.ts +80 -0
  237. package/dist/html/svg.d.ts.map +1 -0
  238. package/dist/html/svg.js +442 -0
  239. package/dist/html/svg.js.map +1 -0
  240. package/dist/html/url.d.ts +23 -0
  241. package/dist/html/url.d.ts.map +1 -0
  242. package/dist/html/url.js +80 -0
  243. package/dist/html/url.js.map +1 -0
  244. package/dist/index.d.ts +1 -1
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js.map +1 -1
  247. package/dist/internal/codelines.d.ts +42 -0
  248. package/dist/internal/codelines.d.ts.map +1 -0
  249. package/dist/internal/codelines.js +170 -0
  250. package/dist/internal/codelines.js.map +1 -0
  251. package/dist/internal/collate.d.ts +3 -0
  252. package/dist/internal/collate.d.ts.map +1 -0
  253. package/dist/internal/collate.js +11 -0
  254. package/dist/internal/collate.js.map +1 -0
  255. package/dist/internal/markdown/ast.d.ts +11 -0
  256. package/dist/internal/markdown/ast.d.ts.map +1 -1
  257. package/dist/internal/markdown/parse.d.ts.map +1 -1
  258. package/dist/internal/markdown/parse.js +109 -8
  259. package/dist/internal/markdown/parse.js.map +1 -1
  260. package/dist/internal/prewarm.d.ts +18 -0
  261. package/dist/internal/prewarm.d.ts.map +1 -0
  262. package/dist/internal/prewarm.js +42 -0
  263. package/dist/internal/prewarm.js.map +1 -0
  264. package/dist/internal/sdf.d.ts +20 -0
  265. package/dist/internal/sdf.d.ts.map +1 -0
  266. package/dist/internal/sdf.js +216 -0
  267. package/dist/internal/sdf.js.map +1 -0
  268. package/dist/internal/splice.d.ts +12 -0
  269. package/dist/internal/splice.d.ts.map +1 -0
  270. package/dist/internal/splice.js +23 -0
  271. package/dist/internal/splice.js.map +1 -0
  272. package/dist/internal/window.d.ts +12 -0
  273. package/dist/internal/window.d.ts.map +1 -1
  274. package/dist/internal/window.js +23 -6
  275. package/dist/internal/window.js.map +1 -1
  276. package/dist/maps/anchors.d.ts +6 -1
  277. package/dist/maps/anchors.d.ts.map +1 -1
  278. package/dist/maps/anchors.js +260 -1
  279. package/dist/maps/anchors.js.map +1 -1
  280. package/dist/maps/controller.d.ts +57 -0
  281. package/dist/maps/controller.d.ts.map +1 -1
  282. package/dist/maps/controller.js +97 -18
  283. package/dist/maps/controller.js.map +1 -1
  284. package/dist/maps/gl/buckets.d.ts +5 -1
  285. package/dist/maps/gl/buckets.d.ts.map +1 -1
  286. package/dist/maps/gl/buckets.js +5 -2
  287. package/dist/maps/gl/buckets.js.map +1 -1
  288. package/dist/maps/gl/build-worker.d.ts +2 -0
  289. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  290. package/dist/maps/gl/build-worker.js +1 -1
  291. package/dist/maps/gl/build-worker.js.map +1 -1
  292. package/dist/maps/gl/cover.d.ts +23 -4
  293. package/dist/maps/gl/cover.d.ts.map +1 -1
  294. package/dist/maps/gl/cover.js +61 -48
  295. package/dist/maps/gl/cover.js.map +1 -1
  296. package/dist/maps/gl/placement.d.ts +21 -8
  297. package/dist/maps/gl/placement.d.ts.map +1 -1
  298. package/dist/maps/gl/placement.js +133 -58
  299. package/dist/maps/gl/placement.js.map +1 -1
  300. package/dist/maps/gl/renderer.d.ts +36 -4
  301. package/dist/maps/gl/renderer.d.ts.map +1 -1
  302. package/dist/maps/gl/renderer.js +81 -24
  303. package/dist/maps/gl/renderer.js.map +1 -1
  304. package/dist/maps/gl/shaders.d.ts +18 -17
  305. package/dist/maps/gl/shaders.d.ts.map +1 -1
  306. package/dist/maps/gl/shaders.js +34 -32
  307. package/dist/maps/gl/shaders.js.map +1 -1
  308. package/dist/maps/gl/store.d.ts +10 -0
  309. package/dist/maps/gl/store.d.ts.map +1 -1
  310. package/dist/maps/gl/store.js +47 -4
  311. package/dist/maps/gl/store.js.map +1 -1
  312. package/dist/maps/gl/text.d.ts +153 -24
  313. package/dist/maps/gl/text.d.ts.map +1 -1
  314. package/dist/maps/gl/text.js +379 -63
  315. package/dist/maps/gl/text.js.map +1 -1
  316. package/dist/maps/gl/view.d.ts +293 -2
  317. package/dist/maps/gl/view.d.ts.map +1 -1
  318. package/dist/maps/gl/view.js +317 -82
  319. package/dist/maps/gl/view.js.map +1 -1
  320. package/dist/maps/icons.d.ts +32 -0
  321. package/dist/maps/icons.d.ts.map +1 -0
  322. package/dist/maps/icons.js +151 -0
  323. package/dist/maps/icons.js.map +1 -0
  324. package/dist/maps/index.d.ts +2 -0
  325. package/dist/maps/index.d.ts.map +1 -1
  326. package/dist/maps/index.js +2 -0
  327. package/dist/maps/index.js.map +1 -1
  328. package/dist/maps/labels.d.ts +56 -4
  329. package/dist/maps/labels.d.ts.map +1 -1
  330. package/dist/maps/labels.js +213 -46
  331. package/dist/maps/labels.js.map +1 -1
  332. package/dist/maps/node.d.ts +17 -0
  333. package/dist/maps/node.d.ts.map +1 -1
  334. package/dist/maps/node.js +64 -30
  335. package/dist/maps/node.js.map +1 -1
  336. package/dist/maps/proj.d.ts +48 -0
  337. package/dist/maps/proj.d.ts.map +1 -1
  338. package/dist/maps/proj.js +73 -0
  339. package/dist/maps/proj.js.map +1 -1
  340. package/dist/maps/sources.d.ts +5 -3
  341. package/dist/maps/sources.d.ts.map +1 -1
  342. package/dist/maps/sources.js +5 -3
  343. package/dist/maps/sources.js.map +1 -1
  344. package/dist/maps/style.d.ts +35 -0
  345. package/dist/maps/style.d.ts.map +1 -1
  346. package/dist/maps/style.js.map +1 -1
  347. package/dist/maps/styles.d.ts +12 -0
  348. package/dist/maps/styles.d.ts.map +1 -1
  349. package/dist/maps/styles.js +120 -6
  350. package/dist/maps/styles.js.map +1 -1
  351. package/dist/maps/tiles.d.ts +31 -11
  352. package/dist/maps/tiles.d.ts.map +1 -1
  353. package/dist/maps/tiles.js +61 -27
  354. package/dist/maps/tiles.js.map +1 -1
  355. package/dist/maps/types.d.ts +28 -4
  356. package/dist/maps/types.d.ts.map +1 -1
  357. package/dist/markdown/index.d.ts.map +1 -1
  358. package/dist/markdown/index.js +209 -68
  359. package/dist/markdown/index.js.map +1 -1
  360. package/dist/markdown/spans.d.ts.map +1 -1
  361. package/dist/markdown/spans.js +6 -0
  362. package/dist/markdown/spans.js.map +1 -1
  363. package/dist/qml/containers.d.ts.map +1 -1
  364. package/dist/qml/containers.js +6 -1
  365. package/dist/qml/containers.js.map +1 -1
  366. package/dist/qml/interaction.d.ts.map +1 -1
  367. package/dist/qml/interaction.js +38 -5
  368. package/dist/qml/interaction.js.map +1 -1
  369. package/dist/qml/layouts.d.ts.map +1 -1
  370. package/dist/qml/layouts.js +21 -6
  371. package/dist/qml/layouts.js.map +1 -1
  372. package/dist/qml/qtquick.d.ts.map +1 -1
  373. package/dist/qml/qtquick.js +9 -2
  374. package/dist/qml/qtquick.js.map +1 -1
  375. package/dist/qml/react.d.ts.map +1 -1
  376. package/dist/qml/react.js +9 -7
  377. package/dist/qml/react.js.map +1 -1
  378. package/dist/reorder/clock.d.ts +7 -0
  379. package/dist/reorder/clock.d.ts.map +1 -0
  380. package/dist/reorder/clock.js +26 -0
  381. package/dist/reorder/clock.js.map +1 -0
  382. package/dist/reorder/index.d.ts +25 -3
  383. package/dist/reorder/index.d.ts.map +1 -1
  384. package/dist/reorder/index.js +64 -19
  385. package/dist/reorder/index.js.map +1 -1
  386. package/dist/rich-text-editor/index.d.ts +0 -11
  387. package/dist/rich-text-editor/index.d.ts.map +1 -1
  388. package/dist/rich-text-editor/index.js +38 -9
  389. package/dist/rich-text-editor/index.js.map +1 -1
  390. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  391. package/dist/rich-text-editor/keymap.js +2 -1
  392. package/dist/rich-text-editor/keymap.js.map +1 -1
  393. package/dist/rich-text-editor/keys.d.ts +17 -6
  394. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  395. package/dist/rich-text-editor/keys.js +135 -26
  396. package/dist/rich-text-editor/keys.js.map +1 -1
  397. package/dist/rich-text-editor/markdown.d.ts.map +1 -1
  398. package/dist/rich-text-editor/markdown.js +30 -1
  399. package/dist/rich-text-editor/markdown.js.map +1 -1
  400. package/dist/rich-text-editor/marks.d.ts +9 -0
  401. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  402. package/dist/rich-text-editor/marks.js +83 -0
  403. package/dist/rich-text-editor/marks.js.map +1 -0
  404. package/dist/rich-text-editor/render.d.ts.map +1 -1
  405. package/dist/rich-text-editor/render.js +28 -10
  406. package/dist/rich-text-editor/render.js.map +1 -1
  407. package/dist/rich-text-editor/replace.d.ts +13 -0
  408. package/dist/rich-text-editor/replace.d.ts.map +1 -0
  409. package/dist/rich-text-editor/replace.js +64 -0
  410. package/dist/rich-text-editor/replace.js.map +1 -0
  411. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  412. package/dist/rich-text-editor/toolbar.js +1 -1
  413. package/dist/rich-text-editor/toolbar.js.map +1 -1
  414. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  415. package/dist/rich-text-editor/virtual.js +17 -0
  416. package/dist/rich-text-editor/virtual.js.map +1 -1
  417. package/dist/richtext/node.d.ts +46 -2
  418. package/dist/richtext/node.d.ts.map +1 -1
  419. package/dist/richtext/node.js +187 -4
  420. package/dist/richtext/node.js.map +1 -1
  421. package/dist/richtext/runs.d.ts +13 -8
  422. package/dist/richtext/runs.d.ts.map +1 -1
  423. package/dist/richtext/runs.js +18 -8
  424. package/dist/richtext/runs.js.map +1 -1
  425. package/dist/table/index.d.ts.map +1 -1
  426. package/dist/table/index.js +23 -0
  427. package/dist/table/index.js.map +1 -1
  428. package/dist/table/rows.d.ts +3 -2
  429. package/dist/table/rows.d.ts.map +1 -1
  430. package/dist/table/rows.js +20 -6
  431. package/dist/table/rows.js.map +1 -1
  432. package/dist/terminal/index.d.ts.map +1 -1
  433. package/dist/terminal/index.js +4 -0
  434. package/dist/terminal/index.js.map +1 -1
  435. package/dist/terminal/vt/pty.d.ts +13 -2
  436. package/dist/terminal/vt/pty.d.ts.map +1 -1
  437. package/dist/terminal/vt/pty.js +18 -3
  438. package/dist/terminal/vt/pty.js.map +1 -1
  439. package/dist/terminal-output/index.d.ts.map +1 -1
  440. package/dist/terminal-output/index.js +103 -23
  441. package/dist/terminal-output/index.js.map +1 -1
  442. package/dist/terminal-output/runs.d.ts +4 -1
  443. package/dist/terminal-output/runs.d.ts.map +1 -1
  444. package/dist/terminal-output/runs.js +5 -1
  445. package/dist/terminal-output/runs.js.map +1 -1
  446. package/dist/three/canvas.d.ts.map +1 -1
  447. package/dist/three/canvas.js +85 -7
  448. package/dist/three/canvas.js.map +1 -1
  449. package/dist/three/events.d.ts +22 -4
  450. package/dist/three/events.d.ts.map +1 -1
  451. package/dist/three/events.js +34 -4
  452. package/dist/three/events.js.map +1 -1
  453. package/dist/tree/index.d.ts.map +1 -1
  454. package/dist/tree/index.js +17 -0
  455. package/dist/tree/index.js.map +1 -1
  456. package/package.json +42 -33
  457. package/src/charts/node.ts +62 -26
  458. package/src/charts/render.ts +120 -30
  459. package/src/code/index.ts +36 -32
  460. package/src/code-editor/completion.ts +3 -2
  461. package/src/code-editor/index.ts +19 -0
  462. package/src/code-editor/node.ts +1574 -184
  463. package/src/code-language/index.ts +1 -1
  464. package/src/code-language/languages/glsl.ts +12 -2
  465. package/src/code-language/languages/javascript.ts +21 -4
  466. package/src/code-language/languages/json.ts +12 -2
  467. package/src/code-language/languages/shell.ts +12 -2
  468. package/src/code-language/languages/sql.ts +22 -2
  469. package/src/code-language/runs.ts +111 -1
  470. package/src/code-language/stream.ts +257 -17
  471. package/src/code-language/types.ts +5 -4
  472. package/src/codeblock/index.ts +68 -4
  473. package/src/flow/draw.ts +167 -41
  474. package/src/flow/gl/color.ts +85 -0
  475. package/src/flow/gl/index.ts +342 -0
  476. package/src/flow/gl/pack.ts +585 -0
  477. package/src/flow/gl/renderer.ts +679 -0
  478. package/src/flow/gl/shaders.ts +371 -0
  479. package/src/flow/gl/text.ts +1295 -0
  480. package/src/flow/index.ts +794 -67
  481. package/src/flow/node.ts +2496 -1256
  482. package/src/flow/paint.ts +511 -0
  483. package/src/flow/paths.ts +80 -15
  484. package/src/flow/scene.ts +2199 -0
  485. package/src/flow/types.ts +113 -1
  486. package/src/html/controls.ts +73 -2
  487. package/src/html/css/calc.ts +385 -0
  488. package/src/html/css/cascade.ts +1481 -62
  489. package/src/html/css/color.ts +755 -0
  490. package/src/html/css/content.ts +417 -0
  491. package/src/html/css/counter-styles.ts +973 -0
  492. package/src/html/css/decode.ts +130 -0
  493. package/src/html/css/parse.ts +1514 -160
  494. package/src/html/css/style.ts +4131 -223
  495. package/src/html/css/ua.ts +66 -17
  496. package/src/html/css/values.ts +150 -50
  497. package/src/html/css/vars.ts +348 -0
  498. package/src/html/dom.ts +284 -17
  499. package/src/html/fonts.ts +641 -0
  500. package/src/html/gif.ts +233 -0
  501. package/src/html/index.ts +180 -20
  502. package/src/html/layout/block.ts +3560 -208
  503. package/src/html/layout/boxes.ts +2141 -190
  504. package/src/html/layout/cache.ts +289 -0
  505. package/src/html/layout/collapse.ts +317 -0
  506. package/src/html/layout/css-grid.ts +1063 -0
  507. package/src/html/layout/flex.ts +1115 -106
  508. package/src/html/layout/floats.ts +128 -14
  509. package/src/html/layout/grid-lines.ts +141 -0
  510. package/src/html/layout/grid.ts +181 -0
  511. package/src/html/layout/inline.ts +4187 -192
  512. package/src/html/layout/shaping.ts +140 -0
  513. package/src/html/layout/table.ts +696 -186
  514. package/src/html/layout/tracks.ts +437 -0
  515. package/src/html/node.ts +1585 -156
  516. package/src/html/paint.ts +4582 -267
  517. package/src/html/resources.ts +161 -50
  518. package/src/html/surfaces.ts +81 -0
  519. package/src/html/svg.ts +504 -0
  520. package/src/html/url.ts +86 -0
  521. package/src/index.ts +2 -0
  522. package/src/internal/codelines.ts +200 -0
  523. package/src/internal/collate.ts +12 -0
  524. package/src/internal/markdown/ast.ts +11 -0
  525. package/src/internal/markdown/parse.ts +154 -11
  526. package/src/internal/prewarm.ts +45 -0
  527. package/src/internal/sdf.ts +227 -0
  528. package/src/internal/splice.ts +25 -0
  529. package/src/internal/window.ts +36 -5
  530. package/src/maps/anchors.ts +307 -1
  531. package/src/maps/controller.ts +116 -31
  532. package/src/maps/gl/buckets.ts +5 -1
  533. package/src/maps/gl/build-worker.ts +13 -2
  534. package/src/maps/gl/cover.ts +79 -44
  535. package/src/maps/gl/placement.ts +221 -69
  536. package/src/maps/gl/renderer.ts +104 -20
  537. package/src/maps/gl/shaders.ts +35 -32
  538. package/src/maps/gl/store.ts +66 -17
  539. package/src/maps/gl/text.ts +444 -71
  540. package/src/maps/gl/view.ts +361 -96
  541. package/src/maps/icons.ts +183 -0
  542. package/src/maps/index.ts +4 -0
  543. package/src/maps/labels.ts +269 -49
  544. package/src/maps/node.ts +82 -49
  545. package/src/maps/proj.ts +87 -0
  546. package/src/maps/sources.ts +5 -3
  547. package/src/maps/style.ts +32 -0
  548. package/src/maps/styles.ts +215 -4
  549. package/src/maps/tiles.ts +64 -31
  550. package/src/maps/types.ts +28 -4
  551. package/src/markdown/index.ts +293 -92
  552. package/src/markdown/spans.ts +5 -0
  553. package/src/qml/containers.tsx +6 -1
  554. package/src/qml/interaction.tsx +42 -5
  555. package/src/qml/layouts.tsx +21 -6
  556. package/src/qml/qtquick.tsx +9 -2
  557. package/src/qml/react.tsx +7 -5
  558. package/src/reorder/clock.ts +27 -0
  559. package/src/reorder/index.ts +100 -27
  560. package/src/rich-text-editor/index.ts +37 -12
  561. package/src/rich-text-editor/keymap.ts +1 -1
  562. package/src/rich-text-editor/keys.ts +135 -26
  563. package/src/rich-text-editor/markdown.ts +36 -1
  564. package/src/rich-text-editor/marks.ts +101 -0
  565. package/src/rich-text-editor/render.ts +49 -12
  566. package/src/rich-text-editor/replace.ts +85 -0
  567. package/src/rich-text-editor/toolbar.ts +1 -1
  568. package/src/rich-text-editor/virtual.ts +25 -0
  569. package/src/richtext/node.ts +235 -14
  570. package/src/richtext/runs.ts +23 -12
  571. package/src/table/index.ts +29 -0
  572. package/src/table/rows.ts +18 -8
  573. package/src/terminal/index.ts +4 -0
  574. package/src/terminal/vt/pty.ts +16 -2
  575. package/src/terminal-output/index.ts +129 -31
  576. package/src/terminal-output/runs.ts +16 -2
  577. package/src/three/canvas.ts +102 -8
  578. package/src/three/events.ts +49 -9
  579. package/src/tree/index.ts +19 -0
@@ -0,0 +1,227 @@
1
+ // A label's raster as a signed distance field: what lets one raster serve a
2
+ // name at every size a zoom passes through, and a halo of any width. Under
3
+ // the GL labels of both `<Map>` (`src/maps/gl/text.ts`) and `<Flow>`
4
+ // (`src/flow/gl/text.ts`), which is why it is here rather than in either.
5
+ //
6
+ // The text engine sets a string as coverage — alpha, antialiased — at one
7
+ // base size. Each texel here becomes its distance to the glyphs' edge,
8
+ // encoded in a byte so that `SDF_EDGE` is the edge itself, more is inside
9
+ // and less is outside:
10
+ //
11
+ // byte = 255 · (1 − d / radius − SDF_CUTOFF), d > 0 outside
12
+ //
13
+ // so a field reaches `radius · (1 − SDF_CUTOFF)` texels past the glyphs
14
+ // before it saturates at 0 — the room a halo has to grow into — and
15
+ // `radius · SDF_CUTOFF` into them.
16
+ //
17
+ // The distance is the exact Euclidean one, started at the edge by what the
18
+ // coverage says: an antialiased texel half covered sits on the edge, one a
19
+ // quarter covered a quarter of a texel outside it. That sub-texel start is
20
+ // what keeps a field set at 16 pixels from drawing a lumpy stroke at 40.
21
+ //
22
+ // **Only where it can change a byte.** A field is set the first time its
23
+ // string is drawn, so its cost is how late a label appears. Outside the
24
+ // glyphs the distance is Felzenszwalb and Huttenlocher's linear-time
25
+ // transform — but only over the window a field reaches round the ink, the
26
+ // rows that hold ink first and then the window's columns, since past the
27
+ // reach every byte is 0 and every source is inside it. Inside, a field
28
+ // saturates `radius · SDF_CUTOFF` texels in (1.5 at Flow's margin, 2.25 at
29
+ // a map's), so the nearest texel less than half covered is found by
30
+ // searching the few rings round each texel inside, not by a second
31
+ // transform over the whole raster. Byte for byte what the two whole
32
+ // transforms gave, at half the cost: measured over DirectWrite's coverage
33
+ // of 520 labels, 262 → 140 µs a field at Flow's margin and 626 → 311 at a
34
+ // map's.
35
+
36
+ /** The fraction of the byte range spent inside the glyphs. */
37
+ export const SDF_CUTOFF = 0.25;
38
+
39
+ /** The byte value of the glyphs' edge, as a fraction: `1 − SDF_CUTOFF`. */
40
+ export const SDF_EDGE = 1 - SDF_CUTOFF;
41
+
42
+ /**
43
+ * Device pixels outside a field's outline that its ink's edge is drawn. A
44
+ * text engine darkens stems at small sizes; a field thresholded at half
45
+ * coverage gives that back, and a string drawn from one looks a weight
46
+ * lighter than the same string set. Both GL label shaders draw it.
47
+ */
48
+ export const SDF_INK_BIAS_PX = 0.15;
49
+
50
+ /** "No edge in reach": far past any raster's squared diagonal, and small
51
+ * enough that `FAR + q²` is still exact in a double, so two of them cross
52
+ * where two parabolas of one height do. */
53
+ const FAR = 1e10;
54
+
55
+ /**
56
+ * Each coverage byte's squared distance to the edge *inside* its own
57
+ * texel: (a − ½)² where more than half covered, 0 where not — a texel less
58
+ * than half covered is outside, where an inside distance ends — and FAR
59
+ * where whole.
60
+ */
61
+ const INSIDE = new Float64Array(256);
62
+ for (let a8 = 1; a8 < 255; a8++) {
63
+ const d = 0.5 - a8 / 255;
64
+ INSIDE[a8] = d < 0 ? d * d : 0;
65
+ }
66
+ INSIDE[255] = FAR;
67
+
68
+ /** Scratch, grown to the largest raster seen and reused. */
69
+ let outer = new Float64Array(0);
70
+ let f = new Float64Array(0);
71
+ let g = new Float64Array(0);
72
+ let z = new Float64Array(0);
73
+ let v = new Int32Array(0);
74
+
75
+ function grow(texels: number, line: number): void {
76
+ if (outer.length < texels) outer = new Float64Array(texels);
77
+ if (f.length < line) {
78
+ f = new Float64Array(line);
79
+ g = new Float64Array(line);
80
+ z = new Float64Array(line + 1);
81
+ v = new Int32Array(line);
82
+ }
83
+ }
84
+
85
+ /**
86
+ * The squared distance transform of `length` values of `grid` from
87
+ * `offset`, `stride` apart, in place: each becomes the least
88
+ * `grid[r] + (q − r)²` — the lower envelope of parabolas rooted at every
89
+ * texel. `g` holds each parabola's `grid[r] + r²`, so where two cross is
90
+ * one division.
91
+ */
92
+ function transform1d(
93
+ grid: Float64Array,
94
+ offset: number,
95
+ stride: number,
96
+ length: number,
97
+ ): void {
98
+ let k = 0;
99
+ v[0] = 0;
100
+ z[0] = -Infinity;
101
+ z[1] = Infinity;
102
+ f[0] = grid[offset];
103
+ g[0] = f[0];
104
+ for (let q = 1, at = offset + stride; q < length; q++, at += stride) {
105
+ const fq = grid[at];
106
+ f[q] = fq;
107
+ const gq = fq + q * q;
108
+ g[q] = gq;
109
+ let s: number;
110
+ for (;;) {
111
+ const r = v[k];
112
+ s = (gq - g[r]) / (2 * (q - r));
113
+ if (s > z[k] || k === 0) break;
114
+ k--;
115
+ }
116
+ k++;
117
+ v[k] = q;
118
+ z[k] = s;
119
+ z[k + 1] = Infinity;
120
+ }
121
+ k = 0;
122
+ for (let q = 0, at = offset; q < length; q++, at += stride) {
123
+ while (z[k + 1] < q) k++;
124
+ const r = v[k];
125
+ const d = q - r;
126
+ grid[at] = f[r] + d * d;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * The field of a `width` × `height` raster whose coverage is `alpha`
132
+ * (0-255), read every `step` bytes from `start` — so an RGBA readback is
133
+ * read in place, `step` 4 and `start` 3, and an engine's own coverage with
134
+ * `step` 1 and `start` 0. One byte a texel, see the top of this file for
135
+ * the encoding.
136
+ */
137
+ export function distanceField(
138
+ alpha: Uint8Array,
139
+ width: number,
140
+ height: number,
141
+ radius: number,
142
+ step = 4,
143
+ start = 3,
144
+ ): Uint8Array {
145
+ const texels = width * height;
146
+ grow(texels, Math.max(width, height));
147
+ // Zeroed: a byte nothing below writes is as far outside as a field sees.
148
+ const out = new Uint8Array(texels);
149
+ let minX = width;
150
+ let maxX = -1;
151
+ let minY = height;
152
+ let maxY = -1;
153
+ for (let y = 0, i = 0, a = start; y < height; y++) {
154
+ for (let x = 0; x < width; x++, i++, a += step) {
155
+ const a8 = alpha[a];
156
+ if (a8 === 0) {
157
+ outer[i] = FAR;
158
+ continue;
159
+ }
160
+ if (x < minX) minX = x;
161
+ if (x > maxX) maxX = x;
162
+ if (y < minY) minY = y;
163
+ if (y > maxY) maxY = y;
164
+ if (a8 === 255) {
165
+ outer[i] = 0;
166
+ continue;
167
+ }
168
+ // Partly covered: on the edge, off it by how far from half covered.
169
+ const d = 0.5 - a8 / 255;
170
+ outer[i] = d > 0 ? d * d : 0;
171
+ }
172
+ }
173
+ if (maxX < 0) return out;
174
+
175
+ // Outside: the window the field reaches round the ink. Every source is
176
+ // in it, so what the transform computes there is exact, and past it every
177
+ // byte is 0. The rows with ink first — every source is on one — then
178
+ // every column of the window.
179
+ const reach = Math.ceil(radius * (1 - SDF_CUTOFF)) + 1;
180
+ const x0 = Math.max(0, minX - reach);
181
+ const x1 = Math.min(width - 1, maxX + reach);
182
+ const y0 = Math.max(0, minY - reach);
183
+ const y1 = Math.min(height - 1, maxY + reach);
184
+ for (let y = minY; y <= maxY; y++) {
185
+ transform1d(outer, y * width + x0, 1, x1 - x0 + 1);
186
+ }
187
+ for (let x = x0; x <= x1; x++) {
188
+ transform1d(outer, y0 * width + x, width, y1 - y0 + 1);
189
+ }
190
+
191
+ // Inside, the field saturates this many rings in.
192
+ const deep = Math.ceil(radius * SDF_CUTOFF);
193
+ for (let y = y0; y <= y1; y++) {
194
+ for (let x = x0, i = y * width + x0; x <= x1; x++, i++) {
195
+ // Outside the ink, or in it: never both.
196
+ const o = outer[i];
197
+ let d: number;
198
+ if (o > 0) {
199
+ d = Math.sqrt(o);
200
+ } else {
201
+ // The least (a − ½)² + distance² over the texels round it, ring by
202
+ // ring, until no ring further out could be nearer — or the field
203
+ // has saturated, where the exact answer and this one are both 255.
204
+ let best = INSIDE[alpha[start + i * step]];
205
+ for (let k = 1; k <= deep && best > k * k; k++) {
206
+ for (let yy = y - k; yy <= y + k; yy++) {
207
+ if (yy < 0 || yy >= height) continue;
208
+ const dy2 = (yy - y) * (yy - y);
209
+ // a ring's top and bottom rows whole, its sides two texels
210
+ const across = yy === y - k || yy === y + k ? 1 : 2 * k;
211
+ for (let xx = x - k; xx <= x + k; xx += across) {
212
+ if (xx < 0 || xx >= width) continue;
213
+ const dx = xx - x;
214
+ const m =
215
+ INSIDE[alpha[start + (yy * width + xx) * step]] + dx * dx + dy2;
216
+ if (m < best) best = m;
217
+ }
218
+ }
219
+ }
220
+ d = -Math.sqrt(best);
221
+ }
222
+ const value = Math.round(255 - 255 * (d / radius + SDF_CUTOFF));
223
+ out[i] = value < 0 ? 0 : value > 255 ? 255 : value;
224
+ }
225
+ }
226
+ return out;
227
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `target.splice(from, removed, ...items)`, for any number of items.
3
+ *
4
+ * A spread argument list lives on the stack, and somewhere past a hundred
5
+ * thousand items it throws `RangeError: Maximum call stack size exceeded` —
6
+ * a pasted log, or a file replaced whole, is that many lines. Past a few
7
+ * thousand the array is rebuilt in place instead: whoever holds `target`
8
+ * keeps holding it, which is the whole reason it is spliced rather than
9
+ * replaced.
10
+ */
11
+ export function spliceAll<T>(
12
+ target: T[],
13
+ from: number,
14
+ removed: number,
15
+ items: readonly T[],
16
+ ): void {
17
+ if (items.length <= 4096) {
18
+ target.splice(from, removed, ...items);
19
+ return;
20
+ }
21
+ const tail = target.slice(from + removed);
22
+ target.length = from;
23
+ for (let i = 0; i < items.length; i++) target.push(items[i]);
24
+ for (let i = 0; i < tail.length; i++) target.push(tail[i]);
25
+ }
@@ -30,7 +30,8 @@
30
30
  // forces them out, trailing side first — a direction reversal lands on
31
31
  // rows still mounted instead of rebuilding them. The budget caps what a
32
32
  // render can be asked to carry: the on-screen slice plus `prefetch` rows
33
- // each side.
33
+ // each side — at any speed, which is why a row is measured on its way
34
+ // out when nothing has measured it yet.
34
35
  // - **Skeletons.** A scroll that outruns everything — a thumb dragged
35
36
  // across the list, a flick past the band — floods the window with rows
36
37
  // no single render can build in time. Those render as *skeletons*: the
@@ -164,6 +165,18 @@ export interface VirtualWindowInputs {
164
165
  * settled. `BURST_BUDGET` / `SETTLE_BUDGET` are the defaults. */
165
166
  burstBudget: number;
166
167
  settleBudget: number;
168
+ /**
169
+ * Record the height the drawn row `id`, at `index`, is laid out at in the
170
+ * index, now; answer whether the index has a real height for it after.
171
+ * The trim asks before it drops a row the measure tick has not reached
172
+ * (see the budget below), during render — so no nudge and no re-render:
173
+ * the row is still laid out at exactly that height, and nothing on screen
174
+ * moves until the spacer takes its place. `false` for a row with no
175
+ * honest measurement to give, which keeps it mounted. `viewport` is the
176
+ * event-fresh one (`viewRef`), for a component whose rows are laid out
177
+ * against it.
178
+ */
179
+ measure?: (id: RowKey, index: number, viewport: VirtualViewport) => boolean;
167
180
  }
168
181
 
169
182
  export interface VirtualWindow {
@@ -370,6 +383,7 @@ export function useVirtualWindow(inputs: VirtualWindowInputs): VirtualWindow {
370
383
  threshold,
371
384
  burstBudget,
372
385
  settleBudget,
386
+ measure,
373
387
  } = inputs;
374
388
  const count = rows.length;
375
389
 
@@ -448,15 +462,32 @@ export function useVirtualWindow(inputs: VirtualWindowInputs): VirtualWindow {
448
462
  // row laid out taller than the index believes contributes its real
449
463
  // height while mounted and its guessed one once dropped, so cutting
450
464
  // it silently shrinks the content above the viewport and the view
451
- // yanks up by the difference with no debt left to put it right. Held
452
- // a render or two longer, it gets measured, and the next trim takes
453
- // it cleanly.
465
+ // yanks up by the difference with no debt left to put it right.
466
+ //
467
+ // So a row the index has no number for is measured *here*, where it
468
+ // is still laid out (`measure`): once the index holds the height it
469
+ // is drawn at, the spacer that replaces it is exactly as tall, and it
470
+ // goes like any other. Waiting for the measure tick instead is only
471
+ // safe while the tick runs — and a flick defers every measurement to
472
+ // the settle, so a long one downward trimmed nothing at all and the
473
+ // window grew by every row it passed: 1,250 rows mounted four seconds
474
+ // into a trackpad fling, each frame laying all of them out. A row the
475
+ // last render did not build in full needs nothing: a skeleton is
476
+ // drawn at the index's height, and a row never drawn is not in the
477
+ // layout at all. What cannot be measured — a row not laid out yet, or
478
+ // laid out against a grid it is about to leave — is held a render or
479
+ // two longer, as before.
454
480
  const budget = coreLast - coreFirst + 2 * prefetch;
455
481
  let excess = last - first - budget;
456
482
  if (excess > 0) {
483
+ const known = (i: number): boolean =>
484
+ exact ||
485
+ heights.isMeasured(i) ||
486
+ !real.current.has(rows[i].id) ||
487
+ measure?.(rows[i].id, i, viewRef.current) === true;
457
488
  const cutAbove = (want: number): number => {
458
489
  let k = 0;
459
- while (k < want && (exact || heights.isMeasured(first + k))) k++;
490
+ while (k < want && known(first + k)) k++;
460
491
  return k;
461
492
  };
462
493
  const aboveExtra = coreFirst - first;
@@ -36,8 +36,10 @@
36
36
  // Everything leaves as one Float32Array and a string table, so a worker can
37
37
  // hand it over with the buckets (see `./gl/store.ts`).
38
38
  import { GeomType, GeometryBuffer } from './mvt.js';
39
- import type { FeatureCursor, VectorTile } from './mvt.js';
39
+ import type { FeatureCursor, VectorTile, VectorTileLayer } from './mvt.js';
40
40
  import type { PreparedStyle } from './paint.js';
41
+ import { latFromMercatorY } from './proj.js';
42
+ import type { TileId } from './proj.js';
41
43
  import type { SymbolLayer } from './style.js';
42
44
 
43
45
  // --- the fit rules both renderers place by ------------------------------------
@@ -241,6 +243,10 @@ export function buildTileLabels(
241
243
  tile: VectorTile,
242
244
  prepared: PreparedStyle,
243
245
  extent: number,
246
+ /** Which tile: what turns a `snapInto` distance in metres into tile
247
+ * units. Without it no distance can be known, and only a point already
248
+ * inside a polygon moves. */
249
+ id?: TileId,
244
250
  ): GlLabelData {
245
251
  const started = now();
246
252
  const texts: string[] = [];
@@ -259,6 +265,11 @@ export function buildTileLabels(
259
265
  const groups = new Map<number, LineGroup>();
260
266
  // Which name first touched each vertex, or -1 once a second did.
261
267
  const touched = new Map<number, number>();
268
+ // A layer that snaps into polygons collects its points first — x, y,
269
+ // text, priority — since which point a polygon belongs to depends on
270
+ // every other point that could claim it.
271
+ const snap = symbol.snapInto;
272
+ const snaps: number[] | null = snap ? [] : null;
262
273
 
263
274
  for (let f = 0; f < source.length; f++) {
264
275
  source.seek(f, cursor);
@@ -309,10 +320,23 @@ export function buildTileLabels(
309
320
  if (!anchor) continue;
310
321
  const x = anchor.x * k;
311
322
  const y = anchor.y * k;
323
+ if (snaps && cursor.type === GeomType.Point) {
324
+ // The buffer's points too, and judged before the tile's square:
325
+ // a polygon near the edge is claimed by points on either side of
326
+ // it, and both tiles that hold it must see the same claims.
327
+ snaps.push(x, y, t, priority);
328
+ continue;
329
+ }
312
330
  if (x < 0 || y < 0 || x >= extent || y >= extent) continue;
313
331
  out.point(x, y, t, i, priority);
314
332
  }
315
333
 
334
+ if (snap && snaps) {
335
+ const polygons = tile.layers.get(snap.sourceLayer);
336
+ const within = (snap.within ?? SNAP_WITHIN) / metresPerUnit(id, extent);
337
+ snapPoints(polygons, within, snaps, extent, i, out, buffer);
338
+ }
339
+
316
340
  for (const group of groups.values()) {
317
341
  for (const chain of mergeParts(group.parts)) {
318
342
  anchorChain(chain, touched, extent, group, i, out);
@@ -323,6 +347,288 @@ export function buildTileLabels(
323
347
  return { texts, anchors: out.take(), count: out.count, ms: now() - started };
324
348
  }
325
349
 
350
+ /** How far a point is taken to belong to a polygon it is outside, metres,
351
+ * where the layer does not say. An address point in the lot sits a few
352
+ * metres off its house; much past this, the nearest building is as often
353
+ * a neighbour's — the house the number is for not being mapped at all. */
354
+ const SNAP_WITHIN = 15;
355
+ /** The earth's circumference at the equator, metres (Web Mercator's). */
356
+ const EQUATOR = 40075016.686;
357
+
358
+ /** Metres on the ground per tile unit, at the tile's middle row. */
359
+ function metresPerUnit(id: TileId | undefined, extent: number): number {
360
+ const n = 2 ** (id?.z ?? 0);
361
+ const lat = id ? latFromMercatorY((id.y + 0.5) / n) : 0;
362
+ return (EQUATOR * Math.cos((lat * Math.PI) / 180)) / (n * extent);
363
+ }
364
+
365
+ /** One polygon's outer ring, in tile units: its points, its box, and the
366
+ * point inside it a label moved into it is set on. */
367
+ interface SnapRing {
368
+ points: number[];
369
+ x0: number;
370
+ y0: number;
371
+ x1: number;
372
+ y1: number;
373
+ cx: number;
374
+ cy: number;
375
+ }
376
+
377
+ /** The grid rings are found by, in tile units: a z14 tile is 16 cells a
378
+ * side, a few dozen buildings each. */
379
+ const SNAP_CELL = 256;
380
+ const snapCell = (gx: number, gy: number): number =>
381
+ (gx + 1024) * 4096 + (gy + 1024);
382
+
383
+ /**
384
+ * Point labels moved into the polygon each one belongs to — a house number
385
+ * into its house.
386
+ *
387
+ * A point inside a polygon belongs to it; one outside, to the nearest
388
+ * polygon whose outline is within `within` tile units. It moves only if it
389
+ * is the **one** point its polygon is claimed by: a duplex's two numbers, or
390
+ * a garage nearer the street than the house, would otherwise pile several
391
+ * numbers onto one roof — and collision would then keep one of them, on a
392
+ * building that is not only its own. Every point that does not move stays
393
+ * exactly where the data put it.
394
+ *
395
+ * `points` are the whole tile's, buffer included, so a polygon near the edge
396
+ * is claimed alike in both tiles that hold it; each point is then anchored
397
+ * only in the tile its own position is in, as every other point is. One
398
+ * whose polygon's middle is in the next tile over stays put rather than
399
+ * move out of the tile that offers it.
400
+ */
401
+ function snapPoints(
402
+ polygons: VectorTileLayer | undefined,
403
+ within: number,
404
+ points: readonly number[],
405
+ extent: number,
406
+ layer: number,
407
+ out: AnchorWriter,
408
+ buffer: GeometryBuffer,
409
+ ): void {
410
+ const count = points.length / 4;
411
+ const target = new Int32Array(count).fill(-1);
412
+ const rings = polygons ? snapRings(polygons, extent, buffer) : [];
413
+ if (rings.length > 0) {
414
+ const grid = new Map<number, number[]>();
415
+ rings.forEach((ring, r) => {
416
+ for (let gx = cellOf(ring.x0); gx <= cellOf(ring.x1); gx++) {
417
+ for (let gy = cellOf(ring.y0); gy <= cellOf(ring.y1); gy++) {
418
+ const key = snapCell(gx, gy);
419
+ const list = grid.get(key);
420
+ if (list) list.push(r);
421
+ else grid.set(key, [r]);
422
+ }
423
+ }
424
+ });
425
+ const claims = new Int32Array(rings.length);
426
+ // Which query last looked at each ring: a ring spanning several cells
427
+ // is one candidate, not several.
428
+ const seen = new Int32Array(rings.length).fill(-1);
429
+ for (let p = 0; p < count; p++) {
430
+ const r = ownerOf(
431
+ rings,
432
+ grid,
433
+ seen,
434
+ p,
435
+ points[p * 4],
436
+ points[p * 4 + 1],
437
+ within,
438
+ );
439
+ if (r >= 0) {
440
+ target[p] = r;
441
+ claims[r]++;
442
+ }
443
+ }
444
+ for (let p = 0; p < count; p++) {
445
+ if (target[p] >= 0 && claims[target[p]] !== 1) target[p] = -1;
446
+ }
447
+ }
448
+ for (let p = 0; p < count; p++) {
449
+ let x = points[p * 4];
450
+ let y = points[p * 4 + 1];
451
+ if (x < 0 || y < 0 || x >= extent || y >= extent) continue;
452
+ const r = target[p];
453
+ if (r >= 0) {
454
+ const ring = rings[r];
455
+ if (
456
+ ring.cx >= 0 &&
457
+ ring.cy >= 0 &&
458
+ ring.cx < extent &&
459
+ ring.cy < extent
460
+ ) {
461
+ x = ring.cx;
462
+ y = ring.cy;
463
+ }
464
+ }
465
+ out.point(x, y, points[p * 4 + 2], layer, points[p * 4 + 3]);
466
+ }
467
+ }
468
+
469
+ const cellOf = (v: number): number => Math.floor(v / SNAP_CELL);
470
+
471
+ /** Every polygon's outer rings, in tile units. Holes are not a building's
472
+ * own ground, and a courtyard is not where a number goes. */
473
+ function snapRings(
474
+ source: VectorTileLayer,
475
+ extent: number,
476
+ buffer: GeometryBuffer,
477
+ ): SnapRing[] {
478
+ const k = extent / source.extent;
479
+ const cursor = source.feature(0);
480
+ const rings: SnapRing[] = [];
481
+ for (let f = 0; f < source.length; f++) {
482
+ source.seek(f, cursor);
483
+ if (cursor.type !== GeomType.Polygon) continue;
484
+ cursor.readGeometry(buffer);
485
+ for (let part = 0; part < buffer.parts; part++) {
486
+ if (buffer.areas[part] <= 0) continue;
487
+ const from = buffer.starts[part];
488
+ const to = buffer.starts[part + 1];
489
+ if (to - from < 3) continue;
490
+ const points: number[] = [];
491
+ let x0 = Infinity;
492
+ let y0 = Infinity;
493
+ let x1 = -Infinity;
494
+ let y1 = -Infinity;
495
+ for (let p = from; p < to; p++) {
496
+ const x = buffer.coords[p * 2] * k;
497
+ const y = buffer.coords[p * 2 + 1] * k;
498
+ points.push(x, y);
499
+ if (x < x0) x0 = x;
500
+ if (x > x1) x1 = x;
501
+ if (y < y0) y0 = y;
502
+ if (y > y1) y1 = y;
503
+ }
504
+ const [cx, cy] = interiorPoint(points, x0, y0, x1, y1);
505
+ rings.push({ points, x0, y0, x1, y1, cx, cy });
506
+ }
507
+ }
508
+ return rings;
509
+ }
510
+
511
+ /**
512
+ * A point inside a ring to set a label on: its centroid, which is inside
513
+ * for all but the most contorted outline — 99.8% of the building rings in
514
+ * the tiles this was measured on — and where it is not, the middle of the
515
+ * widest span of the ring along the centroid's row.
516
+ */
517
+ function interiorPoint(
518
+ points: readonly number[],
519
+ x0: number,
520
+ y0: number,
521
+ x1: number,
522
+ y1: number,
523
+ ): [number, number] {
524
+ let area = 0;
525
+ let sx = 0;
526
+ let sy = 0;
527
+ const n = points.length;
528
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
529
+ const cross = points[j] * points[i + 1] - points[i] * points[j + 1];
530
+ area += cross;
531
+ sx += (points[j] + points[i]) * cross;
532
+ sy += (points[j + 1] + points[i + 1]) * cross;
533
+ }
534
+ if (area === 0) return [(x0 + x1) / 2, (y0 + y1) / 2];
535
+ const cx = sx / (3 * area);
536
+ const cy = sy / (3 * area);
537
+ if (insideRing(points, cx, cy)) return [cx, cy];
538
+ const crossings: number[] = [];
539
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
540
+ const ay = points[j + 1];
541
+ const by = points[i + 1];
542
+ if (ay > cy !== by > cy) {
543
+ crossings.push(
544
+ points[j] + ((cy - ay) / (by - ay)) * (points[i] - points[j]),
545
+ );
546
+ }
547
+ }
548
+ crossings.sort((a, b) => a - b);
549
+ let best = -1;
550
+ let mid = (x0 + x1) / 2;
551
+ for (let c = 0; c + 1 < crossings.length; c += 2) {
552
+ const span = crossings[c + 1] - crossings[c];
553
+ if (span > best) {
554
+ best = span;
555
+ mid = (crossings[c] + crossings[c + 1]) / 2;
556
+ }
557
+ }
558
+ return [mid, cy];
559
+ }
560
+
561
+ /** Even-odd: whether `x, y` is inside the ring. */
562
+ function insideRing(points: readonly number[], x: number, y: number): boolean {
563
+ let inside = false;
564
+ const n = points.length;
565
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
566
+ const xi = points[i];
567
+ const yi = points[i + 1];
568
+ const xj = points[j];
569
+ const yj = points[j + 1];
570
+ if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) {
571
+ inside = !inside;
572
+ }
573
+ }
574
+ return inside;
575
+ }
576
+
577
+ /** How far `x, y` is from the ring's outline. */
578
+ function distanceToRing(points: readonly number[], x: number, y: number) {
579
+ let best = Infinity;
580
+ const n = points.length;
581
+ for (let i = 0, j = n - 2; i < n; j = i, i += 2) {
582
+ const ax = points[j];
583
+ const ay = points[j + 1];
584
+ const dx = points[i] - ax;
585
+ const dy = points[i + 1] - ay;
586
+ const length = dx * dx + dy * dy;
587
+ const t =
588
+ length > 0
589
+ ? Math.max(0, Math.min(1, ((x - ax) * dx + (y - ay) * dy) / length))
590
+ : 0;
591
+ const d = Math.hypot(x - ax - t * dx, y - ay - t * dy);
592
+ if (d < best) best = d;
593
+ }
594
+ return best;
595
+ }
596
+
597
+ /** The ring a point belongs to — the one it is inside, else the nearest
598
+ * within `within` — or -1. */
599
+ function ownerOf(
600
+ rings: readonly SnapRing[],
601
+ grid: Map<number, number[]>,
602
+ seen: Int32Array,
603
+ query: number,
604
+ x: number,
605
+ y: number,
606
+ within: number,
607
+ ): number {
608
+ let best = -1;
609
+ let bestDistance = within;
610
+ for (let gx = cellOf(x - within); gx <= cellOf(x + within); gx++) {
611
+ for (let gy = cellOf(y - within); gy <= cellOf(y + within); gy++) {
612
+ for (const r of grid.get(snapCell(gx, gy)) ?? []) {
613
+ if (seen[r] === query) continue;
614
+ seen[r] = query;
615
+ const ring = rings[r];
616
+ // Past the box by more than the distance allowed: not a candidate.
617
+ const bx = Math.max(ring.x0 - x, 0, x - ring.x1);
618
+ const by = Math.max(ring.y0 - y, 0, y - ring.y1);
619
+ if (bx > bestDistance || by > bestDistance) continue;
620
+ if (bx === 0 && by === 0 && insideRing(ring.points, x, y)) return r;
621
+ const d = distanceToRing(ring.points, x, y);
622
+ if (d <= bestDistance) {
623
+ best = r;
624
+ bestDistance = d;
625
+ }
626
+ }
627
+ }
628
+ }
629
+ return best;
630
+ }
631
+
326
632
  /**
327
633
  * Where a point-like feature's label goes: the point, or for a polygon the
328
634
  * middle of its largest ring's box — a cheap stand-in for the pole of