@react-x11/components 0.8.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 (721) hide show
  1. package/README.md +105 -38
  2. package/dist/charts/node.d.ts +12 -2
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +50 -16
  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/embed/client.d.ts +48 -3
  49. package/dist/embed/client.d.ts.map +1 -1
  50. package/dist/embed/client.js +79 -5
  51. package/dist/embed/client.js.map +1 -1
  52. package/dist/embed/index.d.ts +1 -1
  53. package/dist/embed/index.d.ts.map +1 -1
  54. package/dist/embed/index.js +1 -1
  55. package/dist/embed/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 +240 -6
  115. package/dist/html/css/cascade.d.ts.map +1 -1
  116. package/dist/html/css/cascade.js +1327 -66
  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 +498 -15
  139. package/dist/html/css/style.d.ts.map +1 -1
  140. package/dist/html/css/style.js +3698 -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 +57 -11
  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 +2937 -197
  172. package/dist/html/layout/block.js.map +1 -1
  173. package/dist/html/layout/boxes.d.ts +340 -17
  174. package/dist/html/layout/boxes.d.ts.map +1 -1
  175. package/dist/html/layout/boxes.js +1714 -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 +151 -1
  205. package/dist/html/layout/inline.d.ts.map +1 -1
  206. package/dist/html/layout/inline.js +3375 -174
  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 +172 -5
  221. package/dist/html/node.d.ts.map +1 -1
  222. package/dist/html/node.js +1336 -103
  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 +3503 -141
  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 +435 -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 +2 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +1 -1
  247. package/dist/index.js.map +1 -1
  248. package/dist/internal/collate.d.ts +3 -0
  249. package/dist/internal/collate.d.ts.map +1 -0
  250. package/dist/internal/collate.js +11 -0
  251. package/dist/internal/collate.js.map +1 -0
  252. package/dist/{markdown → internal/markdown}/ast.d.ts +23 -0
  253. package/dist/internal/markdown/ast.d.ts.map +1 -0
  254. package/dist/internal/markdown/ast.js +22 -0
  255. package/dist/internal/markdown/ast.js.map +1 -0
  256. package/dist/internal/markdown/parse.d.ts.map +1 -0
  257. package/dist/{markdown → internal/markdown}/parse.js +221 -30
  258. package/dist/internal/markdown/parse.js.map +1 -0
  259. package/dist/internal/markdown/stringify.d.ts +4 -0
  260. package/dist/internal/markdown/stringify.d.ts.map +1 -0
  261. package/dist/internal/markdown/stringify.js +684 -0
  262. package/dist/internal/markdown/stringify.js.map +1 -0
  263. package/dist/internal/markdown/tags.d.ts.map +1 -0
  264. package/dist/internal/markdown/tags.js.map +1 -0
  265. package/dist/internal/prewarm.d.ts +18 -0
  266. package/dist/internal/prewarm.d.ts.map +1 -0
  267. package/dist/internal/prewarm.js +42 -0
  268. package/dist/internal/prewarm.js.map +1 -0
  269. package/dist/internal/scroll.d.ts +3 -2
  270. package/dist/internal/scroll.d.ts.map +1 -1
  271. package/dist/internal/scroll.js +1 -0
  272. package/dist/internal/scroll.js.map +1 -1
  273. package/dist/internal/sdf.d.ts +20 -0
  274. package/dist/internal/sdf.d.ts.map +1 -0
  275. package/dist/internal/sdf.js +216 -0
  276. package/dist/internal/sdf.js.map +1 -0
  277. package/dist/internal/splice.d.ts +12 -0
  278. package/dist/internal/splice.d.ts.map +1 -0
  279. package/dist/internal/splice.js +23 -0
  280. package/dist/internal/splice.js.map +1 -0
  281. package/dist/internal/window.d.ts +12 -0
  282. package/dist/internal/window.d.ts.map +1 -1
  283. package/dist/internal/window.js +23 -6
  284. package/dist/internal/window.js.map +1 -1
  285. package/dist/maps/anchors.d.ts +103 -0
  286. package/dist/maps/anchors.d.ts.map +1 -0
  287. package/dist/maps/anchors.js +790 -0
  288. package/dist/maps/anchors.js.map +1 -0
  289. package/dist/maps/controller.d.ts +340 -0
  290. package/dist/maps/controller.d.ts.map +1 -0
  291. package/dist/maps/controller.js +822 -0
  292. package/dist/maps/controller.js.map +1 -0
  293. package/dist/maps/gl/buckets.d.ts +99 -0
  294. package/dist/maps/gl/buckets.d.ts.map +1 -0
  295. package/dist/maps/gl/buckets.js +365 -0
  296. package/dist/maps/gl/buckets.js.map +1 -0
  297. package/dist/maps/gl/build-worker.d.ts +15 -0
  298. package/dist/maps/gl/build-worker.d.ts.map +1 -0
  299. package/dist/maps/gl/build-worker.js +44 -0
  300. package/dist/maps/gl/build-worker.js.map +1 -0
  301. package/dist/maps/gl/color.d.ts +8 -0
  302. package/dist/maps/gl/color.d.ts.map +1 -0
  303. package/dist/maps/gl/color.js +57 -0
  304. package/dist/maps/gl/color.js.map +1 -0
  305. package/dist/maps/gl/cover.d.ts +70 -0
  306. package/dist/maps/gl/cover.d.ts.map +1 -0
  307. package/dist/maps/gl/cover.js +137 -0
  308. package/dist/maps/gl/cover.js.map +1 -0
  309. package/dist/maps/gl/index.d.ts +3 -0
  310. package/dist/maps/gl/index.d.ts.map +1 -0
  311. package/dist/maps/gl/index.js +20 -0
  312. package/dist/maps/gl/index.js.map +1 -0
  313. package/dist/maps/gl/markers.d.ts +28 -0
  314. package/dist/maps/gl/markers.d.ts.map +1 -0
  315. package/dist/maps/gl/markers.js +60 -0
  316. package/dist/maps/gl/markers.js.map +1 -0
  317. package/dist/maps/gl/overlays.d.ts +68 -0
  318. package/dist/maps/gl/overlays.d.ts.map +1 -0
  319. package/dist/maps/gl/overlays.js +300 -0
  320. package/dist/maps/gl/overlays.js.map +1 -0
  321. package/dist/maps/gl/pane.d.ts +12 -0
  322. package/dist/maps/gl/pane.d.ts.map +1 -0
  323. package/dist/maps/gl/pane.js +37 -0
  324. package/dist/maps/gl/pane.js.map +1 -0
  325. package/dist/maps/gl/placement.d.ts +124 -0
  326. package/dist/maps/gl/placement.d.ts.map +1 -0
  327. package/dist/maps/gl/placement.js +642 -0
  328. package/dist/maps/gl/placement.js.map +1 -0
  329. package/dist/maps/gl/renderer.d.ts +384 -0
  330. package/dist/maps/gl/renderer.d.ts.map +1 -0
  331. package/dist/maps/gl/renderer.js +1184 -0
  332. package/dist/maps/gl/renderer.js.map +1 -0
  333. package/dist/maps/gl/shaders.d.ts +121 -0
  334. package/dist/maps/gl/shaders.d.ts.map +1 -0
  335. package/dist/maps/gl/shaders.js +453 -0
  336. package/dist/maps/gl/shaders.js.map +1 -0
  337. package/dist/maps/gl/store.d.ts +125 -0
  338. package/dist/maps/gl/store.d.ts.map +1 -0
  339. package/dist/maps/gl/store.js +512 -0
  340. package/dist/maps/gl/store.js.map +1 -0
  341. package/dist/maps/gl/text.d.ts +283 -0
  342. package/dist/maps/gl/text.d.ts.map +1 -0
  343. package/dist/maps/gl/text.js +698 -0
  344. package/dist/maps/gl/text.js.map +1 -0
  345. package/dist/maps/gl/view.d.ts +345 -0
  346. package/dist/maps/gl/view.d.ts.map +1 -0
  347. package/dist/maps/gl/view.js +1209 -0
  348. package/dist/maps/gl/view.js.map +1 -0
  349. package/dist/maps/icons.d.ts +32 -0
  350. package/dist/maps/icons.d.ts.map +1 -0
  351. package/dist/maps/icons.js +151 -0
  352. package/dist/maps/icons.js.map +1 -0
  353. package/dist/maps/index.d.ts +3 -1
  354. package/dist/maps/index.d.ts.map +1 -1
  355. package/dist/maps/index.js +218 -52
  356. package/dist/maps/index.js.map +1 -1
  357. package/dist/maps/labels.d.ts +91 -18
  358. package/dist/maps/labels.d.ts.map +1 -1
  359. package/dist/maps/labels.js +376 -140
  360. package/dist/maps/labels.js.map +1 -1
  361. package/dist/maps/node.d.ts +179 -56
  362. package/dist/maps/node.d.ts.map +1 -1
  363. package/dist/maps/node.js +663 -537
  364. package/dist/maps/node.js.map +1 -1
  365. package/dist/maps/overlay.d.ts +72 -9
  366. package/dist/maps/overlay.d.ts.map +1 -1
  367. package/dist/maps/overlay.js +108 -28
  368. package/dist/maps/overlay.js.map +1 -1
  369. package/dist/maps/paint.d.ts +3 -0
  370. package/dist/maps/paint.d.ts.map +1 -1
  371. package/dist/maps/paint.js.map +1 -1
  372. package/dist/maps/proj.d.ts +62 -0
  373. package/dist/maps/proj.d.ts.map +1 -1
  374. package/dist/maps/proj.js +101 -0
  375. package/dist/maps/proj.js.map +1 -1
  376. package/dist/maps/renderer.d.ts +69 -0
  377. package/dist/maps/renderer.d.ts.map +1 -0
  378. package/dist/maps/renderer.js +66 -0
  379. package/dist/maps/renderer.js.map +1 -0
  380. package/dist/maps/sources.d.ts +30 -6
  381. package/dist/maps/sources.d.ts.map +1 -1
  382. package/dist/maps/sources.js +22 -3
  383. package/dist/maps/sources.js.map +1 -1
  384. package/dist/maps/style.d.ts +35 -0
  385. package/dist/maps/style.d.ts.map +1 -1
  386. package/dist/maps/style.js.map +1 -1
  387. package/dist/maps/styles.d.ts +12 -0
  388. package/dist/maps/styles.d.ts.map +1 -1
  389. package/dist/maps/styles.js +120 -6
  390. package/dist/maps/styles.js.map +1 -1
  391. package/dist/maps/theme.d.ts +19 -0
  392. package/dist/maps/theme.d.ts.map +1 -0
  393. package/dist/maps/theme.js +44 -0
  394. package/dist/maps/theme.js.map +1 -0
  395. package/dist/maps/tiles.d.ts +147 -27
  396. package/dist/maps/tiles.d.ts.map +1 -1
  397. package/dist/maps/tiles.js +221 -54
  398. package/dist/maps/tiles.js.map +1 -1
  399. package/dist/maps/types.d.ts +213 -21
  400. package/dist/maps/types.d.ts.map +1 -1
  401. package/dist/markdown/expressions.d.ts +1 -1
  402. package/dist/markdown/expressions.d.ts.map +1 -1
  403. package/dist/markdown/expressions.js.map +1 -1
  404. package/dist/markdown/index.d.ts +7 -6
  405. package/dist/markdown/index.d.ts.map +1 -1
  406. package/dist/markdown/index.js +121 -50
  407. package/dist/markdown/index.js.map +1 -1
  408. package/dist/markdown/spans.d.ts +1 -1
  409. package/dist/markdown/spans.d.ts.map +1 -1
  410. package/dist/markdown/spans.js +6 -0
  411. package/dist/markdown/spans.js.map +1 -1
  412. package/dist/media-player/index.d.ts +11 -3
  413. package/dist/media-player/index.d.ts.map +1 -1
  414. package/dist/media-player/index.js +13 -2
  415. package/dist/media-player/index.js.map +1 -1
  416. package/dist/qml/containers.d.ts.map +1 -1
  417. package/dist/qml/containers.js +6 -1
  418. package/dist/qml/containers.js.map +1 -1
  419. package/dist/qml/interaction.d.ts.map +1 -1
  420. package/dist/qml/interaction.js +38 -5
  421. package/dist/qml/interaction.js.map +1 -1
  422. package/dist/qml/layouts.d.ts.map +1 -1
  423. package/dist/qml/layouts.js +21 -6
  424. package/dist/qml/layouts.js.map +1 -1
  425. package/dist/qml/qtquick.d.ts.map +1 -1
  426. package/dist/qml/qtquick.js +9 -2
  427. package/dist/qml/qtquick.js.map +1 -1
  428. package/dist/qml/react.d.ts.map +1 -1
  429. package/dist/qml/react.js +9 -7
  430. package/dist/qml/react.js.map +1 -1
  431. package/dist/reorder/clock.d.ts +7 -0
  432. package/dist/reorder/clock.d.ts.map +1 -0
  433. package/dist/reorder/clock.js +26 -0
  434. package/dist/reorder/clock.js.map +1 -0
  435. package/dist/reorder/index.d.ts +25 -3
  436. package/dist/reorder/index.d.ts.map +1 -1
  437. package/dist/reorder/index.js +64 -19
  438. package/dist/reorder/index.js.map +1 -1
  439. package/dist/rich-text-editor/clipboard.d.ts +23 -0
  440. package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
  441. package/dist/rich-text-editor/clipboard.js +307 -0
  442. package/dist/rich-text-editor/clipboard.js.map +1 -0
  443. package/dist/rich-text-editor/collab.d.ts +32 -0
  444. package/dist/rich-text-editor/collab.d.ts.map +1 -0
  445. package/dist/rich-text-editor/collab.js +55 -0
  446. package/dist/rich-text-editor/collab.js.map +1 -0
  447. package/dist/rich-text-editor/commands.d.ts +50 -0
  448. package/dist/rich-text-editor/commands.d.ts.map +1 -0
  449. package/dist/rich-text-editor/commands.js +376 -0
  450. package/dist/rich-text-editor/commands.js.map +1 -0
  451. package/dist/rich-text-editor/drag.d.ts +68 -0
  452. package/dist/rich-text-editor/drag.d.ts.map +1 -0
  453. package/dist/rich-text-editor/drag.js +148 -0
  454. package/dist/rich-text-editor/drag.js.map +1 -0
  455. package/dist/rich-text-editor/html.d.ts +145 -0
  456. package/dist/rich-text-editor/html.d.ts.map +1 -0
  457. package/dist/rich-text-editor/html.js +516 -0
  458. package/dist/rich-text-editor/html.js.map +1 -0
  459. package/dist/rich-text-editor/index.d.ts +252 -0
  460. package/dist/rich-text-editor/index.d.ts.map +1 -0
  461. package/dist/rich-text-editor/index.js +856 -0
  462. package/dist/rich-text-editor/index.js.map +1 -0
  463. package/dist/rich-text-editor/inline.d.ts +94 -0
  464. package/dist/rich-text-editor/inline.d.ts.map +1 -0
  465. package/dist/rich-text-editor/inline.js +252 -0
  466. package/dist/rich-text-editor/inline.js.map +1 -0
  467. package/dist/rich-text-editor/keymap.d.ts +71 -0
  468. package/dist/rich-text-editor/keymap.d.ts.map +1 -0
  469. package/dist/rich-text-editor/keymap.js +394 -0
  470. package/dist/rich-text-editor/keymap.js.map +1 -0
  471. package/dist/rich-text-editor/keys.d.ts +40 -0
  472. package/dist/rich-text-editor/keys.d.ts.map +1 -0
  473. package/dist/rich-text-editor/keys.js +202 -0
  474. package/dist/rich-text-editor/keys.js.map +1 -0
  475. package/dist/rich-text-editor/look.d.ts +71 -0
  476. package/dist/rich-text-editor/look.d.ts.map +1 -0
  477. package/dist/rich-text-editor/look.js +342 -0
  478. package/dist/rich-text-editor/look.js.map +1 -0
  479. package/dist/rich-text-editor/markdown.d.ts +18 -0
  480. package/dist/rich-text-editor/markdown.d.ts.map +1 -0
  481. package/dist/rich-text-editor/markdown.js +496 -0
  482. package/dist/rich-text-editor/markdown.js.map +1 -0
  483. package/dist/rich-text-editor/marks.d.ts +9 -0
  484. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  485. package/dist/rich-text-editor/marks.js +83 -0
  486. package/dist/rich-text-editor/marks.js.map +1 -0
  487. package/dist/rich-text-editor/nodes.d.ts +135 -0
  488. package/dist/rich-text-editor/nodes.d.ts.map +1 -0
  489. package/dist/rich-text-editor/nodes.js +397 -0
  490. package/dist/rich-text-editor/nodes.js.map +1 -0
  491. package/dist/rich-text-editor/render.d.ts +68 -0
  492. package/dist/rich-text-editor/render.d.ts.map +1 -0
  493. package/dist/rich-text-editor/render.js +518 -0
  494. package/dist/rich-text-editor/render.js.map +1 -0
  495. package/dist/rich-text-editor/schema.d.ts +16 -0
  496. package/dist/rich-text-editor/schema.d.ts.map +1 -0
  497. package/dist/rich-text-editor/schema.js +386 -0
  498. package/dist/rich-text-editor/schema.js.map +1 -0
  499. package/dist/rich-text-editor/store.d.ts +11 -0
  500. package/dist/rich-text-editor/store.d.ts.map +1 -0
  501. package/dist/rich-text-editor/store.js +43 -0
  502. package/dist/rich-text-editor/store.js.map +1 -0
  503. package/dist/rich-text-editor/suggest.d.ts +127 -0
  504. package/dist/rich-text-editor/suggest.d.ts.map +1 -0
  505. package/dist/rich-text-editor/suggest.js +0 -0
  506. package/dist/rich-text-editor/suggest.js.map +1 -0
  507. package/dist/rich-text-editor/tables.d.ts +41 -0
  508. package/dist/rich-text-editor/tables.d.ts.map +1 -0
  509. package/dist/rich-text-editor/tables.js +204 -0
  510. package/dist/rich-text-editor/tables.js.map +1 -0
  511. package/dist/rich-text-editor/toolbar.d.ts +58 -0
  512. package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
  513. package/dist/rich-text-editor/toolbar.js +548 -0
  514. package/dist/rich-text-editor/toolbar.js.map +1 -0
  515. package/dist/rich-text-editor/view.d.ts +368 -0
  516. package/dist/rich-text-editor/view.d.ts.map +1 -0
  517. package/dist/rich-text-editor/view.js +1968 -0
  518. package/dist/rich-text-editor/view.js.map +1 -0
  519. package/dist/rich-text-editor/virtual.d.ts +54 -0
  520. package/dist/rich-text-editor/virtual.d.ts.map +1 -0
  521. package/dist/rich-text-editor/virtual.js +279 -0
  522. package/dist/rich-text-editor/virtual.js.map +1 -0
  523. package/dist/richtext/node.d.ts +71 -4
  524. package/dist/richtext/node.d.ts.map +1 -1
  525. package/dist/richtext/node.js +233 -28
  526. package/dist/richtext/node.js.map +1 -1
  527. package/dist/richtext/runs.d.ts +13 -8
  528. package/dist/richtext/runs.d.ts.map +1 -1
  529. package/dist/richtext/runs.js +18 -8
  530. package/dist/richtext/runs.js.map +1 -1
  531. package/dist/table/index.d.ts.map +1 -1
  532. package/dist/table/index.js +23 -0
  533. package/dist/table/index.js.map +1 -1
  534. package/dist/table/rows.d.ts +3 -2
  535. package/dist/table/rows.d.ts.map +1 -1
  536. package/dist/table/rows.js +20 -6
  537. package/dist/table/rows.js.map +1 -1
  538. package/dist/terminal/backends.d.ts +4 -1
  539. package/dist/terminal/backends.d.ts.map +1 -1
  540. package/dist/terminal/backends.js.map +1 -1
  541. package/dist/terminal/index.d.ts +18 -7
  542. package/dist/terminal/index.d.ts.map +1 -1
  543. package/dist/terminal/index.js +32 -11
  544. package/dist/terminal/index.js.map +1 -1
  545. package/dist/terminal/vt/pty.d.ts +13 -2
  546. package/dist/terminal/vt/pty.d.ts.map +1 -1
  547. package/dist/terminal/vt/pty.js +18 -3
  548. package/dist/terminal/vt/pty.js.map +1 -1
  549. package/dist/terminal-output/index.d.ts.map +1 -1
  550. package/dist/terminal-output/index.js +6 -1
  551. package/dist/terminal-output/index.js.map +1 -1
  552. package/dist/three/canvas.d.ts.map +1 -1
  553. package/dist/three/canvas.js +85 -7
  554. package/dist/three/canvas.js.map +1 -1
  555. package/dist/three/events.d.ts +22 -4
  556. package/dist/three/events.d.ts.map +1 -1
  557. package/dist/three/events.js +34 -4
  558. package/dist/three/events.js.map +1 -1
  559. package/dist/tree/index.d.ts.map +1 -1
  560. package/dist/tree/index.js +17 -0
  561. package/dist/tree/index.js.map +1 -1
  562. package/package.json +59 -31
  563. package/src/charts/node.ts +68 -28
  564. package/src/charts/render.ts +120 -30
  565. package/src/code/index.ts +3 -1
  566. package/src/code-editor/completion.ts +3 -2
  567. package/src/code-editor/index.ts +19 -0
  568. package/src/code-editor/node.ts +1574 -184
  569. package/src/code-language/languages/glsl.ts +12 -2
  570. package/src/code-language/languages/javascript.ts +21 -4
  571. package/src/code-language/languages/json.ts +12 -2
  572. package/src/code-language/languages/shell.ts +12 -2
  573. package/src/code-language/languages/sql.ts +22 -2
  574. package/src/code-language/stream.ts +257 -17
  575. package/src/code-language/types.ts +5 -4
  576. package/src/codeblock/index.ts +20 -3
  577. package/src/embed/client.ts +102 -8
  578. package/src/embed/index.ts +2 -0
  579. package/src/flow/draw.ts +167 -41
  580. package/src/flow/gl/color.ts +85 -0
  581. package/src/flow/gl/index.ts +342 -0
  582. package/src/flow/gl/pack.ts +585 -0
  583. package/src/flow/gl/renderer.ts +679 -0
  584. package/src/flow/gl/shaders.ts +371 -0
  585. package/src/flow/gl/text.ts +1295 -0
  586. package/src/flow/index.ts +794 -67
  587. package/src/flow/node.ts +2496 -1256
  588. package/src/flow/paint.ts +511 -0
  589. package/src/flow/paths.ts +80 -15
  590. package/src/flow/scene.ts +2199 -0
  591. package/src/flow/types.ts +113 -1
  592. package/src/html/controls.ts +73 -2
  593. package/src/html/css/calc.ts +385 -0
  594. package/src/html/css/cascade.ts +1403 -62
  595. package/src/html/css/color.ts +755 -0
  596. package/src/html/css/content.ts +417 -0
  597. package/src/html/css/counter-styles.ts +973 -0
  598. package/src/html/css/decode.ts +130 -0
  599. package/src/html/css/parse.ts +1514 -160
  600. package/src/html/css/style.ts +4102 -222
  601. package/src/html/css/ua.ts +58 -12
  602. package/src/html/css/values.ts +150 -50
  603. package/src/html/css/vars.ts +348 -0
  604. package/src/html/dom.ts +284 -17
  605. package/src/html/fonts.ts +641 -0
  606. package/src/html/gif.ts +233 -0
  607. package/src/html/index.ts +180 -20
  608. package/src/html/layout/block.ts +3456 -230
  609. package/src/html/layout/boxes.ts +2100 -190
  610. package/src/html/layout/cache.ts +289 -0
  611. package/src/html/layout/collapse.ts +317 -0
  612. package/src/html/layout/css-grid.ts +1063 -0
  613. package/src/html/layout/flex.ts +1115 -106
  614. package/src/html/layout/floats.ts +128 -14
  615. package/src/html/layout/grid-lines.ts +141 -0
  616. package/src/html/layout/grid.ts +181 -0
  617. package/src/html/layout/inline.ts +3943 -192
  618. package/src/html/layout/shaping.ts +140 -0
  619. package/src/html/layout/table.ts +696 -186
  620. package/src/html/layout/tracks.ts +437 -0
  621. package/src/html/node.ts +1486 -121
  622. package/src/html/paint.ts +4293 -169
  623. package/src/html/resources.ts +161 -50
  624. package/src/html/surfaces.ts +81 -0
  625. package/src/html/svg.ts +493 -0
  626. package/src/html/url.ts +86 -0
  627. package/src/index.ts +4 -0
  628. package/src/internal/collate.ts +12 -0
  629. package/src/{markdown → internal/markdown}/ast.ts +35 -7
  630. package/src/{markdown → internal/markdown}/parse.ts +288 -35
  631. package/src/internal/markdown/stringify.ts +772 -0
  632. package/src/internal/prewarm.ts +45 -0
  633. package/src/internal/scroll.ts +5 -3
  634. package/src/internal/sdf.ts +227 -0
  635. package/src/internal/splice.ts +25 -0
  636. package/src/internal/window.ts +36 -5
  637. package/src/maps/anchors.ts +913 -0
  638. package/src/maps/controller.ts +1084 -0
  639. package/src/maps/gl/buckets.ts +461 -0
  640. package/src/maps/gl/build-worker.ts +66 -0
  641. package/src/maps/gl/color.ts +62 -0
  642. package/src/maps/gl/cover.ts +205 -0
  643. package/src/maps/gl/index.ts +23 -0
  644. package/src/maps/gl/markers.ts +83 -0
  645. package/src/maps/gl/overlays.ts +379 -0
  646. package/src/maps/gl/pane.ts +42 -0
  647. package/src/maps/gl/placement.ts +968 -0
  648. package/src/maps/gl/renderer.ts +1660 -0
  649. package/src/maps/gl/shaders.ts +489 -0
  650. package/src/maps/gl/store.ts +615 -0
  651. package/src/maps/gl/text.ts +868 -0
  652. package/src/maps/gl/view.ts +1489 -0
  653. package/src/maps/icons.ts +183 -0
  654. package/src/maps/index.ts +274 -81
  655. package/src/maps/labels.ts +457 -144
  656. package/src/maps/node.ts +832 -665
  657. package/src/maps/overlay.ts +148 -43
  658. package/src/maps/paint.ts +3 -0
  659. package/src/maps/proj.ts +118 -0
  660. package/src/maps/renderer.ts +155 -0
  661. package/src/maps/sources.ts +43 -6
  662. package/src/maps/style.ts +32 -0
  663. package/src/maps/styles.ts +215 -4
  664. package/src/maps/theme.ts +51 -0
  665. package/src/maps/tiles.ts +253 -62
  666. package/src/maps/types.ts +213 -21
  667. package/src/markdown/expressions.ts +5 -1
  668. package/src/markdown/index.ts +163 -78
  669. package/src/markdown/spans.ts +6 -1
  670. package/src/media-player/index.ts +18 -4
  671. package/src/qml/containers.tsx +6 -1
  672. package/src/qml/interaction.tsx +42 -5
  673. package/src/qml/layouts.tsx +21 -6
  674. package/src/qml/qtquick.tsx +9 -2
  675. package/src/qml/react.tsx +7 -5
  676. package/src/reorder/clock.ts +27 -0
  677. package/src/reorder/index.ts +100 -27
  678. package/src/rich-text-editor/clipboard.ts +439 -0
  679. package/src/rich-text-editor/collab.ts +91 -0
  680. package/src/rich-text-editor/commands.ts +448 -0
  681. package/src/rich-text-editor/dom-globals.d.ts +23 -0
  682. package/src/rich-text-editor/drag.ts +211 -0
  683. package/src/rich-text-editor/html.ts +619 -0
  684. package/src/rich-text-editor/index.ts +1364 -0
  685. package/src/rich-text-editor/inline.ts +345 -0
  686. package/src/rich-text-editor/keymap.ts +510 -0
  687. package/src/rich-text-editor/keys.ts +228 -0
  688. package/src/rich-text-editor/look.ts +427 -0
  689. package/src/rich-text-editor/markdown.ts +653 -0
  690. package/src/rich-text-editor/marks.ts +101 -0
  691. package/src/rich-text-editor/nodes.ts +497 -0
  692. package/src/rich-text-editor/render.ts +837 -0
  693. package/src/rich-text-editor/schema.ts +431 -0
  694. package/src/rich-text-editor/store.ts +39 -0
  695. package/src/rich-text-editor/suggest.ts +597 -0
  696. package/src/rich-text-editor/tables.ts +272 -0
  697. package/src/rich-text-editor/toolbar.ts +724 -0
  698. package/src/rich-text-editor/view.ts +2287 -0
  699. package/src/rich-text-editor/virtual.ts +372 -0
  700. package/src/richtext/node.ts +294 -44
  701. package/src/richtext/runs.ts +23 -12
  702. package/src/table/index.ts +29 -0
  703. package/src/table/rows.ts +18 -8
  704. package/src/terminal/backends.ts +4 -1
  705. package/src/terminal/index.ts +47 -15
  706. package/src/terminal/vt/pty.ts +16 -2
  707. package/src/terminal-output/index.ts +6 -1
  708. package/src/three/canvas.ts +102 -8
  709. package/src/three/events.ts +49 -9
  710. package/src/tree/index.ts +19 -0
  711. package/dist/markdown/ast.d.ts.map +0 -1
  712. package/dist/markdown/ast.js +0 -17
  713. package/dist/markdown/ast.js.map +0 -1
  714. package/dist/markdown/parse.d.ts.map +0 -1
  715. package/dist/markdown/parse.js.map +0 -1
  716. package/dist/markdown/tags.d.ts.map +0 -1
  717. package/dist/markdown/tags.js.map +0 -1
  718. /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
  719. /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
  720. /package/dist/{markdown → internal/markdown}/tags.js +0 -0
  721. /package/src/{markdown → internal/markdown}/tags.ts +0 -0
