@react-x11/components 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/README.md +10 -4
  2. package/dist/charts/node.d.ts +11 -1
  3. package/dist/charts/node.d.ts.map +1 -1
  4. package/dist/charts/node.js +44 -14
  5. package/dist/charts/node.js.map +1 -1
  6. package/dist/charts/render.d.ts +12 -3
  7. package/dist/charts/render.d.ts.map +1 -1
  8. package/dist/charts/render.js +94 -25
  9. package/dist/charts/render.js.map +1 -1
  10. package/dist/code/index.d.ts.map +1 -1
  11. package/dist/code/index.js +3 -1
  12. package/dist/code/index.js.map +1 -1
  13. package/dist/code-editor/completion.d.ts.map +1 -1
  14. package/dist/code-editor/completion.js +3 -2
  15. package/dist/code-editor/completion.js.map +1 -1
  16. package/dist/code-editor/index.d.ts.map +1 -1
  17. package/dist/code-editor/index.js +19 -0
  18. package/dist/code-editor/index.js.map +1 -1
  19. package/dist/code-editor/node.d.ts +177 -7
  20. package/dist/code-editor/node.d.ts.map +1 -1
  21. package/dist/code-editor/node.js +1329 -164
  22. package/dist/code-editor/node.js.map +1 -1
  23. package/dist/code-language/languages/glsl.d.ts.map +1 -1
  24. package/dist/code-language/languages/glsl.js +10 -2
  25. package/dist/code-language/languages/glsl.js.map +1 -1
  26. package/dist/code-language/languages/javascript.d.ts.map +1 -1
  27. package/dist/code-language/languages/javascript.js +18 -3
  28. package/dist/code-language/languages/javascript.js.map +1 -1
  29. package/dist/code-language/languages/json.d.ts.map +1 -1
  30. package/dist/code-language/languages/json.js +10 -2
  31. package/dist/code-language/languages/json.js.map +1 -1
  32. package/dist/code-language/languages/shell.d.ts.map +1 -1
  33. package/dist/code-language/languages/shell.js +10 -2
  34. package/dist/code-language/languages/shell.js.map +1 -1
  35. package/dist/code-language/languages/sql.d.ts.map +1 -1
  36. package/dist/code-language/languages/sql.js +20 -2
  37. package/dist/code-language/languages/sql.js.map +1 -1
  38. package/dist/code-language/stream.d.ts +22 -0
  39. package/dist/code-language/stream.d.ts.map +1 -1
  40. package/dist/code-language/stream.js +259 -9
  41. package/dist/code-language/stream.js.map +1 -1
  42. package/dist/code-language/types.d.ts +5 -4
  43. package/dist/code-language/types.d.ts.map +1 -1
  44. package/dist/codeblock/index.d.ts +13 -2
  45. package/dist/codeblock/index.d.ts.map +1 -1
  46. package/dist/codeblock/index.js +20 -3
  47. package/dist/codeblock/index.js.map +1 -1
  48. package/dist/flow/draw.d.ts +50 -0
  49. package/dist/flow/draw.d.ts.map +1 -1
  50. package/dist/flow/draw.js +132 -33
  51. package/dist/flow/draw.js.map +1 -1
  52. package/dist/flow/gl/color.d.ts +13 -0
  53. package/dist/flow/gl/color.d.ts.map +1 -0
  54. package/dist/flow/gl/color.js +82 -0
  55. package/dist/flow/gl/color.js.map +1 -0
  56. package/dist/flow/gl/index.d.ts +60 -0
  57. package/dist/flow/gl/index.d.ts.map +1 -0
  58. package/dist/flow/gl/index.js +283 -0
  59. package/dist/flow/gl/index.js.map +1 -0
  60. package/dist/flow/gl/pack.d.ts +133 -0
  61. package/dist/flow/gl/pack.d.ts.map +1 -0
  62. package/dist/flow/gl/pack.js +408 -0
  63. package/dist/flow/gl/pack.js.map +1 -0
  64. package/dist/flow/gl/renderer.d.ts +95 -0
  65. package/dist/flow/gl/renderer.d.ts.map +1 -0
  66. package/dist/flow/gl/renderer.js +459 -0
  67. package/dist/flow/gl/renderer.js.map +1 -0
  68. package/dist/flow/gl/shaders.d.ts +79 -0
  69. package/dist/flow/gl/shaders.d.ts.map +1 -0
  70. package/dist/flow/gl/shaders.js +346 -0
  71. package/dist/flow/gl/shaders.js.map +1 -0
  72. package/dist/flow/gl/text.d.ts +318 -0
  73. package/dist/flow/gl/text.d.ts.map +1 -0
  74. package/dist/flow/gl/text.js +1103 -0
  75. package/dist/flow/gl/text.js.map +1 -0
  76. package/dist/flow/index.d.ts +1 -1
  77. package/dist/flow/index.d.ts.map +1 -1
  78. package/dist/flow/index.js +619 -64
  79. package/dist/flow/index.js.map +1 -1
  80. package/dist/flow/node.d.ts +621 -72
  81. package/dist/flow/node.d.ts.map +1 -1
  82. package/dist/flow/node.js +2253 -1018
  83. package/dist/flow/node.js.map +1 -1
  84. package/dist/flow/paint.d.ts +35 -0
  85. package/dist/flow/paint.d.ts.map +1 -0
  86. package/dist/flow/paint.js +393 -0
  87. package/dist/flow/paint.js.map +1 -0
  88. package/dist/flow/paths.d.ts +14 -0
  89. package/dist/flow/paths.d.ts.map +1 -1
  90. package/dist/flow/paths.js +45 -19
  91. package/dist/flow/paths.js.map +1 -1
  92. package/dist/flow/scene.d.ts +584 -0
  93. package/dist/flow/scene.d.ts.map +1 -0
  94. package/dist/flow/scene.js +1453 -0
  95. package/dist/flow/scene.js.map +1 -0
  96. package/dist/flow/types.d.ts +111 -1
  97. package/dist/flow/types.d.ts.map +1 -1
  98. package/dist/html/controls.d.ts +28 -0
  99. package/dist/html/controls.d.ts.map +1 -1
  100. package/dist/html/controls.js +52 -2
  101. package/dist/html/controls.js.map +1 -1
  102. package/dist/html/css/calc.d.ts +14 -0
  103. package/dist/html/css/calc.d.ts.map +1 -0
  104. package/dist/html/css/calc.js +344 -0
  105. package/dist/html/css/calc.js.map +1 -0
  106. package/dist/html/css/cascade.d.ts +240 -6
  107. package/dist/html/css/cascade.d.ts.map +1 -1
  108. package/dist/html/css/cascade.js +1327 -66
  109. package/dist/html/css/cascade.js.map +1 -1
  110. package/dist/html/css/color.d.ts +23 -0
  111. package/dist/html/css/color.d.ts.map +1 -0
  112. package/dist/html/css/color.js +740 -0
  113. package/dist/html/css/color.js.map +1 -0
  114. package/dist/html/css/content.d.ts +92 -0
  115. package/dist/html/css/content.d.ts.map +1 -0
  116. package/dist/html/css/content.js +388 -0
  117. package/dist/html/css/content.js.map +1 -0
  118. package/dist/html/css/counter-styles.d.ts +76 -0
  119. package/dist/html/css/counter-styles.d.ts.map +1 -0
  120. package/dist/html/css/counter-styles.js +893 -0
  121. package/dist/html/css/counter-styles.js.map +1 -0
  122. package/dist/html/css/decode.d.ts +12 -0
  123. package/dist/html/css/decode.d.ts.map +1 -0
  124. package/dist/html/css/decode.js +116 -0
  125. package/dist/html/css/decode.js.map +1 -0
  126. package/dist/html/css/parse.d.ts +110 -10
  127. package/dist/html/css/parse.d.ts.map +1 -1
  128. package/dist/html/css/parse.js +1473 -180
  129. package/dist/html/css/parse.js.map +1 -1
  130. package/dist/html/css/style.d.ts +498 -15
  131. package/dist/html/css/style.d.ts.map +1 -1
  132. package/dist/html/css/style.js +3698 -206
  133. package/dist/html/css/style.js.map +1 -1
  134. package/dist/html/css/ua.d.ts.map +1 -1
  135. package/dist/html/css/ua.js +57 -11
  136. package/dist/html/css/ua.js.map +1 -1
  137. package/dist/html/css/values.d.ts +37 -3
  138. package/dist/html/css/values.d.ts.map +1 -1
  139. package/dist/html/css/values.js +122 -48
  140. package/dist/html/css/values.js.map +1 -1
  141. package/dist/html/css/vars.d.ts +52 -0
  142. package/dist/html/css/vars.d.ts.map +1 -0
  143. package/dist/html/css/vars.js +358 -0
  144. package/dist/html/css/vars.js.map +1 -0
  145. package/dist/html/dom.d.ts +30 -4
  146. package/dist/html/dom.d.ts.map +1 -1
  147. package/dist/html/dom.js +278 -17
  148. package/dist/html/dom.js.map +1 -1
  149. package/dist/html/fonts.d.ts +106 -0
  150. package/dist/html/fonts.d.ts.map +1 -0
  151. package/dist/html/fonts.js +565 -0
  152. package/dist/html/fonts.js.map +1 -0
  153. package/dist/html/gif.d.ts +15 -0
  154. package/dist/html/gif.d.ts.map +1 -0
  155. package/dist/html/gif.js +229 -0
  156. package/dist/html/gif.js.map +1 -0
  157. package/dist/html/index.d.ts +50 -11
  158. package/dist/html/index.d.ts.map +1 -1
  159. package/dist/html/index.js +115 -9
  160. package/dist/html/index.js.map +1 -1
  161. package/dist/html/layout/block.d.ts +226 -3
  162. package/dist/html/layout/block.d.ts.map +1 -1
  163. package/dist/html/layout/block.js +2937 -197
  164. package/dist/html/layout/block.js.map +1 -1
  165. package/dist/html/layout/boxes.d.ts +340 -17
  166. package/dist/html/layout/boxes.d.ts.map +1 -1
  167. package/dist/html/layout/boxes.js +1714 -182
  168. package/dist/html/layout/boxes.js.map +1 -1
  169. package/dist/html/layout/cache.d.ts +58 -0
  170. package/dist/html/layout/cache.d.ts.map +1 -0
  171. package/dist/html/layout/cache.js +224 -0
  172. package/dist/html/layout/cache.js.map +1 -0
  173. package/dist/html/layout/collapse.d.ts +45 -0
  174. package/dist/html/layout/collapse.d.ts.map +1 -0
  175. package/dist/html/layout/collapse.js +246 -0
  176. package/dist/html/layout/collapse.js.map +1 -0
  177. package/dist/html/layout/css-grid.d.ts +7 -0
  178. package/dist/html/layout/css-grid.d.ts.map +1 -0
  179. package/dist/html/layout/css-grid.js +900 -0
  180. package/dist/html/layout/css-grid.js.map +1 -0
  181. package/dist/html/layout/flex.d.ts.map +1 -1
  182. package/dist/html/layout/flex.js +1025 -89
  183. package/dist/html/layout/flex.js.map +1 -1
  184. package/dist/html/layout/floats.d.ts +45 -6
  185. package/dist/html/layout/floats.d.ts.map +1 -1
  186. package/dist/html/layout/floats.js +113 -14
  187. package/dist/html/layout/floats.js.map +1 -1
  188. package/dist/html/layout/grid-lines.d.ts +39 -0
  189. package/dist/html/layout/grid-lines.d.ts.map +1 -0
  190. package/dist/html/layout/grid-lines.js +119 -0
  191. package/dist/html/layout/grid-lines.js.map +1 -0
  192. package/dist/html/layout/grid.d.ts +53 -0
  193. package/dist/html/layout/grid.d.ts.map +1 -0
  194. package/dist/html/layout/grid.js +153 -0
  195. package/dist/html/layout/grid.js.map +1 -0
  196. package/dist/html/layout/inline.d.ts +151 -1
  197. package/dist/html/layout/inline.d.ts.map +1 -1
  198. package/dist/html/layout/inline.js +3375 -174
  199. package/dist/html/layout/inline.js.map +1 -1
  200. package/dist/html/layout/shaping.d.ts +6 -0
  201. package/dist/html/layout/shaping.d.ts.map +1 -0
  202. package/dist/html/layout/shaping.js +100 -0
  203. package/dist/html/layout/shaping.js.map +1 -0
  204. package/dist/html/layout/table.d.ts +3 -0
  205. package/dist/html/layout/table.d.ts.map +1 -1
  206. package/dist/html/layout/table.js +681 -175
  207. package/dist/html/layout/table.js.map +1 -1
  208. package/dist/html/layout/tracks.d.ts +44 -0
  209. package/dist/html/layout/tracks.d.ts.map +1 -0
  210. package/dist/html/layout/tracks.js +349 -0
  211. package/dist/html/layout/tracks.js.map +1 -0
  212. package/dist/html/node.d.ts +169 -4
  213. package/dist/html/node.d.ts.map +1 -1
  214. package/dist/html/node.js +1331 -100
  215. package/dist/html/node.js.map +1 -1
  216. package/dist/html/paint.d.ts +92 -3
  217. package/dist/html/paint.d.ts.map +1 -1
  218. package/dist/html/paint.js +3503 -141
  219. package/dist/html/paint.js.map +1 -1
  220. package/dist/html/resources.d.ts +60 -14
  221. package/dist/html/resources.d.ts.map +1 -1
  222. package/dist/html/resources.js +122 -36
  223. package/dist/html/resources.js.map +1 -1
  224. package/dist/html/surfaces.d.ts +23 -0
  225. package/dist/html/surfaces.d.ts.map +1 -0
  226. package/dist/html/surfaces.js +68 -0
  227. package/dist/html/surfaces.js.map +1 -0
  228. package/dist/html/svg.d.ts +80 -0
  229. package/dist/html/svg.d.ts.map +1 -0
  230. package/dist/html/svg.js +435 -0
  231. package/dist/html/svg.js.map +1 -0
  232. package/dist/html/url.d.ts +23 -0
  233. package/dist/html/url.d.ts.map +1 -0
  234. package/dist/html/url.js +80 -0
  235. package/dist/html/url.js.map +1 -0
  236. package/dist/index.d.ts +1 -1
  237. package/dist/index.d.ts.map +1 -1
  238. package/dist/index.js.map +1 -1
  239. package/dist/internal/collate.d.ts +3 -0
  240. package/dist/internal/collate.d.ts.map +1 -0
  241. package/dist/internal/collate.js +11 -0
  242. package/dist/internal/collate.js.map +1 -0
  243. package/dist/internal/markdown/ast.d.ts +11 -0
  244. package/dist/internal/markdown/ast.d.ts.map +1 -1
  245. package/dist/internal/markdown/parse.d.ts.map +1 -1
  246. package/dist/internal/markdown/parse.js +109 -8
  247. package/dist/internal/markdown/parse.js.map +1 -1
  248. package/dist/internal/prewarm.d.ts +18 -0
  249. package/dist/internal/prewarm.d.ts.map +1 -0
  250. package/dist/internal/prewarm.js +42 -0
  251. package/dist/internal/prewarm.js.map +1 -0
  252. package/dist/internal/sdf.d.ts +20 -0
  253. package/dist/internal/sdf.d.ts.map +1 -0
  254. package/dist/internal/sdf.js +216 -0
  255. package/dist/internal/sdf.js.map +1 -0
  256. package/dist/internal/splice.d.ts +12 -0
  257. package/dist/internal/splice.d.ts.map +1 -0
  258. package/dist/internal/splice.js +23 -0
  259. package/dist/internal/splice.js.map +1 -0
  260. package/dist/internal/window.d.ts +12 -0
  261. package/dist/internal/window.d.ts.map +1 -1
  262. package/dist/internal/window.js +23 -6
  263. package/dist/internal/window.js.map +1 -1
  264. package/dist/maps/anchors.d.ts +6 -1
  265. package/dist/maps/anchors.d.ts.map +1 -1
  266. package/dist/maps/anchors.js +260 -1
  267. package/dist/maps/anchors.js.map +1 -1
  268. package/dist/maps/controller.d.ts +57 -0
  269. package/dist/maps/controller.d.ts.map +1 -1
  270. package/dist/maps/controller.js +97 -18
  271. package/dist/maps/controller.js.map +1 -1
  272. package/dist/maps/gl/buckets.d.ts +5 -1
  273. package/dist/maps/gl/buckets.d.ts.map +1 -1
  274. package/dist/maps/gl/buckets.js +5 -2
  275. package/dist/maps/gl/buckets.js.map +1 -1
  276. package/dist/maps/gl/build-worker.d.ts +2 -0
  277. package/dist/maps/gl/build-worker.d.ts.map +1 -1
  278. package/dist/maps/gl/build-worker.js +1 -1
  279. package/dist/maps/gl/build-worker.js.map +1 -1
  280. package/dist/maps/gl/cover.d.ts +23 -4
  281. package/dist/maps/gl/cover.d.ts.map +1 -1
  282. package/dist/maps/gl/cover.js +61 -48
  283. package/dist/maps/gl/cover.js.map +1 -1
  284. package/dist/maps/gl/placement.d.ts +21 -8
  285. package/dist/maps/gl/placement.d.ts.map +1 -1
  286. package/dist/maps/gl/placement.js +133 -58
  287. package/dist/maps/gl/placement.js.map +1 -1
  288. package/dist/maps/gl/renderer.d.ts +36 -4
  289. package/dist/maps/gl/renderer.d.ts.map +1 -1
  290. package/dist/maps/gl/renderer.js +81 -24
  291. package/dist/maps/gl/renderer.js.map +1 -1
  292. package/dist/maps/gl/shaders.d.ts +18 -17
  293. package/dist/maps/gl/shaders.d.ts.map +1 -1
  294. package/dist/maps/gl/shaders.js +34 -32
  295. package/dist/maps/gl/shaders.js.map +1 -1
  296. package/dist/maps/gl/store.d.ts +10 -0
  297. package/dist/maps/gl/store.d.ts.map +1 -1
  298. package/dist/maps/gl/store.js +47 -4
  299. package/dist/maps/gl/store.js.map +1 -1
  300. package/dist/maps/gl/text.d.ts +153 -24
  301. package/dist/maps/gl/text.d.ts.map +1 -1
  302. package/dist/maps/gl/text.js +379 -63
  303. package/dist/maps/gl/text.js.map +1 -1
  304. package/dist/maps/gl/view.d.ts +293 -2
  305. package/dist/maps/gl/view.d.ts.map +1 -1
  306. package/dist/maps/gl/view.js +317 -82
  307. package/dist/maps/gl/view.js.map +1 -1
  308. package/dist/maps/icons.d.ts +32 -0
  309. package/dist/maps/icons.d.ts.map +1 -0
  310. package/dist/maps/icons.js +151 -0
  311. package/dist/maps/icons.js.map +1 -0
  312. package/dist/maps/index.d.ts +2 -0
  313. package/dist/maps/index.d.ts.map +1 -1
  314. package/dist/maps/index.js +2 -0
  315. package/dist/maps/index.js.map +1 -1
  316. package/dist/maps/labels.d.ts +56 -4
  317. package/dist/maps/labels.d.ts.map +1 -1
  318. package/dist/maps/labels.js +213 -46
  319. package/dist/maps/labels.js.map +1 -1
  320. package/dist/maps/node.d.ts +17 -0
  321. package/dist/maps/node.d.ts.map +1 -1
  322. package/dist/maps/node.js +64 -30
  323. package/dist/maps/node.js.map +1 -1
  324. package/dist/maps/proj.d.ts +48 -0
  325. package/dist/maps/proj.d.ts.map +1 -1
  326. package/dist/maps/proj.js +73 -0
  327. package/dist/maps/proj.js.map +1 -1
  328. package/dist/maps/sources.d.ts +5 -3
  329. package/dist/maps/sources.d.ts.map +1 -1
  330. package/dist/maps/sources.js +5 -3
  331. package/dist/maps/sources.js.map +1 -1
  332. package/dist/maps/style.d.ts +35 -0
  333. package/dist/maps/style.d.ts.map +1 -1
  334. package/dist/maps/style.js.map +1 -1
  335. package/dist/maps/styles.d.ts +12 -0
  336. package/dist/maps/styles.d.ts.map +1 -1
  337. package/dist/maps/styles.js +120 -6
  338. package/dist/maps/styles.js.map +1 -1
  339. package/dist/maps/tiles.d.ts +31 -11
  340. package/dist/maps/tiles.d.ts.map +1 -1
  341. package/dist/maps/tiles.js +61 -27
  342. package/dist/maps/tiles.js.map +1 -1
  343. package/dist/maps/types.d.ts +28 -4
  344. package/dist/maps/types.d.ts.map +1 -1
  345. package/dist/markdown/index.d.ts.map +1 -1
  346. package/dist/markdown/index.js +112 -43
  347. package/dist/markdown/index.js.map +1 -1
  348. package/dist/markdown/spans.d.ts.map +1 -1
  349. package/dist/markdown/spans.js +6 -0
  350. package/dist/markdown/spans.js.map +1 -1
  351. package/dist/qml/containers.d.ts.map +1 -1
  352. package/dist/qml/containers.js +6 -1
  353. package/dist/qml/containers.js.map +1 -1
  354. package/dist/qml/interaction.d.ts.map +1 -1
  355. package/dist/qml/interaction.js +38 -5
  356. package/dist/qml/interaction.js.map +1 -1
  357. package/dist/qml/layouts.d.ts.map +1 -1
  358. package/dist/qml/layouts.js +21 -6
  359. package/dist/qml/layouts.js.map +1 -1
  360. package/dist/qml/qtquick.d.ts.map +1 -1
  361. package/dist/qml/qtquick.js +9 -2
  362. package/dist/qml/qtquick.js.map +1 -1
  363. package/dist/qml/react.d.ts.map +1 -1
  364. package/dist/qml/react.js +9 -7
  365. package/dist/qml/react.js.map +1 -1
  366. package/dist/reorder/clock.d.ts +7 -0
  367. package/dist/reorder/clock.d.ts.map +1 -0
  368. package/dist/reorder/clock.js +26 -0
  369. package/dist/reorder/clock.js.map +1 -0
  370. package/dist/reorder/index.d.ts +25 -3
  371. package/dist/reorder/index.d.ts.map +1 -1
  372. package/dist/reorder/index.js +64 -19
  373. package/dist/reorder/index.js.map +1 -1
  374. package/dist/rich-text-editor/index.d.ts +0 -11
  375. package/dist/rich-text-editor/index.d.ts.map +1 -1
  376. package/dist/rich-text-editor/index.js +35 -1
  377. package/dist/rich-text-editor/index.js.map +1 -1
  378. package/dist/rich-text-editor/keymap.d.ts.map +1 -1
  379. package/dist/rich-text-editor/keymap.js +2 -1
  380. package/dist/rich-text-editor/keymap.js.map +1 -1
  381. package/dist/rich-text-editor/keys.d.ts +17 -6
  382. package/dist/rich-text-editor/keys.d.ts.map +1 -1
  383. package/dist/rich-text-editor/keys.js +135 -26
  384. package/dist/rich-text-editor/keys.js.map +1 -1
  385. package/dist/rich-text-editor/marks.d.ts +9 -0
  386. package/dist/rich-text-editor/marks.d.ts.map +1 -0
  387. package/dist/rich-text-editor/marks.js +83 -0
  388. package/dist/rich-text-editor/marks.js.map +1 -0
  389. package/dist/rich-text-editor/render.d.ts.map +1 -1
  390. package/dist/rich-text-editor/render.js +28 -10
  391. package/dist/rich-text-editor/render.js.map +1 -1
  392. package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
  393. package/dist/rich-text-editor/toolbar.js +1 -1
  394. package/dist/rich-text-editor/toolbar.js.map +1 -1
  395. package/dist/rich-text-editor/virtual.d.ts.map +1 -1
  396. package/dist/rich-text-editor/virtual.js +17 -0
  397. package/dist/rich-text-editor/virtual.js.map +1 -1
  398. package/dist/richtext/node.d.ts +46 -2
  399. package/dist/richtext/node.d.ts.map +1 -1
  400. package/dist/richtext/node.js +187 -4
  401. package/dist/richtext/node.js.map +1 -1
  402. package/dist/richtext/runs.d.ts +13 -8
  403. package/dist/richtext/runs.d.ts.map +1 -1
  404. package/dist/richtext/runs.js +18 -8
  405. package/dist/richtext/runs.js.map +1 -1
  406. package/dist/table/index.d.ts.map +1 -1
  407. package/dist/table/index.js +23 -0
  408. package/dist/table/index.js.map +1 -1
  409. package/dist/table/rows.d.ts +3 -2
  410. package/dist/table/rows.d.ts.map +1 -1
  411. package/dist/table/rows.js +20 -6
  412. package/dist/table/rows.js.map +1 -1
  413. package/dist/terminal/index.d.ts.map +1 -1
  414. package/dist/terminal/index.js +4 -0
  415. package/dist/terminal/index.js.map +1 -1
  416. package/dist/terminal/vt/pty.d.ts +13 -2
  417. package/dist/terminal/vt/pty.d.ts.map +1 -1
  418. package/dist/terminal/vt/pty.js +18 -3
  419. package/dist/terminal/vt/pty.js.map +1 -1
  420. package/dist/terminal-output/index.d.ts.map +1 -1
  421. package/dist/terminal-output/index.js +6 -1
  422. package/dist/terminal-output/index.js.map +1 -1
  423. package/dist/three/canvas.d.ts.map +1 -1
  424. package/dist/three/canvas.js +85 -7
  425. package/dist/three/canvas.js.map +1 -1
  426. package/dist/three/events.d.ts +22 -4
  427. package/dist/three/events.d.ts.map +1 -1
  428. package/dist/three/events.js +34 -4
  429. package/dist/three/events.js.map +1 -1
  430. package/dist/tree/index.d.ts.map +1 -1
  431. package/dist/tree/index.js +17 -0
  432. package/dist/tree/index.js.map +1 -1
  433. package/package.json +42 -33
  434. package/src/charts/node.ts +62 -26
  435. package/src/charts/render.ts +120 -30
  436. package/src/code/index.ts +3 -1
  437. package/src/code-editor/completion.ts +3 -2
  438. package/src/code-editor/index.ts +19 -0
  439. package/src/code-editor/node.ts +1574 -184
  440. package/src/code-language/languages/glsl.ts +12 -2
  441. package/src/code-language/languages/javascript.ts +21 -4
  442. package/src/code-language/languages/json.ts +12 -2
  443. package/src/code-language/languages/shell.ts +12 -2
  444. package/src/code-language/languages/sql.ts +22 -2
  445. package/src/code-language/stream.ts +257 -17
  446. package/src/code-language/types.ts +5 -4
  447. package/src/codeblock/index.ts +20 -3
  448. package/src/flow/draw.ts +167 -41
  449. package/src/flow/gl/color.ts +85 -0
  450. package/src/flow/gl/index.ts +342 -0
  451. package/src/flow/gl/pack.ts +585 -0
  452. package/src/flow/gl/renderer.ts +679 -0
  453. package/src/flow/gl/shaders.ts +371 -0
  454. package/src/flow/gl/text.ts +1295 -0
  455. package/src/flow/index.ts +794 -67
  456. package/src/flow/node.ts +2496 -1256
  457. package/src/flow/paint.ts +511 -0
  458. package/src/flow/paths.ts +80 -15
  459. package/src/flow/scene.ts +2199 -0
  460. package/src/flow/types.ts +113 -1
  461. package/src/html/controls.ts +73 -2
  462. package/src/html/css/calc.ts +385 -0
  463. package/src/html/css/cascade.ts +1403 -62
  464. package/src/html/css/color.ts +755 -0
  465. package/src/html/css/content.ts +417 -0
  466. package/src/html/css/counter-styles.ts +973 -0
  467. package/src/html/css/decode.ts +130 -0
  468. package/src/html/css/parse.ts +1514 -160
  469. package/src/html/css/style.ts +4102 -222
  470. package/src/html/css/ua.ts +58 -12
  471. package/src/html/css/values.ts +150 -50
  472. package/src/html/css/vars.ts +348 -0
  473. package/src/html/dom.ts +284 -17
  474. package/src/html/fonts.ts +641 -0
  475. package/src/html/gif.ts +233 -0
  476. package/src/html/index.ts +180 -20
  477. package/src/html/layout/block.ts +3456 -230
  478. package/src/html/layout/boxes.ts +2100 -190
  479. package/src/html/layout/cache.ts +289 -0
  480. package/src/html/layout/collapse.ts +317 -0
  481. package/src/html/layout/css-grid.ts +1063 -0
  482. package/src/html/layout/flex.ts +1115 -106
  483. package/src/html/layout/floats.ts +128 -14
  484. package/src/html/layout/grid-lines.ts +141 -0
  485. package/src/html/layout/grid.ts +181 -0
  486. package/src/html/layout/inline.ts +3943 -192
  487. package/src/html/layout/shaping.ts +140 -0
  488. package/src/html/layout/table.ts +696 -186
  489. package/src/html/layout/tracks.ts +437 -0
  490. package/src/html/node.ts +1481 -118
  491. package/src/html/paint.ts +4293 -169
  492. package/src/html/resources.ts +161 -50
  493. package/src/html/surfaces.ts +81 -0
  494. package/src/html/svg.ts +493 -0
  495. package/src/html/url.ts +86 -0
  496. package/src/index.ts +2 -0
  497. package/src/internal/collate.ts +12 -0
  498. package/src/internal/markdown/ast.ts +11 -0
  499. package/src/internal/markdown/parse.ts +154 -11
  500. package/src/internal/prewarm.ts +45 -0
  501. package/src/internal/sdf.ts +227 -0
  502. package/src/internal/splice.ts +25 -0
  503. package/src/internal/window.ts +36 -5
  504. package/src/maps/anchors.ts +307 -1
  505. package/src/maps/controller.ts +116 -31
  506. package/src/maps/gl/buckets.ts +5 -1
  507. package/src/maps/gl/build-worker.ts +13 -2
  508. package/src/maps/gl/cover.ts +79 -44
  509. package/src/maps/gl/placement.ts +221 -69
  510. package/src/maps/gl/renderer.ts +104 -20
  511. package/src/maps/gl/shaders.ts +35 -32
  512. package/src/maps/gl/store.ts +66 -17
  513. package/src/maps/gl/text.ts +444 -71
  514. package/src/maps/gl/view.ts +361 -96
  515. package/src/maps/icons.ts +183 -0
  516. package/src/maps/index.ts +4 -0
  517. package/src/maps/labels.ts +269 -49
  518. package/src/maps/node.ts +82 -49
  519. package/src/maps/proj.ts +87 -0
  520. package/src/maps/sources.ts +5 -3
  521. package/src/maps/style.ts +32 -0
  522. package/src/maps/styles.ts +215 -4
  523. package/src/maps/tiles.ts +64 -31
  524. package/src/maps/types.ts +28 -4
  525. package/src/markdown/index.ts +149 -67
  526. package/src/markdown/spans.ts +5 -0
  527. package/src/qml/containers.tsx +6 -1
  528. package/src/qml/interaction.tsx +42 -5
  529. package/src/qml/layouts.tsx +21 -6
  530. package/src/qml/qtquick.tsx +9 -2
  531. package/src/qml/react.tsx +7 -5
  532. package/src/reorder/clock.ts +27 -0
  533. package/src/reorder/index.ts +100 -27
  534. package/src/rich-text-editor/index.ts +34 -1
  535. package/src/rich-text-editor/keymap.ts +1 -1
  536. package/src/rich-text-editor/keys.ts +135 -26
  537. package/src/rich-text-editor/marks.ts +101 -0
  538. package/src/rich-text-editor/render.ts +49 -12
  539. package/src/rich-text-editor/toolbar.ts +1 -1
  540. package/src/rich-text-editor/virtual.ts +25 -0
  541. package/src/richtext/node.ts +235 -14
  542. package/src/richtext/runs.ts +23 -12
  543. package/src/table/index.ts +29 -0
  544. package/src/table/rows.ts +18 -8
  545. package/src/terminal/index.ts +4 -0
  546. package/src/terminal/vt/pty.ts +16 -2
  547. package/src/terminal-output/index.ts +6 -1
  548. package/src/three/canvas.ts +102 -8
  549. package/src/three/events.ts +49 -9
  550. package/src/tree/index.ts +19 -0