@@ -18,7 +18,7 @@ import { clipOf, clipRing, clipSegment } from './clip.js';
18
18
  import type { ClipRect } from './clip.js';
19
19
  import type { MapCanvas } from './paint.js';
20
20
  import { projectLngLat } from './proj.js';
21
- import type { LngLat, Transform } from './proj.js';
21
+ import type { LngLat, ScreenRect, Transform } from './proj.js';
22
22
 
23
23
  /** A point on the map the user can click. */
24
24
  export interface MapMarker {
@@ -37,9 +37,11 @@ export interface MapMarker {
37
37
  /** The ring around it, so a marker stays visible on any basemap. The
38
38
  * theme's background by default. */
39
39
  outline?: string;
40
- /** Drawn above unselected markers, and given the selected ring. */
40
+ /** Drawn above the unselected markers of its `zIndex`, and given the
41
+ * selected ring: 2.5 logical pixels of the theme's text colour. */
41
42
  selected?: boolean;
42
- /** Higher draws later. Ties break on array order. */
43
+ /** Higher draws later, and is hit first. Ties break on `selected`, then
44
+ * on array order. */
43
45
  zIndex?: number;
44
46
  /** Skipped by hit testing — for a marker that is decoration. */
45
47
  interactive?: boolean;
@@ -104,12 +106,56 @@ export interface OverlayPalette {
104
106
  text: string;
105
107
  }
106
108
 
109
+ /** The attribution's text size, in logical pixels. */
110
+ export const ATTRIBUTION_SIZE = 9;
111
+ /** The opacity of the box of the theme's background the attribution sits
112
+ * in — enough to read it over any basemap, not so much that it hides one. */
113
+ export const ATTRIBUTION_OPACITY = 0.72;
114
+
115
+ /**
116
+ * Where the attribution goes: a box in the pane's bottom-right corner with 4
117
+ * logical pixels of padding either side of the text and 2 above and below
118
+ * it, and the text's top-left corner inside it — in device pixels, on whole
119
+ * ones. Both renderers lay it out with this, so it sits on the same pixels
120
+ * whichever of them draws the map.
121
+ *
122
+ * `text` is the set string's box and `pane` the pane, in logical pixels.
123
+ */
124
+ export function attributionLayout(
125
+ text: { width: number; height: number },
126
+ pane: ScreenRect,
127
+ scale: number,
128
+ ): { box: ScreenRect; x: number; y: number } {
129
+ const padding = 4;
130
+ const width = text.width + padding * 2;
131
+ const height = text.height + padding;
132
+ const x = pane.x + pane.width - width;
133
+ const y = pane.y + pane.height - height;
134
+ return {
135
+ box: {
136
+ x: Math.round(x * scale),
137
+ y: Math.round(y * scale),
138
+ width: Math.ceil(width * scale),
139
+ height: Math.ceil(height * scale),
140
+ },
141
+ x: Math.round((x + padding) * scale),
142
+ y: Math.round((y + padding / 2) * scale),
143
+ };
144
+ }
145
+
107
146
  function byZ<T extends { zIndex?: number }>(items: readonly T[]): T[] {
108
147
  // A stable sort — the language guarantees it — so items with no `zIndex`
109
148
  // keep the order the application listed them in.
110
149
  return [...items].sort((a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0));
111
150
  }
112
151
 
152
+ /** The order overlays are drawn in, bottom first: by `zIndex`, and
153
+ * otherwise the order the application listed them in. Both renderers
154
+ * draw in it. */
155
+ export function overlayOrder(overlays: readonly MapOverlay[]): MapOverlay[] {
156
+ return byZ(overlays);
157
+ }
158
+
113
159
  /**
114
160
  * Draw the overlays.
115
161
  *
@@ -314,22 +360,87 @@ function appendRing(ctx: MapCanvas, ring: readonly number[]): boolean {
314
360
  return true;
315
361
  }
316
362
 
317
- /** Where a marker's ink lands, in pane-local logical pixels. Shared by the
318
- * drawing and the hit test, so the two cannot disagree — the bug that
319
- * makes a marker unclickable a few pixels from where it looks. */
320
- export function markerRect(
363
+ /** A marker's size when it names none, in logical pixels. */
364
+ export const MARKER_SIZE = 14;
365
+ /** A pin is this many times as tall as it is wide. */
366
+ export const PIN_HEIGHT = 1.4;
367
+
368
+ /**
369
+ * The order markers are drawn in, bottom first: by `zIndex`, a selected
370
+ * marker above the unselected ones of its `zIndex`, and otherwise the order
371
+ * the application listed them in. The hit test walks it from the top, so a
372
+ * press lands on the marker drawn over the others. Both renderers draw in
373
+ * it.
374
+ */
375
+ export function markerOrder(markers: readonly MapMarker[]): MapMarker[] {
376
+ // A stable sort, so equal keys keep the application's order.
377
+ return [...markers].sort(
378
+ (a, b) =>
379
+ (a.zIndex ?? 0) - (b.zIndex ?? 0) ||
380
+ Number(a.selected === true) - Number(b.selected === true),
381
+ );
382
+ }
383
+
384
+ /** A marker's colours and ring, the theme's where it names none — what
385
+ * both renderers paint it with. `ringWidth` is in device pixels. */
386
+ export function markerPaint(
321
387
  marker: MapMarker,
322
- transform: Transform,
323
- ): {
388
+ palette: OverlayPalette,
389
+ scale: number,
390
+ ): { fill: string; ring: string; ringWidth: number } {
391
+ return {
392
+ fill: marker.color ?? palette.accent,
393
+ ring: marker.selected
394
+ ? palette.text
395
+ : (marker.outline ?? palette.background),
396
+ ringWidth: Math.max(1, (marker.selected ? 2.5 : 1.5) * scale),
397
+ };
398
+ }
399
+
400
+ /** Where a marker's ink lands: its box, and the point it marks. */
401
+ export interface MarkerRect {
324
402
  x: number;
325
403
  y: number;
326
404
  width: number;
327
405
  height: number;
328
406
  tipX: number;
329
407
  tipY: number;
330
- } {
408
+ }
409
+
410
+ /**
411
+ * The markers a pane shows, bottom first, with where each one's ink lands
412
+ * — what both renderers draw. A marker wholly outside the pane is left out.
413
+ */
414
+ export function markersInView(
415
+ markers: readonly MapMarker[],
416
+ transform: Transform,
417
+ pane: { width: number; height: number },
418
+ ): { marker: MapMarker; rect: MarkerRect }[] {
419
+ const shown: { marker: MapMarker; rect: MarkerRect }[] = [];
420
+ for (const marker of markerOrder(markers)) {
421
+ const rect = markerRect(marker, transform);
422
+ if (
423
+ rect.x + rect.width < 0 ||
424
+ rect.y + rect.height < 0 ||
425
+ rect.x > pane.width ||
426
+ rect.y > pane.height
427
+ ) {
428
+ continue;
429
+ }
430
+ shown.push({ marker, rect });
431
+ }
432
+ return shown;
433
+ }
434
+
435
+ /** Where a marker's ink lands, in pane-local logical pixels. Shared by the
436
+ * drawing and the hit test, so the two cannot disagree — the bug that
437
+ * makes a marker unclickable a few pixels from where it looks. */
438
+ export function markerRect(
439
+ marker: MapMarker,
440
+ transform: Transform,
441
+ ): MarkerRect {
331
442
  const point = projectLngLat(transform, marker.position);
332
- const size = marker.size ?? 14;
443
+ const size = marker.size ?? MARKER_SIZE;
333
444
  if ((marker.shape ?? 'pin') === 'circle') {
334
445
  return {
335
446
  x: point.x - size / 2,
@@ -343,7 +454,7 @@ export function markerRect(
343
454
  // A pin *stands on* its position: the point is the tip, and the head is
344
455
  // above it. Getting this the other way round puts every marker half its
345
456
  // own height north of where it belongs, which on a city map is a street.
346
- const height = size * 1.4;
457
+ const height = size * PIN_HEIGHT;
347
458
  return {
348
459
  x: point.x - size / 2,
349
460
  y: point.y - height,
@@ -354,7 +465,7 @@ export function markerRect(
354
465
  };
355
466
  }
356
467
 
357
- /** Draw the markers, lowest `zIndex` first. */
468
+ /** Draw the markers, in {@link markerOrder}. */
358
469
  export function drawMarkers(
359
470
  ctx: MapCanvas,
360
471
  markers: readonly MapMarker[],
@@ -363,27 +474,17 @@ export function drawMarkers(
363
474
  scale: number,
364
475
  palette: OverlayPalette,
365
476
  ): number {
366
- let drawn = 0;
367
- for (const marker of byZ(markers)) {
368
- const rect = markerRect(marker, transform);
369
- if (
370
- rect.x + rect.width < 0 ||
371
- rect.y + rect.height < 0 ||
372
- rect.x > pane.width ||
373
- rect.y > pane.height
374
- ) {
375
- continue;
376
- }
377
- const size = marker.size ?? 14;
378
- const fill = marker.color ?? palette.accent;
379
- const ring = marker.outline ?? palette.background;
477
+ const shown = markersInView(markers, transform, pane);
478
+ for (const { marker, rect } of shown) {
479
+ const size = marker.size ?? MARKER_SIZE;
480
+ const paint = markerPaint(marker, palette, scale);
380
481
  const x = (pane.x + rect.tipX) * scale;
381
482
  const y = (pane.y + rect.tipY) * scale;
382
483
  const r = (size / 2) * scale;
383
484
  ctx.save();
384
- ctx.lineWidth = Math.max(1, (marker.selected ? 2.5 : 1.5) * scale);
385
- ctx.strokeStyle = marker.selected ? palette.text : ring;
386
- ctx.fillStyle = fill;
485
+ ctx.lineWidth = paint.ringWidth;
486
+ ctx.strokeStyle = paint.ring;
487
+ ctx.fillStyle = paint.fill;
387
488
  if ((marker.shape ?? 'pin') === 'circle') {
388
489
  ctx.beginPath();
389
490
  ctx.moveTo(x + r, y);
@@ -391,12 +492,14 @@ export function drawMarkers(
391
492
  ctx.fill();
392
493
  ctx.stroke();
393
494
  } else {
394
- // A teardrop: a circle for the head and two lines down to the tip.
395
- // The tangent angle is where the straight sides meet the circle, so
396
- // the outline is smooth rather than two lines crossing an arc.
397
- const cy = y - size * 1.4 * scale + r;
495
+ // A teardrop: a circle for the head and two straight sides down to
496
+ // the tip, meeting the circle where they are tangent to it — at
497
+ // acos(r / d) either side of the line to the tip, seen from the
498
+ // centre — so the outline is smooth rather than two lines crossing
499
+ // an arc.
500
+ const cy = y - size * PIN_HEIGHT * scale + r;
398
501
  const d = y - cy;
399
- const angle = Math.asin(Math.min(1, r / d));
502
+ const angle = Math.acos(Math.min(1, r / d));
400
503
  ctx.beginPath();
401
504
  ctx.arc(x, cy, r, Math.PI / 2 + angle, Math.PI / 2 - angle);
402
505
  ctx.lineTo(x, y);
@@ -405,9 +508,8 @@ export function drawMarkers(
405
508
  ctx.stroke();
406
509
  }
407
510
  ctx.restore();
408
- drawn++;
409
511
  }
410
- return drawn;
512
+ return shown.length;
411
513
  }
412
514
 
413
515
  /** The marker under a pane-local logical point, topmost first, or null. */
@@ -418,7 +520,7 @@ export function markerAt(
418
520
  y: number,
419
521
  slop = 2,
420
522
  ): MapMarker | null {
421
- const ordered = byZ(markers);
523
+ const ordered = markerOrder(markers);
422
524
  for (let i = ordered.length - 1; i >= 0; i--) {
423
525
  const marker = ordered[i];
424
526
  if (marker.interactive === false) continue;
@@ -623,13 +725,16 @@ export function geoJsonOverlays(
623
725
  */
624
726
  const MAX_ARC_RADIUS = 8192;
625
727
 
728
+ /** How many segments a circle of this radius, in pixels, is drawn with as
729
+ * a ring: enough to hold the sagitta under half a pixel. */
730
+ export function circleSegments(radius: number): number {
731
+ const step = 2 * Math.acos(Math.max(-1, 1 - 0.5 / radius));
732
+ return Math.min(4096, Math.max(24, Math.ceil((Math.PI * 2) / step)));
733
+ }
734
+
626
735
  /** A circle as a ring, with the sagitta held under half a pixel. */
627
736
  function circleRing(cx: number, cy: number, radius: number): number[] {
628
- const step = 2 * Math.acos(Math.max(-1, 1 - 0.5 / radius));
629
- const segments = Math.min(
630
- 4096,
631
- Math.max(24, Math.ceil((Math.PI * 2) / step)),
632
- );
737
+ const segments = circleSegments(radius);
633
738
  const out: number[] = [];
634
739
  for (let i = 0; i < segments; i++) {
635
740
  const angle = (i / segments) * Math.PI * 2;
package/src/maps/paint.ts CHANGED
@@ -72,6 +72,9 @@ export interface MapCanvas {
72
72
  * scale bar are drawn with. */
73
73
  fillRects?(rects: readonly number[]): void;
74
74
  setLineDash?(segments: readonly number[]): void;
75
+ /** What a street name set along its street is drawn with. */
76
+ translate?(x: number, y: number): void;
77
+ rotate?(angle: number): void;
75
78
  roundRect?(x: number, y: number, w: number, h: number, radii: number): void;
76
79
  drawImage?(image: unknown, ...args: number[]): void;
77
80
  /** Straight RGBA in, for a raster tile the application decoded. */
package/src/maps/proj.ts CHANGED
@@ -441,6 +441,124 @@ export function subTileOf(
441
441
  };
442
442
  }
443
443
 
444
+ /**
445
+ * Where the data tile that serves a cover entry lands on screen: the entry
446
+ * itself until the cover goes deeper than the source cuts, and past that
447
+ * the whole of the ancestor it is one cell of — `span` times its size,
448
+ * starting `sub.x` cells to its left and `sub.y` above it.
449
+ *
450
+ * What a **raster** tile is drawn over past its source's depth. A vector
451
+ * cell is rasterized from its data tile's features through the cell, which
452
+ * is where overzoom's sharpness comes from; an image has nothing finer in
453
+ * it, so it is drawn whole, once, over this square. Placed from the entry
454
+ * rather than from the camera, and it lands where {@link tileCover} at the
455
+ * source's own depth puts the same tile.
456
+ */
457
+ export function dataSquareOf(
458
+ entry: TileCoverEntry,
459
+ maxZoom: number,
460
+ ): TileCoverEntry {
461
+ const sub = subTileOf(entry.tile, maxZoom);
462
+ if (sub.span === 1) return entry;
463
+ return {
464
+ tile: dataTileFor(entry.tile, maxZoom),
465
+ worldCopy: entry.worldCopy,
466
+ x: entry.x - sub.x * entry.size,
467
+ y: entry.y - sub.y * entry.size,
468
+ size: entry.size * sub.span,
469
+ // The cell's: a square takes its place in the cover's order from the
470
+ // cell it was reached through.
471
+ distance: entry.distance,
472
+ };
473
+ }
474
+
475
+ /**
476
+ * How many levels under a hole {@link fillFromBelow} looks for pieces.
477
+ *
478
+ * A zoom out leaves the level it came from in the middle of the view, and a
479
+ * quick one — a flick of the wheel, a pinch — goes more than one level
480
+ * before a single coarser tile has landed. Four levels down, a tile's pieces
481
+ * are a sixteenth of its width; past that they cover too little of the view
482
+ * to be worth the search.
483
+ */
484
+ export const FILL_DEPTH = 4;
485
+
486
+ /** Part of a tile's square: cell `(x, y)` of a `span × span` grid. */
487
+ export interface TileCell {
488
+ x: number;
489
+ y: number;
490
+ span: number;
491
+ }
492
+
493
+ /** What a {@link fillFromBelow} probe answers for a tile that has nothing
494
+ * of its own to draw but may have something under it. */
495
+ export const BELOW: unique symbol = Symbol('below');
496
+
497
+ /**
498
+ * Cover a hole — a tile with nothing of its own to draw — from the tiles
499
+ * under it that do have something: each quarter of the square from its own
500
+ * child where there is one, and from that child's children where there is
501
+ * not, down to `depth` levels. What is left is the gaps, for the caller to
502
+ * fill from an ancestor.
503
+ *
504
+ * `probe` answers for one tile under the hole: something to draw; `null`
505
+ * for a tile that is answered and has nothing in it, which covers its
506
+ * square as surely as a picture does; {@link BELOW} for nothing here but
507
+ * perhaps something under it; `undefined` for nothing here or under it.
508
+ *
509
+ * The pieces and the gaps tile the square exactly and never overlap, so a
510
+ * caller can draw each once with no clip but its own square. That matters
511
+ * beyond overdraw: a translucent layer drawn twice is darker, and a label
512
+ * from two overlapping pieces is placed twice. And a square with nothing
513
+ * under it after all is one gap, not four, so the ancestor that fills it is
514
+ * one composite.
515
+ */
516
+ export function fillFromBelow<T>(
517
+ tile: TileId,
518
+ depth: number,
519
+ probe: (tile: TileId) => T | null | typeof BELOW | undefined,
520
+ ): {
521
+ pieces: (TileCell & { tile: TileId; value: T })[];
522
+ gaps: TileCell[];
523
+ /** Whether any of the square is covered — by a picture, or by an answer
524
+ * that there is nothing there. */
525
+ covered: boolean;
526
+ } {
527
+ const pieces: (TileCell & { tile: TileId; value: T })[] = [];
528
+ const gaps: TileCell[] = [];
529
+ const visit = (parent: TileId, at: TileCell, left: number): boolean => {
530
+ const gapsBefore = gaps.length;
531
+ let covered = false;
532
+ for (let dy = 0; dy < 2; dy++) {
533
+ for (let dx = 0; dx < 2; dx++) {
534
+ const child = {
535
+ z: parent.z + 1,
536
+ x: parent.x * 2 + dx,
537
+ y: parent.y * 2 + dy,
538
+ };
539
+ const cell = { x: at.x * 2 + dx, y: at.y * 2 + dy, span: at.span * 2 };
540
+ const found = probe(child);
541
+ if (found === BELOW) {
542
+ if (left > 1 && visit(child, cell, left - 1)) covered = true;
543
+ else gaps.push(cell);
544
+ } else if (found === undefined) {
545
+ gaps.push(cell);
546
+ } else {
547
+ if (found !== null)
548
+ pieces.push({ ...cell, tile: child, value: found });
549
+ covered = true;
550
+ }
551
+ }
552
+ }
553
+ // Nothing anywhere under this square: the caller files it as one gap.
554
+ if (!covered) gaps.length = gapsBefore;
555
+ return covered;
556
+ };
557
+ const covered = depth > 0 && visit(tile, { x: 0, y: 0, span: 1 }, depth);
558
+ if (!covered) gaps.push({ x: 0, y: 0, span: 1 });
559
+ return { pieces, gaps, covered };
560
+ }
561
+
444
562
  /**
445
563
  * How large to rasterize a tile whose pyramid level is `z` at camera `zoom`.
446
564
  *
@@ -0,0 +1,155 @@
1
+ // Which of `<Map>`'s two renderers draws a map, and bringing the GL one in.
2
+ //
3
+ // The retained renderer (`./node.ts`) runs everywhere a 2D context does —
4
+ // indirect GLX, a remote X server, Xvfb in CI, the headless harness — and
5
+ // is visible to window capture. The GL renderer (`./gl/`) needs direct GL,
6
+ // and draws every frame from vector data at the display's rate. Neither is
7
+ // deprecated in favour of the other: `docs/prd-maps-gl.md`, "One `<Map>`,
8
+ // two renderers", has why the retained one stays, and this file is the
9
+ // decision between them — pure, so the whole of it is a unit test.
10
+ //
11
+ // `'auto'` decides in this order:
12
+ //
13
+ // 1. An explicit `renderer`, or the environment's, over both props and
14
+ // policy — the way `REACT_X11_BACKEND` works for the backend.
15
+ // 2. Whether this connection draws through the direct backend at all —
16
+ // `useSupports('shaders')`, which on X11 needs `glPolicy: 'auto'` and a
17
+ // DRI3 or Apple-DRI server, and on the Cocoa backend is always true once
18
+ // its probe has answered.
19
+ // 3. At run time, a GL failure moves the map to the retained renderer, with
20
+ // its camera and its handle intact. That one is sticky.
21
+ //
22
+ // A map that asked for `'gl'` by name never falls back: it gets GL, or it
23
+ // gets `onError`.
24
+ import type {
25
+ MapRenderer,
26
+ MapRendererReason,
27
+ MapRendererRequest,
28
+ } from './types.js';
29
+
30
+ /** The environment variable that overrides every map's renderer. */
31
+ export const RENDERER_ENV = 'REACT_X11_MAP_RENDERER';
32
+
33
+ /**
34
+ * What a map asks for when it does not say: GL where this connection draws
35
+ * through the direct backend, the retained renderer everywhere else — which
36
+ * is still every indirect GLX connection, every remote X server and every
37
+ * headless test run. `'retained'` until the GL renderer had soaked on both
38
+ * backends (`docs/prd-maps-gl.md`, "The soak").
39
+ */
40
+ export const DEFAULT_RENDERER: MapRendererRequest = 'auto';
41
+
42
+ const REQUESTS: readonly string[] = ['auto', 'gl', 'retained'];
43
+
44
+ /** Everything the decision reads. */
45
+ export interface RendererInput {
46
+ /** The `renderer` prop. */
47
+ requested?: MapRendererRequest;
48
+ /** `REACT_X11_MAP_RENDERER`, as the environment has it — anything but
49
+ * the three names is ignored. */
50
+ env?: string;
51
+ /** `useSupports('shaders')`: does this connection draw through the
52
+ * direct backend? */
53
+ shaders: boolean;
54
+ /**
55
+ * Whether the answer to that is still to come. The Cocoa backend settles
56
+ * it on the first ask rather than at connect, so the first render of a map
57
+ * there reads `false` for an answer that is about to be `true`; drawing
58
+ * the retained renderer for those few milliseconds would fetch the view's
59
+ * tiles twice. A map in that state shows its background and waits.
60
+ */
61
+ probing?: boolean;
62
+ /** Whether GL has already failed on this map. */
63
+ failed: boolean;
64
+ }
65
+
66
+ /** The decision: a renderer — or `'pending'` while the connection's answer
67
+ * is still to come — and why, when it is not what was asked for. */
68
+ export interface RendererChoice {
69
+ renderer: MapRenderer | 'pending';
70
+ /** Null when the map got what it asked for. */
71
+ reason: MapRendererReason | null;
72
+ /** What was asked for, the environment's word included. */
73
+ asked: MapRendererRequest;
74
+ }
75
+
76
+ function requestOf(value: string | undefined): MapRendererRequest | null {
77
+ const v = value?.trim().toLowerCase();
78
+ return v && REQUESTS.includes(v) ? (v as MapRendererRequest) : null;
79
+ }
80
+
81
+ /**
82
+ * What a map asks for: the environment's word over the prop's, the prop's
83
+ * over the default — and whether the environment is what changed it.
84
+ */
85
+ export function rendererRequest(
86
+ requested: MapRendererRequest | undefined,
87
+ env: string | undefined,
88
+ ): { asked: MapRendererRequest; forced: boolean } {
89
+ const fromEnv = requestOf(env);
90
+ const own = requested ?? DEFAULT_RENDERER;
91
+ return { asked: fromEnv ?? own, forced: fromEnv !== null && fromEnv !== own };
92
+ }
93
+
94
+ /** Choose a map's renderer. */
95
+ export function chooseRenderer(input: RendererInput): RendererChoice {
96
+ const { asked, forced: byEnv } = rendererRequest(input.requested, input.env);
97
+ if (asked === 'retained') {
98
+ return { renderer: 'retained', reason: byEnv ? 'forced' : null, asked };
99
+ }
100
+ if (asked === 'gl') {
101
+ return { renderer: 'gl', reason: byEnv ? 'forced' : null, asked };
102
+ }
103
+ if (input.failed) return { renderer: 'retained', reason: 'gl-failed', asked };
104
+ if (!input.shaders) {
105
+ return input.probing
106
+ ? { renderer: 'pending', reason: null, asked }
107
+ : { renderer: 'retained', reason: 'no-direct-gl', asked };
108
+ }
109
+ return { renderer: 'gl', reason: null, asked };
110
+ }
111
+
112
+ /** The environment's override, read off `globalThis` because `src/` compiles
113
+ * with `types: []`. */
114
+ export function rendererFromEnv(): string | undefined {
115
+ const g = globalThis as {
116
+ process?: { env?: Record<string, string | undefined> };
117
+ };
118
+ return g.process?.env?.[RENDERER_ENV];
119
+ }
120
+
121
+ // --- the GL renderer, loaded when it is chosen --------------------------------
122
+
123
+ /**
124
+ * The GL renderer's module, once it has loaded.
125
+ *
126
+ * Reached by dynamic `import()` and never statically: a static import from
127
+ * `<Map>` would put all of `./gl/` — the shaders, the bucket builder, the
128
+ * label atlas — into every bundle that uses a map, which is the tree-shaking
129
+ * promise broken for an application that never draws one through GL.
130
+ * `test/treeshake.test.ts` holds it to that.
131
+ */
132
+ export type GlRendererModule = typeof import('./gl/index.js');
133
+
134
+ let loaded: GlRendererModule | null = null;
135
+ let loading: Promise<GlRendererModule> | null = null;
136
+
137
+ /** The GL renderer, if it has loaded — so a second map mounts it at once. */
138
+ export function glRendererModule(): GlRendererModule | null {
139
+ return loaded;
140
+ }
141
+
142
+ /** Load the GL renderer — once per process, however many maps ask. */
143
+ export function loadGlRenderer(): Promise<GlRendererModule> {
144
+ loading ??= import('./gl/index.js').then(
145
+ (module) => (loaded = module),
146
+ (error: unknown) => {
147
+ // Asked again next time rather than failing forever on a cached
148
+ // rejection: a load that failed once is most likely to fail again,
149
+ // and the map that asked has already fallen back or reported it.
150
+ loading = null;
151
+ throw error;
152
+ },
153
+ );
154
+ return loading;
155
+ }
@@ -27,7 +27,13 @@ export interface TileRequest extends TileId {
27
27
  * loader. */
28
28
  sourceId: string;
29
29
  /**
30
- * Aborted when the tile leaves the view before it arrives.
30
+ * Aborted when the map stops wanting the tile before it has arrived: it
31
+ * has been panned or zoomed out of what the map is loading (the view and
32
+ * a margin around it), its source has been taken out of `sources`, or the
33
+ * map has unmounted. Whatever an aborted load answers after that, an
34
+ * `AbortError` included, is ignored rather than reported to
35
+ * `onTileError`, and a tile that comes back is asked for again with a new
36
+ * signal.
31
37
  *
32
38
  * **This is a real `AbortSignal`** on every runtime that has one, which
33
39
  * is what makes `fetch(url, { signal })` work — `fetch` rejects anything
@@ -63,8 +69,17 @@ export type TileData =
63
69
 
64
70
  /** A tile source. */
65
71
  export interface MapSource {
66
- /** Distinguishes this source's cache entries from another's. Defaults to
67
- * the source's position in the `sources` array. */
72
+ /**
73
+ * What this source is called: the `sourceId` its `load` requests carry
74
+ * and `onTileError` reports. `source-<index>` by default.
75
+ *
76
+ * **Not** what its tiles are cached under — that is the source object
77
+ * itself, because a name is not a provider: two sources may share one,
78
+ * and a map switched between them must not draw one's tiles as the
79
+ * other's. The flip side is that a source made anew on every render
80
+ * starts from an empty cache on every render, so make it once — at
81
+ * module scope, or in `useMemo`.
82
+ */
68
83
  id?: string;
69
84
  /** Fetch, or answer from a cache, or decline. May be async. */
70
85
  load(request: TileRequest): TileData | Promise<TileData>;
@@ -87,6 +102,26 @@ export interface MapSource {
87
102
  attribution?: string;
88
103
  }
89
104
 
105
+ /**
106
+ * What a map says in its corner: the `attribution` prop when it is given —
107
+ * `''` is the application saying it has put the attribution somewhere else —
108
+ * and otherwise every source's own, each once, in order. Both renderers draw
109
+ * this string, because for open data it is a licence condition.
110
+ */
111
+ export function attributionOf(
112
+ attribution: string | undefined,
113
+ sources: readonly MapSource[],
114
+ ): string {
115
+ if (attribution !== undefined) return attribution;
116
+ const parts: string[] = [];
117
+ for (const source of sources) {
118
+ if (source.attribution && !parts.includes(source.attribution)) {
119
+ parts.push(source.attribution);
120
+ }
121
+ }
122
+ return parts.join(' · ');
123
+ }
124
+
90
125
  /** A source's pyramid, with the defaults filled in. */
91
126
  export function pyramidOf(source: MapSource): {
92
127
  minZoom: number;
@@ -203,10 +238,12 @@ export function osmVectorSource(options: OsmSourceOptions): MapSource {
203
238
  * and it is already installed:
204
239
  *
205
240
  * ```ts
206
- * import ntk from 'react-x11/ntk';
241
+ * import * as ntk from 'react-x11/ntk';
242
+ * // a named export, not a property of the default one, and undeclared
243
+ * const { decodeImage } = ntk as unknown as { decodeImage(b: Uint8Array): {
244
+ * width: number; height: number; data: Uint8Array } };
207
245
  * const decode = (bytes) => {
208
- * const image = (ntk as { decodeImage(b: Uint8Array): {
209
- * width: number; height: number; data: Uint8Array } }).decodeImage(bytes);
246
+ * const image = decodeImage(bytes);
210
247
  * return { width: image.width, height: image.height, data: image.data };
211
248
  * };
212
249
  * ```