package/src/maps/node.ts CHANGED
@@ -206,6 +206,26 @@ interface VisibleTile {
206
206
  */
207
207
  const RESTYLE_WAIT_MS = 1500;
208
208
 
209
+ /**
210
+ * The clock {@link RESTYLE_WAIT_MS} is measured on: the raster budget's,
211
+ * read at the same moment, as a frame begins.
212
+ *
213
+ * One object, exported from this module though not from the package, so a
214
+ * test can stand in for it and move the bound's time on a step at a time,
215
+ * as `glideClock` in `./controller.ts` does for a glide. On the real clock a
216
+ * test finds the swap only once the step that made it is over, and on a
217
+ * loaded runner one step took long enough to put that two and a half
218
+ * seconds past the bound. It is not the budget's own `now`, because a test
219
+ * that held that one would hold the raster deadline with it: a frame would
220
+ * draw every tile to the end, and there would be no redraw left for the
221
+ * bound to cut short.
222
+ */
223
+ export const restyleClock = {
224
+ now(): number {
225
+ return now();
226
+ },
227
+ };
228
+
209
229
  /**
210
230
  * The previous style, held on screen while a restyle draws the new one.
211
231
  *
@@ -240,7 +260,8 @@ interface Outgoing {
240
260
  view: string;
241
261
  moved: boolean;
242
262
  /** Milliseconds the map has been free to draw since the switch, and when
243
- * the last frame that was began — `null` when the last frame was not. */
263
+ * the last frame that was began on {@link restyleClock} — `null` when
264
+ * the last frame was not. */
244
265
  waited: number;
245
266
  lastDrawn: number | null;
246
267
  }
@@ -734,6 +755,7 @@ export class MapViewNode extends Node {
734
755
  if (!this._visible() || !isMapCanvas(ctx)) return;
735
756
 
736
757
  const started = now();
758
+ const restyleAt = restyleClock.now();
737
759
  const scale = this._scale;
738
760
  this._frameClip = damage
739
761
  ? {
@@ -794,6 +816,7 @@ export class MapViewNode extends Node {
794
816
  : box;
795
817
  if (!clip) {
796
818
  this._controller.painting = false;
819
+ this._controller.paintEnded();
797
820
  this._frameClip = null;
798
821
  return;
799
822
  }
@@ -838,7 +861,7 @@ export class MapViewNode extends Node {
838
861
  pane,
839
862
  stats,
840
863
  budget,
841
- started,
864
+ restyleAt,
842
865
  !damage || containsRect(damage, box),
843
866
  progressive,
844
867
  );
@@ -895,6 +918,7 @@ export class MapViewNode extends Node {
895
918
  this._stats = stats;
896
919
  this._painted = true;
897
920
  this._controller.painting = false;
921
+ this._controller.paintEnded();
898
922
  this._frameClip = null;
899
923
  void frame;
900
924
  this._prop<(stats: MapFrameStats) => void>('onFrame')?.(stats);
@@ -965,7 +989,8 @@ export class MapViewNode extends Node {
965
989
  pane: ScreenRect,
966
990
  stats: MapFrameStats,
967
991
  budget: number,
968
- started: number,
992
+ /** When this frame began, on {@link restyleClock}. */
993
+ began: number,
969
994
  whole: boolean,
970
995
  progressive: boolean,
971
996
  ): void {
@@ -985,9 +1010,9 @@ export class MapViewNode extends Node {
985
1010
  // next frame after it begins.
986
1011
  if (budget > 0) {
987
1012
  if (outgoing.lastDrawn !== null) {
988
- outgoing.waited += started - outgoing.lastDrawn;
1013
+ outgoing.waited += began - outgoing.lastDrawn;
989
1014
  }
990
- outgoing.lastDrawn = started;
1015
+ outgoing.lastDrawn = began;
991
1016
  } else {
992
1017
  outgoing.lastDrawn = null;
993
1018
  }
@@ -1264,10 +1289,13 @@ export class MapViewNode extends Node {
1264
1289
  // background — with the labels and the markers still drawn over it —
1265
1290
  // until the coarser tile had been fetched, rasterized and composited.
1266
1291
  //
1267
- // Descendants win when they cover the whole square, because they are
1268
- // sharper and they are the level the user is coming *from*; the
1269
- // ancestor wins when they do not, because a complete blurry picture
1270
- // beats a sharp one with holes in it.
1292
+ // Both, in one square: the descendants wherever there are any, because
1293
+ // they are sharper and they are the level the user is coming *from*,
1294
+ // and the ancestor in the gaps between them. The first cut chose one
1295
+ // for the whole square — descendants only when they tiled it, and
1296
+ // only when no ancestor was in hand — and a zoom out lands at the
1297
+ // edges of the level it left, where they never tile it: that was the
1298
+ // background there, sharp tiles in hand or not.
1271
1299
  //
1272
1300
  // Looked up whether or not this pass draws the tile, because the
1273
1301
  // lookup is what stamps a piece as in use: a piece covering a hole is
@@ -1275,60 +1303,65 @@ export class MapViewNode extends Node {
1275
1303
  // — which, in the one-pixel frames a redraw runs in, was every piece
1276
1304
  // but the one under that pixel. A restyle keeps such pieces on screen
1277
1305
  // for as long as its redraw takes.
1278
- const kids = this._cache.descendantsWithSurface(
1306
+ const below = this._cache.descendantsWithSurface(
1279
1307
  source,
1280
1308
  entry.tile,
1281
- undefined,
1282
1309
  generation,
1283
1310
  );
1284
- const covered =
1285
- kids.length > 0 && kids.length === kids[0].span * kids[0].span;
1286
- const ancestor = covered
1287
- ? null
1288
- : this._cache.ancestorWithSurface(
1289
- source,
1290
- entry.tile,
1291
- undefined,
1292
- generation,
1293
- );
1311
+ const ancestor =
1312
+ below.gaps.length > 0
1313
+ ? this._cache.ancestorWithSurface(
1314
+ source,
1315
+ entry.tile,
1316
+ undefined,
1317
+ generation,
1318
+ )
1319
+ : null;
1294
1320
  if (!inPass) continue;
1295
- if (ancestor?.shown) {
1296
- const up = entry.tile.z - ancestor.tile.z;
1321
+ for (const piece of below.pieces) {
1322
+ const edge = entry.size / piece.span;
1323
+ this._composite(
1324
+ ctx,
1325
+ piece.value.shown!.surface,
1326
+ piece.value.shown!.size,
1327
+ {
1328
+ x: box.x + piece.x * edge,
1329
+ y: box.y + piece.y * edge,
1330
+ width: edge,
1331
+ height: edge,
1332
+ },
1333
+ scale,
1334
+ 0,
1335
+ 0,
1336
+ 1,
1337
+ );
1338
+ }
1339
+ if (below.pieces.length > 0) stats.fromDescendant++;
1340
+ if (!ancestor?.shown) continue;
1341
+ for (const gap of below.gaps) {
1342
+ // The gap is a tile `log2(span)` levels under this one, and the
1343
+ // ancestor is `up` levels over that: the same sub-square arithmetic
1344
+ // as a whole tile, one level set deeper.
1345
+ const edge = entry.size / gap.span;
1346
+ const up = entry.tile.z + Math.log2(gap.span) - ancestor.tile.z;
1297
1347
  const span = 1 << up;
1298
- const fx = entry.tile.x - (ancestor.tile.x << up);
1299
- const fy = entry.tile.y - (ancestor.tile.y << up);
1300
1348
  this._composite(
1301
1349
  ctx,
1302
1350
  ancestor.shown.surface,
1303
1351
  ancestor.shown.size,
1304
- box,
1352
+ {
1353
+ x: box.x + gap.x * edge,
1354
+ y: box.y + gap.y * edge,
1355
+ width: edge,
1356
+ height: edge,
1357
+ },
1305
1358
  scale,
1306
- fx,
1307
- fy,
1359
+ entry.tile.x * gap.span + gap.x - (ancestor.tile.x << up),
1360
+ entry.tile.y * gap.span + gap.y - (ancestor.tile.y << up),
1308
1361
  span,
1309
1362
  );
1310
- stats.fromAncestor++;
1311
- } else if (kids.length > 0) {
1312
- for (const kid of kids) {
1313
- const piece = entry.size / kid.span;
1314
- this._composite(
1315
- ctx,
1316
- kid.entry.shown!.surface,
1317
- kid.entry.shown!.size,
1318
- {
1319
- x: box.x + kid.x * piece,
1320
- y: box.y + kid.y * piece,
1321
- width: piece,
1322
- height: piece,
1323
- },
1324
- scale,
1325
- 0,
1326
- 0,
1327
- 1,
1328
- );
1329
- }
1330
- stats.fromDescendant++;
1331
1363
  }
1364
+ stats.fromAncestor++;
1332
1365
  }
1333
1366
  }
1334
1367
 
package/src/maps/proj.ts CHANGED
@@ -472,6 +472,93 @@ export function dataSquareOf(
472
472
  };
473
473
  }
474
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
+
475
562
  /**
476
563
  * How large to rasterize a tile whose pyramid level is `z` at camera `zoom`.
477
564
  *
@@ -238,10 +238,12 @@ export function osmVectorSource(options: OsmSourceOptions): MapSource {
238
238
  * and it is already installed:
239
239
  *
240
240
  * ```ts
241
- * 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 } };
242
245
  * const decode = (bytes) => {
243
- * const image = (ntk as { decodeImage(b: Uint8Array): {
244
- * width: number; height: number; data: Uint8Array } }).decodeImage(bytes);
246
+ * const image = decodeImage(bytes);
245
247
  * return { width: image.width, height: image.height, data: image.data };
246
248
  * };
247
249
  * ```
package/src/maps/style.ts CHANGED
@@ -23,6 +23,7 @@
23
23
  // the whole performance argument for the restriction: a dense tile has
24
24
  // twelve thousand features and eighteen layers, so anything computed per
25
25
  // layer is free and anything computed per feature is the frame.
26
+ import type { MapIcon } from './icons.js';
26
27
  import type { FeatureValue } from './mvt.js';
27
28
  import { GeomType } from './mvt.js';
28
29
  import type { FeatureCursor } from './mvt.js';
@@ -151,6 +152,37 @@ export interface SymbolLayer extends LayerBase {
151
152
  * distance is where that line goes.
152
153
  */
153
154
  repeatDistance?: number;
155
+ /**
156
+ * A pictogram set on the point, with the text beside it — the bus that
157
+ * says "Lyons Ave/Yuille St" is a stop, not a street. The icon is centred
158
+ * on the feature and the text sits to its right; the two are placed, and
159
+ * give way, as one. Point labels only: a name along a street has no point
160
+ * to stand an icon on, and is set as though there were none.
161
+ *
162
+ * One icon per layer, like {@link rank} and for the same reason — a
163
+ * `filter` split says which features get which, exactly.
164
+ */
165
+ icon?: MapIcon;
166
+ /** Logical pixels across the icon's plate. 14 by default. */
167
+ iconSize?: Zoomed<number>;
168
+ /** The plate's colour. */
169
+ iconColor?: Zoomed<string>;
170
+ /** The pictogram's colour, over the plate. White by default. */
171
+ iconGlyphColor?: Zoomed<string>;
172
+ /**
173
+ * Move each point label into the polygon of `sourceLayer` it belongs to —
174
+ * a house number into its house. A point inside a polygon belongs to it;
175
+ * one outside, to the nearest polygon within `within` metres (15 by
176
+ * default). It moves only where it is the one point that polygon is
177
+ * claimed by, and then to the polygon's middle; every other point stays
178
+ * where the data put it. Absent, nothing moves.
179
+ *
180
+ * Worth having because address data is often not *on* its building: an
181
+ * address point sits in the lot, metres from the house, and a number
182
+ * drawn there reads as the garden's. On OpenStreetMap's tiles around
183
+ * Melbourne, 42% of address points were inside a building.
184
+ */
185
+ snapInto?: { sourceLayer: string; within?: number };
154
186
  }
155
187
 
156
188
  export type MapStyleLayer = FillLayer | LineLayer | CircleLayer | SymbolLayer;
@@ -19,7 +19,14 @@
19
19
  // Every layer's `id` is stable, because that is what an application filters
20
20
  // on to hide one (`style.layers.filter((l) => l.id !== 'buildings')`) and
21
21
  // what a `<Map>` event names.
22
- import type { MapStyle, MapStyleLayer, Zoomed } from './style.js';
22
+ import type { MapIcon } from './icons.js';
23
+ import type {
24
+ MapFilter,
25
+ MapStyle,
26
+ MapStyleLayer,
27
+ SymbolLayer,
28
+ Zoomed,
29
+ } from './style.js';
23
30
 
24
31
  /** The tags Shortbread puts a road's class in, grouped as a style wants
25
32
  * them rather than as the schema lists them. */
@@ -108,6 +115,8 @@ export interface MapPalette {
108
115
  text: string;
109
116
  textMinor: string;
110
117
  halo: string;
118
+ /** The plate a public-transport stop's pictogram is set on. */
119
+ transit: string;
111
120
  }
112
121
 
113
122
  /** OSM Carto's hues, near enough that a user's eye reads the map as the one
@@ -135,6 +144,7 @@ export const LIGHT_PALETTE: MapPalette = {
135
144
  text: '#33322e',
136
145
  textMinor: '#6b6862',
137
146
  halo: 'rgba(255,255,255,0.85)',
147
+ transit: '#2a6fb8',
138
148
  };
139
149
 
140
150
  /** The dark counterpart. Desaturated rather than inverted: an inverted map
@@ -162,6 +172,7 @@ export const DARK_PALETTE: MapPalette = {
162
172
  text: '#d3d7de',
163
173
  textMinor: '#9299a3',
164
174
  halo: 'rgba(12,14,18,0.85)',
175
+ transit: '#3b78c4',
165
176
  };
166
177
 
167
178
  /** How wide a road class is, at each zoom. */
@@ -190,6 +201,16 @@ export interface ShortbreadStyleOptions {
190
201
  /** Leave building footprints out. They are the densest polygon layer at
191
202
  * high zoom and the first thing to drop on a slow machine. */
192
203
  buildings?: boolean;
204
+ /**
205
+ * Set each house number inside its building (`SymbolLayer.snapInto` on
206
+ * the `house-numbers` layer), where the address data puts it in the lot
207
+ * beside the house. Off by default, and off means every number is exactly
208
+ * where the data says. A number moves only into a building that is its
209
+ * alone and within 15 m, so a duplex's two numbers, or one whose house is
210
+ * not mapped, stay put. Needs the footprints: with `buildings: false`
211
+ * there is nothing to set a number in, and nothing moves.
212
+ */
213
+ snapBuildingNumbers?: boolean;
193
214
  }
194
215
 
195
216
  /**
@@ -593,11 +614,29 @@ export function shortbreadStyle(
593
614
  // a street's name is what they read once they are oriented.
594
615
  rank: 20,
595
616
  },
617
+ // Public transport, a layer per pictogram, which Shortbread's `kind`
618
+ // says. A stop's name alone reads as a street's: "Lyons Ave/Yuille
619
+ // St" is a bus stop, and only the bus says so.
620
+ ...SHORTBREAD_STOPS.map((stop) =>
621
+ stopLayer(
622
+ p,
623
+ name,
624
+ stop.id,
625
+ 'public_transport',
626
+ ['in', 'kind', ...stop.kinds],
627
+ stop.icon,
628
+ stop.minZoom,
629
+ stop.rank,
630
+ ),
631
+ ),
596
632
  {
633
+ // What has no pictogram here — a helipad, a lift station — named
634
+ // as every stop used to be.
597
635
  id: 'transport-labels',
598
636
  type: 'symbol',
599
637
  sourceLayer: 'public_transport',
600
638
  minZoom: 15,
639
+ filter: ['!in', 'kind', ...SHORTBREAD_STOPS.flatMap((s) => s.kinds)],
601
640
  textField: name,
602
641
  textColor: p.textMinor,
603
642
  textHaloColor: p.halo,
@@ -605,6 +644,7 @@ export function shortbreadStyle(
605
644
  textSize: 10,
606
645
  rank: 10,
607
646
  },
647
+ houseNumbers(p, 'addresses', snapInto(options, 'buildings')),
608
648
  );
609
649
  }
610
650
 
@@ -618,6 +658,121 @@ function scaleWidth(base: Zoomed<number>, add: number): Zoomed<number> {
618
658
  return { stops: base.stops.map(([z, v]) => [z, v + add] as const) };
619
659
  }
620
660
 
661
+ /** Shortbread's public-transport kinds that have a pictogram, and the zoom
662
+ * and rank a stop of each is named at: an airport among the towns, a
663
+ * station among the suburbs, a bus stop under the streets. */
664
+ const SHORTBREAD_STOPS: readonly {
665
+ id: string;
666
+ kinds: readonly string[];
667
+ icon: MapIcon;
668
+ minZoom: number;
669
+ rank: number;
670
+ }[] = [
671
+ {
672
+ id: 'transport-airport',
673
+ kinds: ['aerodrome'],
674
+ icon: 'airport',
675
+ minZoom: 11,
676
+ rank: 70,
677
+ },
678
+ {
679
+ id: 'transport-rail',
680
+ kinds: ['station', 'halt'],
681
+ icon: 'train',
682
+ minZoom: 13,
683
+ rank: 50,
684
+ },
685
+ {
686
+ id: 'transport-ferry',
687
+ kinds: ['ferry_terminal'],
688
+ icon: 'ferry',
689
+ minZoom: 13,
690
+ rank: 45,
691
+ },
692
+ {
693
+ id: 'transport-tram',
694
+ kinds: ['tram_stop'],
695
+ icon: 'tram',
696
+ minZoom: 15,
697
+ rank: 12,
698
+ },
699
+ {
700
+ id: 'transport-bus',
701
+ kinds: ['bus_stop', 'bus_station'],
702
+ icon: 'bus',
703
+ minZoom: 15,
704
+ rank: 10,
705
+ },
706
+ ];
707
+
708
+ /** A public-transport stop: its pictogram on the point, its name beside
709
+ * it. The same layer over either schema, less where the schema keeps it. */
710
+ function stopLayer(
711
+ p: MapPalette,
712
+ name: string,
713
+ id: string,
714
+ sourceLayer: string,
715
+ filter: MapFilter | undefined,
716
+ icon: MapIcon,
717
+ minZoom: number,
718
+ rank: number,
719
+ ): SymbolLayer {
720
+ return {
721
+ id,
722
+ type: 'symbol',
723
+ sourceLayer,
724
+ minZoom,
725
+ filter,
726
+ textField: name,
727
+ textColor: p.textMinor,
728
+ textHaloColor: p.halo,
729
+ textHaloWidth: 1,
730
+ textSize: 10,
731
+ icon,
732
+ iconColor: p.transit,
733
+ rank,
734
+ };
735
+ }
736
+
737
+ /** The footprints house numbers snap into, where the options ask for it and
738
+ * the footprints are there to snap into. */
739
+ function snapInto(
740
+ options: ShortbreadStyleOptions,
741
+ buildings: string,
742
+ ): string | null {
743
+ return options.snapBuildingNumbers && options.buildings !== false
744
+ ? buildings
745
+ : null;
746
+ }
747
+
748
+ /**
749
+ * House numbers, once a house is big enough on screen to carry one: from
750
+ * zoom 18, which on this map's 512-pixel world is a 256-pixel map's 19 —
751
+ * where Google Maps sets them.
752
+ */
753
+ function houseNumbers(
754
+ p: MapPalette,
755
+ sourceLayer: string,
756
+ buildings: string | null,
757
+ ): SymbolLayer {
758
+ return {
759
+ id: 'house-numbers',
760
+ type: 'symbol',
761
+ sourceLayer,
762
+ ...(buildings ? { snapInto: { sourceLayer: buildings } } : {}),
763
+ minZoom: 18,
764
+ textField: 'housenumber',
765
+ textColor: p.textMinor,
766
+ textHaloColor: p.halo,
767
+ textHaloWidth: 1,
768
+ textSize: 10,
769
+ // Under every other name, and held to no repeat distance: "2" is the
770
+ // number of a house on every street there is.
771
+ rank: 0,
772
+ repeatDistance: 0,
773
+ };
774
+ }
775
+
621
776
  // --- OpenMapTiles -----------------------------------------------------------
622
777
 
623
778
  /**
@@ -682,9 +837,6 @@ export function openMapTilesStyle(
682
837
  };
683
838
  const name = options.nameField ?? 'name';
684
839
  const layers: MapStyleLayer[] = [
685
- // One `water` layer for everything wet, with `class` telling the sea
686
- // from a lake — where Shortbread has `ocean` and `water_polygons`.
687
- { id: 'ocean', type: 'fill', sourceLayer: 'water', color: p.water },
688
840
  {
689
841
  id: 'landuse-green',
690
842
  type: 'fill',
@@ -708,6 +860,18 @@ export function openMapTilesStyle(
708
860
  filter: ['in', 'class', ...OMT_SITES],
709
861
  color: p.site,
710
862
  },
863
+ // One `water` layer for everything wet, with `class` telling the sea
864
+ // from a lake — where Shortbread has `ocean` and `water_polygons`.
865
+ //
866
+ // Drawn **over** the green and the built-up, as Shortbread's
867
+ // `water_polygons` are and as OSM Bright and OSM Liberty draw it. This
868
+ // schema has no land polygons — land is the background and the sea is
869
+ // cut out of it — and its `park` layer carries protected areas, which
870
+ // are often mostly sea: the Pearl River Estuary's dolphin reserve is a
871
+ // rectangle of water west of Lantau. Drawn first, the sea went under
872
+ // every park that reaches into it, and under every one with a lake in
873
+ // it.
874
+ { id: 'ocean', type: 'fill', sourceLayer: 'water', color: p.water },
711
875
  {
712
876
  id: 'water-lines',
713
877
  type: 'line',
@@ -1033,6 +1197,53 @@ export function openMapTilesStyle(
1033
1197
  textSize: 11,
1034
1198
  rank: 20,
1035
1199
  },
1200
+ // Public transport, from `poi`'s classes — OpenMapTiles has no layer
1201
+ // of its own for it — and airports from theirs.
1202
+ stopLayer(
1203
+ p,
1204
+ name,
1205
+ 'transport-airport',
1206
+ 'aerodrome_label',
1207
+ undefined,
1208
+ 'airport',
1209
+ 11,
1210
+ 70,
1211
+ ),
1212
+ stopLayer(
1213
+ p,
1214
+ name,
1215
+ 'transport-rail',
1216
+ 'poi',
1217
+ [
1218
+ 'all',
1219
+ ['==', 'class', 'railway'],
1220
+ ['in', 'subclass', 'station', 'halt'],
1221
+ ],
1222
+ 'train',
1223
+ 13,
1224
+ 50,
1225
+ ),
1226
+ stopLayer(
1227
+ p,
1228
+ name,
1229
+ 'transport-tram',
1230
+ 'poi',
1231
+ ['==', 'subclass', 'tram_stop'],
1232
+ 'tram',
1233
+ 15,
1234
+ 12,
1235
+ ),
1236
+ stopLayer(
1237
+ p,
1238
+ name,
1239
+ 'transport-bus',
1240
+ 'poi',
1241
+ ['==', 'class', 'bus'],
1242
+ 'bus',
1243
+ 15,
1244
+ 10,
1245
+ ),
1246
+ houseNumbers(p, 'housenumber', snapInto(options, 'building')),
1036
1247
  );
1037
1248
  }
1038
1249