@tileflow/maps 0.1.0-alpha.7 → 0.1.0-alpha.9

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 (378) hide show
  1. package/README.md +149 -14
  2. package/THIRD_PARTY_NOTICES.md +24 -6
  3. package/assets/README.md +23 -2
  4. package/assets/streets/build-trees.mjs +425 -0
  5. package/assets/streets/icons/aerialway-dark.svg +11 -0
  6. package/assets/streets/icons/aerialway-monochrome-dark.svg +11 -0
  7. package/assets/streets/icons/aerialway-monochrome.svg +11 -0
  8. package/assets/streets/icons/aerialway.svg +11 -0
  9. package/assets/streets/icons/airport-dark.svg +11 -0
  10. package/assets/streets/icons/airport-monochrome-dark.svg +11 -0
  11. package/assets/streets/icons/airport-monochrome.svg +11 -0
  12. package/assets/streets/icons/airport.svg +11 -0
  13. package/assets/streets/icons/amusement-park-dark.svg +11 -0
  14. package/assets/streets/icons/amusement-park-monochrome-dark.svg +11 -0
  15. package/assets/streets/icons/amusement-park-monochrome.svg +11 -0
  16. package/assets/streets/icons/amusement-park.svg +11 -0
  17. package/assets/streets/icons/aquarium-dark.svg +11 -0
  18. package/assets/streets/icons/aquarium-monochrome-dark.svg +11 -0
  19. package/assets/streets/icons/aquarium-monochrome.svg +11 -0
  20. package/assets/streets/icons/aquarium.svg +11 -0
  21. package/assets/streets/icons/art-gallery-dark.svg +11 -0
  22. package/assets/streets/icons/art-gallery-monochrome-dark.svg +11 -0
  23. package/assets/streets/icons/art-gallery-monochrome.svg +11 -0
  24. package/assets/streets/icons/art-gallery.svg +11 -0
  25. package/assets/streets/icons/bank-dark.svg +11 -0
  26. package/assets/streets/icons/bank-monochrome-dark.svg +11 -0
  27. package/assets/streets/icons/bank-monochrome.svg +11 -0
  28. package/assets/streets/icons/bank.svg +11 -0
  29. package/assets/streets/icons/bar-dark.svg +11 -0
  30. package/assets/streets/icons/bar-monochrome-dark.svg +11 -0
  31. package/assets/streets/icons/bar-monochrome.svg +11 -0
  32. package/assets/streets/icons/bar.svg +11 -0
  33. package/assets/streets/icons/beach-dark.svg +11 -0
  34. package/assets/streets/icons/beach-monochrome-dark.svg +11 -0
  35. package/assets/streets/icons/beach-monochrome.svg +11 -0
  36. package/assets/streets/icons/beach.svg +11 -0
  37. package/assets/streets/icons/beauty-dark.svg +11 -0
  38. package/assets/streets/icons/beauty-monochrome-dark.svg +11 -0
  39. package/assets/streets/icons/beauty-monochrome.svg +11 -0
  40. package/assets/streets/icons/beauty.svg +11 -0
  41. package/assets/streets/icons/bookstore-dark.svg +11 -0
  42. package/assets/streets/icons/bookstore-monochrome-dark.svg +11 -0
  43. package/assets/streets/icons/bookstore-monochrome.svg +11 -0
  44. package/assets/streets/icons/bookstore.svg +11 -0
  45. package/assets/streets/icons/buddhist-dark.svg +11 -0
  46. package/assets/streets/icons/buddhist-monochrome-dark.svg +11 -0
  47. package/assets/streets/icons/buddhist-monochrome.svg +11 -0
  48. package/assets/streets/icons/buddhist.svg +11 -0
  49. package/assets/streets/icons/bus-dark.svg +11 -0
  50. package/assets/streets/icons/bus-monochrome-dark.svg +11 -0
  51. package/assets/streets/icons/bus-monochrome.svg +11 -0
  52. package/assets/streets/icons/bus.svg +11 -0
  53. package/assets/streets/icons/campsite-dark.svg +11 -0
  54. package/assets/streets/icons/campsite-monochrome-dark.svg +11 -0
  55. package/assets/streets/icons/campsite-monochrome.svg +11 -0
  56. package/assets/streets/icons/campsite.svg +11 -0
  57. package/assets/streets/icons/car-dark.svg +11 -0
  58. package/assets/streets/icons/car-monochrome-dark.svg +11 -0
  59. package/assets/streets/icons/car-monochrome.svg +11 -0
  60. package/assets/streets/icons/car-repair-dark.svg +11 -0
  61. package/assets/streets/icons/car-repair-monochrome-dark.svg +11 -0
  62. package/assets/streets/icons/car-repair-monochrome.svg +11 -0
  63. package/assets/streets/icons/car-repair.svg +11 -0
  64. package/assets/streets/icons/car.svg +11 -0
  65. package/assets/streets/icons/casino-dark.svg +11 -0
  66. package/assets/streets/icons/casino-monochrome-dark.svg +11 -0
  67. package/assets/streets/icons/casino-monochrome.svg +11 -0
  68. package/assets/streets/icons/casino.svg +11 -0
  69. package/assets/streets/icons/castle-dark.svg +11 -0
  70. package/assets/streets/icons/castle-monochrome-dark.svg +11 -0
  71. package/assets/streets/icons/castle-monochrome.svg +11 -0
  72. package/assets/streets/icons/castle.svg +11 -0
  73. package/assets/streets/icons/cemetery-dark.svg +11 -0
  74. package/assets/streets/icons/cemetery-monochrome-dark.svg +11 -0
  75. package/assets/streets/icons/cemetery-monochrome.svg +11 -0
  76. package/assets/streets/icons/cemetery.svg +11 -0
  77. package/assets/streets/icons/charging-station-dark.svg +11 -0
  78. package/assets/streets/icons/charging-station-monochrome-dark.svg +11 -0
  79. package/assets/streets/icons/charging-station-monochrome.svg +11 -0
  80. package/assets/streets/icons/charging-station.svg +11 -0
  81. package/assets/streets/icons/christian-dark.svg +11 -0
  82. package/assets/streets/icons/christian-monochrome-dark.svg +11 -0
  83. package/assets/streets/icons/christian-monochrome.svg +11 -0
  84. package/assets/streets/icons/christian.svg +11 -0
  85. package/assets/streets/icons/cinema-dark.svg +11 -0
  86. package/assets/streets/icons/cinema-monochrome-dark.svg +11 -0
  87. package/assets/streets/icons/cinema-monochrome.svg +11 -0
  88. package/assets/streets/icons/cinema.svg +11 -0
  89. package/assets/streets/icons/clothing-dark.svg +11 -0
  90. package/assets/streets/icons/clothing-monochrome-dark.svg +11 -0
  91. package/assets/streets/icons/clothing-monochrome.svg +11 -0
  92. package/assets/streets/icons/clothing.svg +11 -0
  93. package/assets/streets/icons/coffee-dark.svg +11 -0
  94. package/assets/streets/icons/coffee-monochrome-dark.svg +11 -0
  95. package/assets/streets/icons/coffee-monochrome.svg +11 -0
  96. package/assets/streets/icons/coffee.svg +4 -5
  97. package/assets/streets/icons/college-dark.svg +11 -0
  98. package/assets/streets/icons/college-monochrome-dark.svg +11 -0
  99. package/assets/streets/icons/college-monochrome.svg +11 -0
  100. package/assets/streets/icons/college.svg +11 -0
  101. package/assets/streets/icons/community-dark.svg +11 -0
  102. package/assets/streets/icons/community-monochrome-dark.svg +11 -0
  103. package/assets/streets/icons/community-monochrome.svg +11 -0
  104. package/assets/streets/icons/community.svg +11 -0
  105. package/assets/streets/icons/convenience-dark.svg +11 -0
  106. package/assets/streets/icons/convenience-monochrome-dark.svg +11 -0
  107. package/assets/streets/icons/convenience-monochrome.svg +11 -0
  108. package/assets/streets/icons/convenience.svg +11 -0
  109. package/assets/streets/icons/culture-dark.svg +11 -0
  110. package/assets/streets/icons/culture-monochrome-dark.svg +11 -0
  111. package/assets/streets/icons/culture-monochrome.svg +11 -0
  112. package/assets/streets/icons/culture.svg +4 -5
  113. package/assets/streets/icons/dentist-dark.svg +11 -0
  114. package/assets/streets/icons/dentist-monochrome-dark.svg +11 -0
  115. package/assets/streets/icons/dentist-monochrome.svg +11 -0
  116. package/assets/streets/icons/dentist.svg +11 -0
  117. package/assets/streets/icons/doctor-dark.svg +11 -0
  118. package/assets/streets/icons/doctor-monochrome-dark.svg +11 -0
  119. package/assets/streets/icons/doctor-monochrome.svg +11 -0
  120. package/assets/streets/icons/doctor.svg +11 -0
  121. package/assets/streets/icons/dog-park-dark.svg +11 -0
  122. package/assets/streets/icons/dog-park-monochrome-dark.svg +11 -0
  123. package/assets/streets/icons/dog-park-monochrome.svg +11 -0
  124. package/assets/streets/icons/dog-park.svg +11 -0
  125. package/assets/streets/icons/drinking-water-dark.svg +11 -0
  126. package/assets/streets/icons/drinking-water-monochrome-dark.svg +11 -0
  127. package/assets/streets/icons/drinking-water-monochrome.svg +11 -0
  128. package/assets/streets/icons/drinking-water.svg +11 -0
  129. package/assets/streets/icons/education-dark.svg +11 -0
  130. package/assets/streets/icons/education-monochrome-dark.svg +11 -0
  131. package/assets/streets/icons/education-monochrome.svg +11 -0
  132. package/assets/streets/icons/education.svg +5 -6
  133. package/assets/streets/icons/electronics-dark.svg +11 -0
  134. package/assets/streets/icons/electronics-monochrome-dark.svg +11 -0
  135. package/assets/streets/icons/electronics-monochrome.svg +11 -0
  136. package/assets/streets/icons/electronics.svg +11 -0
  137. package/assets/streets/icons/embassy-dark.svg +11 -0
  138. package/assets/streets/icons/embassy-monochrome-dark.svg +11 -0
  139. package/assets/streets/icons/embassy-monochrome.svg +11 -0
  140. package/assets/streets/icons/embassy.svg +11 -0
  141. package/assets/streets/icons/entertainment-dark.svg +11 -0
  142. package/assets/streets/icons/entertainment-monochrome-dark.svg +11 -0
  143. package/assets/streets/icons/entertainment-monochrome.svg +11 -0
  144. package/assets/streets/icons/entertainment.svg +11 -0
  145. package/assets/streets/icons/fast-food-dark.svg +11 -0
  146. package/assets/streets/icons/fast-food-monochrome-dark.svg +11 -0
  147. package/assets/streets/icons/fast-food-monochrome.svg +11 -0
  148. package/assets/streets/icons/fast-food.svg +11 -0
  149. package/assets/streets/icons/ferry-dark.svg +11 -0
  150. package/assets/streets/icons/ferry-monochrome-dark.svg +11 -0
  151. package/assets/streets/icons/ferry-monochrome.svg +11 -0
  152. package/assets/streets/icons/ferry.svg +11 -0
  153. package/assets/streets/icons/fire-station-dark.svg +11 -0
  154. package/assets/streets/icons/fire-station-monochrome-dark.svg +11 -0
  155. package/assets/streets/icons/fire-station-monochrome.svg +11 -0
  156. package/assets/streets/icons/fire-station.svg +11 -0
  157. package/assets/streets/icons/fitness-dark.svg +11 -0
  158. package/assets/streets/icons/fitness-monochrome-dark.svg +11 -0
  159. package/assets/streets/icons/fitness-monochrome.svg +11 -0
  160. package/assets/streets/icons/fitness.svg +11 -0
  161. package/assets/streets/icons/florist-dark.svg +11 -0
  162. package/assets/streets/icons/florist-monochrome-dark.svg +11 -0
  163. package/assets/streets/icons/florist-monochrome.svg +11 -0
  164. package/assets/streets/icons/florist.svg +11 -0
  165. package/assets/streets/icons/food-dark.svg +11 -0
  166. package/assets/streets/icons/food-monochrome-dark.svg +11 -0
  167. package/assets/streets/icons/food-monochrome.svg +11 -0
  168. package/assets/streets/icons/food.svg +4 -5
  169. package/assets/streets/icons/fuel-dark.svg +11 -0
  170. package/assets/streets/icons/fuel-monochrome-dark.svg +11 -0
  171. package/assets/streets/icons/fuel-monochrome.svg +11 -0
  172. package/assets/streets/icons/fuel.svg +11 -0
  173. package/assets/streets/icons/garden-dark.svg +11 -0
  174. package/assets/streets/icons/garden-monochrome-dark.svg +11 -0
  175. package/assets/streets/icons/garden-monochrome.svg +11 -0
  176. package/assets/streets/icons/garden.svg +11 -0
  177. package/assets/streets/icons/golf-dark.svg +11 -0
  178. package/assets/streets/icons/golf-monochrome-dark.svg +11 -0
  179. package/assets/streets/icons/golf-monochrome.svg +11 -0
  180. package/assets/streets/icons/golf.svg +11 -0
  181. package/assets/streets/icons/grocery-dark.svg +11 -0
  182. package/assets/streets/icons/grocery-monochrome-dark.svg +11 -0
  183. package/assets/streets/icons/grocery-monochrome.svg +11 -0
  184. package/assets/streets/icons/grocery.svg +11 -0
  185. package/assets/streets/icons/harbor-dark.svg +11 -0
  186. package/assets/streets/icons/harbor-monochrome-dark.svg +11 -0
  187. package/assets/streets/icons/harbor-monochrome.svg +11 -0
  188. package/assets/streets/icons/harbor.svg +11 -0
  189. package/assets/streets/icons/hardware-dark.svg +11 -0
  190. package/assets/streets/icons/hardware-monochrome-dark.svg +11 -0
  191. package/assets/streets/icons/hardware-monochrome.svg +11 -0
  192. package/assets/streets/icons/hardware.svg +11 -0
  193. package/assets/streets/icons/health-dark.svg +11 -0
  194. package/assets/streets/icons/health-monochrome-dark.svg +11 -0
  195. package/assets/streets/icons/health-monochrome.svg +11 -0
  196. package/assets/streets/icons/health.svg +4 -5
  197. package/assets/streets/icons/historic-dark.svg +11 -0
  198. package/assets/streets/icons/historic-monochrome-dark.svg +11 -0
  199. package/assets/streets/icons/historic-monochrome.svg +11 -0
  200. package/assets/streets/icons/historic.svg +11 -0
  201. package/assets/streets/icons/jewish-dark.svg +11 -0
  202. package/assets/streets/icons/jewish-monochrome-dark.svg +11 -0
  203. package/assets/streets/icons/jewish-monochrome.svg +11 -0
  204. package/assets/streets/icons/jewish.svg +11 -0
  205. package/assets/streets/icons/landmark-dark.svg +11 -0
  206. package/assets/streets/icons/landmark-monochrome-dark.svg +11 -0
  207. package/assets/streets/icons/landmark-monochrome.svg +11 -0
  208. package/assets/streets/icons/landmark.svg +11 -0
  209. package/assets/streets/icons/laundry-dark.svg +11 -0
  210. package/assets/streets/icons/laundry-monochrome-dark.svg +11 -0
  211. package/assets/streets/icons/laundry-monochrome.svg +11 -0
  212. package/assets/streets/icons/laundry.svg +11 -0
  213. package/assets/streets/icons/library-dark.svg +11 -0
  214. package/assets/streets/icons/library-monochrome-dark.svg +11 -0
  215. package/assets/streets/icons/library-monochrome.svg +11 -0
  216. package/assets/streets/icons/library.svg +11 -0
  217. package/assets/streets/icons/lodging-dark.svg +11 -0
  218. package/assets/streets/icons/lodging-monochrome-dark.svg +11 -0
  219. package/assets/streets/icons/lodging-monochrome.svg +11 -0
  220. package/assets/streets/icons/lodging.svg +3 -4
  221. package/assets/streets/icons/major-transit-dark.svg +11 -0
  222. package/assets/streets/icons/major-transit-monochrome-dark.svg +11 -0
  223. package/assets/streets/icons/major-transit-monochrome.svg +11 -0
  224. package/assets/streets/icons/major-transit.svg +4 -5
  225. package/assets/streets/icons/monument-dark.svg +11 -0
  226. package/assets/streets/icons/monument-monochrome-dark.svg +11 -0
  227. package/assets/streets/icons/monument-monochrome.svg +11 -0
  228. package/assets/streets/icons/monument.svg +11 -0
  229. package/assets/streets/icons/mountain-dark.svg +11 -0
  230. package/assets/streets/icons/mountain-monochrome-dark.svg +11 -0
  231. package/assets/streets/icons/mountain-monochrome.svg +11 -0
  232. package/assets/streets/icons/mountain.svg +11 -0
  233. package/assets/streets/icons/music-dark.svg +11 -0
  234. package/assets/streets/icons/music-monochrome-dark.svg +11 -0
  235. package/assets/streets/icons/music-monochrome.svg +11 -0
  236. package/assets/streets/icons/music.svg +11 -0
  237. package/assets/streets/icons/muslim-dark.svg +11 -0
  238. package/assets/streets/icons/muslim-monochrome-dark.svg +11 -0
  239. package/assets/streets/icons/muslim-monochrome.svg +11 -0
  240. package/assets/streets/icons/muslim.svg +11 -0
  241. package/assets/streets/icons/natural-dark.svg +11 -0
  242. package/assets/streets/icons/natural-monochrome-dark.svg +11 -0
  243. package/assets/streets/icons/natural-monochrome.svg +11 -0
  244. package/assets/streets/icons/natural.svg +11 -0
  245. package/assets/streets/icons/nature-dark.svg +11 -0
  246. package/assets/streets/icons/nature-monochrome-dark.svg +11 -0
  247. package/assets/streets/icons/nature-monochrome.svg +11 -0
  248. package/assets/streets/icons/nature.svg +11 -0
  249. package/assets/streets/icons/nightclub-dark.svg +11 -0
  250. package/assets/streets/icons/nightclub-monochrome-dark.svg +11 -0
  251. package/assets/streets/icons/nightclub-monochrome.svg +11 -0
  252. package/assets/streets/icons/nightclub.svg +11 -0
  253. package/assets/streets/icons/parking-dark.svg +11 -0
  254. package/assets/streets/icons/parking-garage-dark.svg +11 -0
  255. package/assets/streets/icons/parking-garage-monochrome-dark.svg +11 -0
  256. package/assets/streets/icons/parking-garage-monochrome.svg +11 -0
  257. package/assets/streets/icons/parking-garage.svg +11 -0
  258. package/assets/streets/icons/parking-monochrome-dark.svg +11 -0
  259. package/assets/streets/icons/parking-monochrome.svg +11 -0
  260. package/assets/streets/icons/parking.svg +3 -4
  261. package/assets/streets/icons/pharmacy-dark.svg +11 -0
  262. package/assets/streets/icons/pharmacy-monochrome-dark.svg +11 -0
  263. package/assets/streets/icons/pharmacy-monochrome.svg +11 -0
  264. package/assets/streets/icons/pharmacy.svg +11 -0
  265. package/assets/streets/icons/playground-dark.svg +11 -0
  266. package/assets/streets/icons/playground-monochrome-dark.svg +11 -0
  267. package/assets/streets/icons/playground-monochrome.svg +11 -0
  268. package/assets/streets/icons/playground.svg +11 -0
  269. package/assets/streets/icons/plaza-dark.svg +11 -0
  270. package/assets/streets/icons/plaza-monochrome-dark.svg +11 -0
  271. package/assets/streets/icons/plaza-monochrome.svg +11 -0
  272. package/assets/streets/icons/plaza.svg +11 -0
  273. package/assets/streets/icons/police-dark.svg +11 -0
  274. package/assets/streets/icons/police-monochrome-dark.svg +11 -0
  275. package/assets/streets/icons/police-monochrome.svg +11 -0
  276. package/assets/streets/icons/police.svg +11 -0
  277. package/assets/streets/icons/post-dark.svg +11 -0
  278. package/assets/streets/icons/post-monochrome-dark.svg +11 -0
  279. package/assets/streets/icons/post-monochrome.svg +11 -0
  280. package/assets/streets/icons/post.svg +11 -0
  281. package/assets/streets/icons/prison-dark.svg +11 -0
  282. package/assets/streets/icons/prison-monochrome-dark.svg +11 -0
  283. package/assets/streets/icons/prison-monochrome.svg +11 -0
  284. package/assets/streets/icons/prison.svg +11 -0
  285. package/assets/streets/icons/rail-dark.svg +11 -0
  286. package/assets/streets/icons/rail-light-dark.svg +11 -0
  287. package/assets/streets/icons/rail-light-monochrome-dark.svg +11 -0
  288. package/assets/streets/icons/rail-light-monochrome.svg +11 -0
  289. package/assets/streets/icons/rail-light.svg +11 -0
  290. package/assets/streets/icons/rail-monochrome-dark.svg +11 -0
  291. package/assets/streets/icons/rail-monochrome.svg +11 -0
  292. package/assets/streets/icons/rail.svg +11 -0
  293. package/assets/streets/icons/services-dark.svg +11 -0
  294. package/assets/streets/icons/services-monochrome-dark.svg +11 -0
  295. package/assets/streets/icons/services-monochrome.svg +11 -0
  296. package/assets/streets/icons/services.svg +4 -5
  297. package/assets/streets/icons/shopping-dark.svg +11 -0
  298. package/assets/streets/icons/shopping-monochrome-dark.svg +11 -0
  299. package/assets/streets/icons/shopping-monochrome.svg +11 -0
  300. package/assets/streets/icons/shopping.svg +4 -5
  301. package/assets/streets/icons/sidewalk-dot-dark.svg +1 -1
  302. package/assets/streets/icons/sidewalk-dot.svg +1 -1
  303. package/assets/streets/icons/sport-dark.svg +11 -0
  304. package/assets/streets/icons/sport-monochrome-dark.svg +11 -0
  305. package/assets/streets/icons/sport-monochrome.svg +11 -0
  306. package/assets/streets/icons/sport.svg +11 -0
  307. package/assets/streets/icons/stadium-dark.svg +11 -0
  308. package/assets/streets/icons/stadium-monochrome-dark.svg +11 -0
  309. package/assets/streets/icons/stadium-monochrome.svg +11 -0
  310. package/assets/streets/icons/stadium.svg +11 -0
  311. package/assets/streets/icons/street-art-dark.svg +11 -0
  312. package/assets/streets/icons/street-art-monochrome-dark.svg +11 -0
  313. package/assets/streets/icons/street-art-monochrome.svg +11 -0
  314. package/assets/streets/icons/street-art.svg +11 -0
  315. package/assets/streets/icons/streets-tree-columnar-dark.pattern.svg +108 -0
  316. package/assets/streets/icons/streets-tree-columnar.pattern.svg +108 -0
  317. package/assets/streets/icons/streets-tree-conifer-dark.pattern.svg +57 -0
  318. package/assets/streets/icons/streets-tree-conifer.pattern.svg +57 -0
  319. package/assets/streets/icons/streets-tree-open-dark.pattern.svg +108 -0
  320. package/assets/streets/icons/streets-tree-open.pattern.svg +108 -0
  321. package/assets/streets/icons/streets-tree-palm-fan-dark.pattern.svg +108 -0
  322. package/assets/streets/icons/streets-tree-palm-fan.pattern.svg +108 -0
  323. package/assets/streets/icons/streets-tree-palm-feather-dark.pattern.svg +305 -0
  324. package/assets/streets/icons/streets-tree-palm-feather.pattern.svg +305 -0
  325. package/assets/streets/icons/streets-tree-round-dark.pattern.svg +108 -0
  326. package/assets/streets/icons/streets-tree-round.pattern.svg +108 -0
  327. package/assets/streets/icons/streets-tree-tall-dark.pattern.svg +108 -0
  328. package/assets/streets/icons/streets-tree-tall.pattern.svg +108 -0
  329. package/assets/streets/icons/swimming-dark.svg +11 -0
  330. package/assets/streets/icons/swimming-monochrome-dark.svg +11 -0
  331. package/assets/streets/icons/swimming-monochrome.svg +11 -0
  332. package/assets/streets/icons/swimming.svg +11 -0
  333. package/assets/streets/icons/theatre-dark.svg +11 -0
  334. package/assets/streets/icons/theatre-monochrome-dark.svg +11 -0
  335. package/assets/streets/icons/theatre-monochrome.svg +11 -0
  336. package/assets/streets/icons/theatre.svg +11 -0
  337. package/assets/streets/icons/toilet-dark.svg +11 -0
  338. package/assets/streets/icons/toilet-monochrome-dark.svg +11 -0
  339. package/assets/streets/icons/toilet-monochrome.svg +11 -0
  340. package/assets/streets/icons/toilet.svg +11 -0
  341. package/assets/streets/icons/town-hall-dark.svg +11 -0
  342. package/assets/streets/icons/town-hall-monochrome-dark.svg +11 -0
  343. package/assets/streets/icons/town-hall-monochrome.svg +11 -0
  344. package/assets/streets/icons/town-hall.svg +11 -0
  345. package/assets/streets/icons/viewpoint-dark.svg +11 -0
  346. package/assets/streets/icons/viewpoint-monochrome-dark.svg +11 -0
  347. package/assets/streets/icons/viewpoint-monochrome.svg +11 -0
  348. package/assets/streets/icons/viewpoint.svg +11 -0
  349. package/assets/streets/icons/waterfall-dark.svg +11 -0
  350. package/assets/streets/icons/waterfall-monochrome-dark.svg +11 -0
  351. package/assets/streets/icons/waterfall-monochrome.svg +11 -0
  352. package/assets/streets/icons/waterfall.svg +11 -0
  353. package/assets/streets/icons/worship-dark.svg +11 -0
  354. package/assets/streets/icons/worship-monochrome-dark.svg +11 -0
  355. package/assets/streets/icons/worship-monochrome.svg +11 -0
  356. package/assets/streets/icons/worship.svg +11 -0
  357. package/assets/streets/icons/zoo-dark.svg +11 -0
  358. package/assets/streets/icons/zoo-monochrome-dark.svg +11 -0
  359. package/assets/streets/icons/zoo-monochrome.svg +11 -0
  360. package/assets/streets/icons/zoo.svg +11 -0
  361. package/assets/streets/models/streets-tree-columnar.far.glb +0 -0
  362. package/assets/streets/models/streets-tree-columnar.glb +0 -0
  363. package/assets/streets/models/streets-tree-conifer.far.glb +0 -0
  364. package/assets/streets/models/streets-tree-conifer.glb +0 -0
  365. package/assets/streets/models/streets-tree-open.far.glb +0 -0
  366. package/assets/streets/models/streets-tree-open.glb +0 -0
  367. package/assets/streets/models/streets-tree-palm-fan.far.glb +0 -0
  368. package/assets/streets/models/streets-tree-palm-fan.glb +0 -0
  369. package/assets/streets/models/streets-tree-palm-feather.far.glb +0 -0
  370. package/assets/streets/models/streets-tree-palm-feather.glb +0 -0
  371. package/assets/streets/models/streets-tree-round.far.glb +0 -0
  372. package/assets/streets/models/streets-tree-round.glb +0 -0
  373. package/assets/streets/models/streets-tree-tall.far.glb +0 -0
  374. package/assets/streets/models/streets-tree-tall.glb +0 -0
  375. package/dist/index.d.ts +87 -7
  376. package/dist/index.js +1641 -773
  377. package/docs/design-and-assets.md +35 -14
  378. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -25,6 +25,7 @@ function packageDirectory(path) {
25
25
  return Object.freeze({ kind: "package-directory", package: "@tileflow/maps", path });
26
26
  }
27
27
  var streetsIcons = packageDirectory("assets/streets/icons");
28
+ var streetsModels = packageDirectory("assets/streets/models");
28
29
  var ferrarisIcons = packageDirectory("assets/ferraris/icons");
29
30
  var baedekerIcons = packageDirectory("assets/baedeker/icons");
30
31
  var civicaIcons = packageDirectory("assets/civica/icons");
@@ -1242,7 +1243,9 @@ var baedeker = bindOfficialMapTheme(
1242
1243
  icons: false,
1243
1244
  labels: true,
1244
1245
  minZoom: 13,
1245
- placement: { coupleIconAndLabel: false, textPadding: 1 },
1246
+ // Stations and landmarks use the semibold face, and a layer has one font, so each
1247
+ // category keeps its own layer; the categories listed first are placed first.
1248
+ placement: { coupleIconAndLabel: false, order: "categories", textPadding: 1 },
1246
1249
  styles: {
1247
1250
  transport: {
1248
1251
  text: {
@@ -1500,7 +1503,6 @@ var baedeker = bindOfficialMapTheme(
1500
1503
  strokeOpacity: 0.78,
1501
1504
  strokeWidth: 0.8
1502
1505
  },
1503
- minZoom: 15,
1504
1506
  mode: "flat"
1505
1507
  }),
1506
1508
  water: withRenderStack(
@@ -2787,13 +2789,14 @@ var blueprint = bindOfficialMapTheme(
2787
2789
  }),
2788
2790
  poi: withRenderStack2(
2789
2791
  poi2({
2792
+ // Placed in this order: the primary callouts first.
2790
2793
  categories: [
2794
+ "transport",
2795
+ "medical",
2791
2796
  "arts-entertainment",
2792
2797
  "education",
2793
- "medical",
2794
2798
  "park-nature",
2795
2799
  "public-services",
2796
- "transport",
2797
2800
  "visitor-amenity"
2798
2801
  ],
2799
2802
  color: "category",
@@ -2804,6 +2807,9 @@ var blueprint = bindOfficialMapTheme(
2804
2807
  placement: {
2805
2808
  coupleIconAndLabel: false,
2806
2809
  iconPadding: 3,
2810
+ // Medical and transport callouts start earlier than the others, so each category
2811
+ // keeps its own layer; the categories listed first are placed first.
2812
+ order: "categories",
2807
2813
  textPadding: 7
2808
2814
  },
2809
2815
  styles: {
@@ -2818,7 +2824,8 @@ var blueprint = bindOfficialMapTheme(
2818
2824
  }),
2819
2825
  {
2820
2826
  architecturalCallouts: renderPass2({
2821
- placement: { above: "poi.visitor-amenity.label" },
2827
+ // Above every POI label: the first category listed is the top POI layer.
2828
+ placement: { above: "poi.transport.label" },
2822
2829
  feature: "poi",
2823
2830
  renderer: "symbol",
2824
2831
  selector: {
@@ -3226,7 +3233,6 @@ var blueprint = bindOfficialMapTheme(
3226
3233
  strokeOpacity: 0.58,
3227
3234
  strokeWidth: 0.55
3228
3235
  },
3229
- minZoom: 16,
3230
3236
  mode: "flat"
3231
3237
  }),
3232
3238
  water: withRenderStack2(
@@ -3434,7 +3440,7 @@ function footpath(minZoom) {
3434
3440
  function wash(color, minZoom, opacity = 1) {
3435
3441
  return { fill: { color, minZoom, opacity }, outline: { visible: false } };
3436
3442
  }
3437
- function place(minZoom, maxZoom, size, options = {}) {
3443
+ function place(minZoom, maxZoom, size2, options = {}) {
3438
3444
  return {
3439
3445
  minZoom,
3440
3446
  maxZoom,
@@ -3449,8 +3455,8 @@ function place(minZoom, maxZoom, size, options = {}) {
3449
3455
  maxWidth: 10,
3450
3456
  padding: 5,
3451
3457
  size: zoom3.linear([
3452
- [minZoom, size],
3453
- [Math.min(maxZoom, minZoom + 6), size + 5]
3458
+ [minZoom, size2],
3459
+ [Math.min(maxZoom, minZoom + 6), size2 + 5]
3454
3460
  ]),
3455
3461
  transform: "uppercase"
3456
3462
  }
@@ -3479,15 +3485,14 @@ function streetName(minZoom, major = false) {
3479
3485
  }
3480
3486
  };
3481
3487
  }
3482
- function destination(image, minZoom, color, featured = false, role = "caption") {
3488
+ function destination(image2, minZoom, color, featured = false, role = "caption") {
3483
3489
  const park = role === "park";
3484
3490
  const station = role === "station";
3485
3491
  const principalPark = expr3.lte(expr3.toNumber(expr3.get(field3("poiSizeRank")), 16), 4);
3486
3492
  return {
3487
3493
  minZoom,
3488
- density: featured ? 3 : 2,
3489
3494
  icon: {
3490
- image,
3495
+ image: image2,
3491
3496
  allowOverlap: false,
3492
3497
  ignorePlacement: false,
3493
3498
  optional: false,
@@ -4233,7 +4238,15 @@ var civica = bindOfficialMapTheme(
4233
4238
  minZoom: 12,
4234
4239
  icons: true,
4235
4240
  labels: true,
4236
- placement: { coupleIconAndLabel: true, iconPadding: 3, textPadding: 4 },
4241
+ placement: {
4242
+ coupleIconAndLabel: true,
4243
+ iconPadding: 3,
4244
+ // Cívica's destination schedule gives each category its own zoom range and
4245
+ // collision padding, so each keeps its own layer; destinations listed first are
4246
+ // placed first.
4247
+ order: "categories",
4248
+ textPadding: 4
4249
+ },
4237
4250
  styles: {
4238
4251
  landmark: destination("civica-poi-monument", 13, ink.type, true),
4239
4252
  "arts-entertainment": destination("civica-poi-museum", 13.5, ink.type, true),
@@ -4357,9 +4370,9 @@ var civica = bindOfficialMapTheme(
4357
4370
  ),
4358
4371
  vegetation: vegetation3({
4359
4372
  mode: "flat",
4360
- minZoom: 19,
4361
4373
  flat: {
4362
4374
  color: ink.greenInk,
4375
+ minZoom: 19,
4363
4376
  opacity: 0.5,
4364
4377
  radius: zoom3.linear([
4365
4378
  [19, 1.2],
@@ -5344,7 +5357,6 @@ var ferraris = bindOfficialMapTheme(
5344
5357
  strokeOpacity: 0.62,
5345
5358
  strokeWidth: 0.7
5346
5359
  },
5347
- minZoom: 15,
5348
5360
  mode: "flat"
5349
5361
  }),
5350
5362
  water: withRenderStack4(
@@ -6369,7 +6381,6 @@ var harad = bindOfficialMapTheme(
6369
6381
  strokeOpacity: 0.5,
6370
6382
  strokeWidth: 0.55
6371
6383
  },
6372
- minZoom: 15,
6373
6384
  mode: "flat"
6374
6385
  }),
6375
6386
  water: withRenderStack5(
@@ -8431,24 +8442,23 @@ var soundings = bindOfficialMapTheme(
8431
8442
 
8432
8443
  // src/official/streets.ts
8433
8444
  import {
8445
+ addresses as addresses4,
8434
8446
  boundaries as boundaries8,
8435
8447
  buildings as buildings7,
8436
8448
  defineMap as defineMap8,
8437
- disable as disable6,
8438
- expr as expr9,
8439
- field as field8,
8449
+ expr as expr11,
8450
+ field as field10,
8440
8451
  fixed as fixed3,
8441
8452
  labels as labels8,
8442
8453
  land as land8,
8443
8454
  poi as poi4,
8444
8455
  refineRenderTarget as refineRenderTarget3,
8445
- renderPass as renderPass8,
8456
+ renderPass as renderPass9,
8446
8457
  roads as roads7,
8447
8458
  transit as transit8,
8448
- vegetation as vegetation6,
8449
8459
  water as water8,
8450
- withRenderStack as withRenderStack8,
8451
- zoom as zoom9
8460
+ withRenderStack as withRenderStack9,
8461
+ zoom as zoom10
8452
8462
  } from "@tileflow/core";
8453
8463
 
8454
8464
  // src/official/mapbox-rail.ts
@@ -8512,28 +8522,328 @@ function mapboxRailTransitStyle(color) {
8512
8522
  };
8513
8523
  }
8514
8524
 
8525
+ // src/official/streets-poi.ts
8526
+ import {
8527
+ expr as expr9,
8528
+ field as field8,
8529
+ token as token4
8530
+ } from "@tileflow/core";
8531
+ var streetsPoiDiscColors = Object.freeze({
8532
+ light: {
8533
+ "arts-entertainment": "#F37CCC",
8534
+ education: "#BF803F",
8535
+ "food-drink": "#FF9933",
8536
+ landmark: "#F37CCC",
8537
+ lodging: "#8D73E6",
8538
+ medical: "#F46A75",
8539
+ "park-nature": "#36AD1F",
8540
+ parking: "#5474D5",
8541
+ "public-services": "#7D8F9F",
8542
+ religion: "#7D8F9F",
8543
+ retail: "#5FA0E5",
8544
+ "sport-leisure": "#4BB5C3",
8545
+ transport: "#465DCD",
8546
+ "visitor-amenity": "#7D8F9F"
8547
+ },
8548
+ dark: {
8549
+ "arts-entertainment": "#C786BC",
8550
+ education: "#B6A783",
8551
+ "food-drink": "#D8BD65",
8552
+ landmark: "#C786BC",
8553
+ lodging: "#AA94DA",
8554
+ medical: "#DC7C89",
8555
+ "park-nature": "#89B871",
8556
+ parking: "#94BCE3",
8557
+ "public-services": "#9DAAB0",
8558
+ religion: "#9DAAB0",
8559
+ retail: "#94BCE3",
8560
+ "sport-leisure": "#89B871",
8561
+ transport: "#8296E6",
8562
+ "visitor-amenity": "#9DAAB0"
8563
+ }
8564
+ });
8565
+ var streetsPoiPictograms = Object.freeze({
8566
+ "major-transit": { category: "transport", maki: "rail-metro", title: "Metro" },
8567
+ rail: { category: "transport", maki: "rail", title: "Railway station" },
8568
+ "rail-light": { category: "transport", maki: "rail-light", title: "Tram or light rail" },
8569
+ bus: { category: "transport", maki: "bus", title: "Bus" },
8570
+ ferry: { category: "transport", maki: "ferry", title: "Ferry" },
8571
+ aerialway: { category: "transport", maki: "aerialway", title: "Aerial cableway" },
8572
+ airport: { category: "transport", maki: "airport", title: "Airport" },
8573
+ food: { category: "food-drink", maki: "restaurant", title: "Restaurant" },
8574
+ coffee: { category: "food-drink", maki: "cafe", title: "Cafe" },
8575
+ bar: { category: "food-drink", maki: "bar", title: "Bar" },
8576
+ "fast-food": { category: "food-drink", maki: "fast-food", title: "Fast food" },
8577
+ entertainment: { category: "arts-entertainment", maki: "star", title: "Entertainment venue" },
8578
+ culture: { category: "arts-entertainment", maki: "museum", title: "Museum" },
8579
+ "art-gallery": { category: "arts-entertainment", maki: "art-gallery", title: "Art gallery" },
8580
+ theatre: { category: "arts-entertainment", maki: "theatre", title: "Theatre" },
8581
+ cinema: { category: "arts-entertainment", maki: "cinema", title: "Cinema" },
8582
+ music: { category: "arts-entertainment", maki: "music", title: "Music venue" },
8583
+ nightclub: { category: "arts-entertainment", maki: "nightclub", title: "Nightclub" },
8584
+ zoo: { category: "arts-entertainment", maki: "zoo", title: "Zoo" },
8585
+ aquarium: { category: "arts-entertainment", maki: "aquarium", title: "Aquarium" },
8586
+ "amusement-park": {
8587
+ category: "arts-entertainment",
8588
+ maki: "amusement-park",
8589
+ title: "Amusement park"
8590
+ },
8591
+ casino: { category: "arts-entertainment", maki: "casino", title: "Casino" },
8592
+ landmark: { category: "landmark", maki: "landmark", title: "Landmark" },
8593
+ monument: { category: "landmark", maki: "monument", title: "Monument" },
8594
+ castle: { category: "landmark", maki: "castle", title: "Castle" },
8595
+ historic: { category: "landmark", maki: "historic", title: "Historic site" },
8596
+ viewpoint: { category: "landmark", maki: "viewpoint", title: "Viewpoint" },
8597
+ cemetery: { category: "landmark", maki: "cemetery", title: "Cemetery" },
8598
+ "street-art": { category: "landmark", maki: "paint", title: "Street art" },
8599
+ lodging: { category: "lodging", maki: "lodging", title: "Lodging" },
8600
+ campsite: { category: "lodging", maki: "campsite", title: "Campsite" },
8601
+ health: { category: "medical", maki: "hospital", title: "Hospital" },
8602
+ doctor: { category: "medical", maki: "doctor", title: "Clinic" },
8603
+ dentist: { category: "medical", maki: "dentist", title: "Dentist" },
8604
+ pharmacy: { category: "medical", maki: "pharmacy", title: "Pharmacy" },
8605
+ nature: { category: "park-nature", maki: "park", title: "Park" },
8606
+ garden: { category: "park-nature", maki: "garden", title: "Garden" },
8607
+ playground: { category: "park-nature", maki: "playground", title: "Playground" },
8608
+ "dog-park": { category: "park-nature", maki: "dog-park", title: "Dog park" },
8609
+ beach: { category: "park-nature", maki: "beach", title: "Beach" },
8610
+ mountain: { category: "park-nature", maki: "mountain", title: "Mountain" },
8611
+ waterfall: { category: "park-nature", maki: "waterfall", title: "Waterfall" },
8612
+ natural: { category: "park-nature", maki: "natural", title: "Natural feature" },
8613
+ "town-hall": { category: "public-services", maki: "town-hall", title: "Government" },
8614
+ police: { category: "public-services", maki: "police", title: "Police" },
8615
+ "fire-station": { category: "public-services", maki: "fire-station", title: "Fire station" },
8616
+ post: { category: "public-services", maki: "post", title: "Post office" },
8617
+ embassy: { category: "public-services", maki: "embassy", title: "Embassy" },
8618
+ prison: { category: "public-services", maki: "prison", title: "Prison" },
8619
+ community: { category: "public-services", maki: "building", title: "Community center" },
8620
+ plaza: { category: "public-services", maki: "landmark", title: "Public square" },
8621
+ worship: { category: "religion", maki: "place-of-worship", title: "Place of worship" },
8622
+ christian: { category: "religion", maki: "religious-christian", title: "Church" },
8623
+ muslim: { category: "religion", maki: "religious-muslim", title: "Mosque" },
8624
+ jewish: { category: "religion", maki: "religious-jewish", title: "Synagogue" },
8625
+ buddhist: { category: "religion", maki: "religious-buddhist", title: "Buddhist temple" },
8626
+ shopping: { category: "retail", maki: "shop", title: "Shop" },
8627
+ clothing: { category: "retail", maki: "clothing-store", title: "Clothing store" },
8628
+ grocery: { category: "retail", maki: "grocery", title: "Grocery" },
8629
+ convenience: { category: "retail", maki: "convenience", title: "Convenience store" },
8630
+ car: { category: "retail", maki: "car", title: "Car dealer" },
8631
+ "car-repair": { category: "retail", maki: "car-repair", title: "Car parts" },
8632
+ bookstore: { category: "retail", maki: "library", title: "Bookstore" },
8633
+ florist: { category: "retail", maki: "florist", title: "Florist" },
8634
+ hardware: { category: "retail", maki: "hardware", title: "Hardware store" },
8635
+ electronics: { category: "retail", maki: "mobile-phone", title: "Electronics store" },
8636
+ beauty: { category: "retail", maki: "hairdresser", title: "Beauty" },
8637
+ sport: { category: "sport-leisure", maki: "soccer", title: "Sport" },
8638
+ stadium: { category: "sport-leisure", maki: "stadium", title: "Stadium" },
8639
+ golf: { category: "sport-leisure", maki: "golf", title: "Golf course" },
8640
+ swimming: { category: "sport-leisure", maki: "swimming", title: "Swimming pool" },
8641
+ fitness: { category: "sport-leisure", maki: "fitness-centre", title: "Fitness" },
8642
+ services: { category: "visitor-amenity", maki: "information", title: "Information" },
8643
+ parking: { category: "visitor-amenity", disc: "parking", maki: "parking", title: "Parking" },
8644
+ "parking-garage": {
8645
+ category: "visitor-amenity",
8646
+ disc: "parking",
8647
+ maki: "parking-garage",
8648
+ title: "Parking garage"
8649
+ },
8650
+ toilet: { category: "visitor-amenity", maki: "toilet", title: "Toilets" },
8651
+ bank: { category: "visitor-amenity", maki: "bank", title: "Bank or cash machine" },
8652
+ fuel: { category: "visitor-amenity", maki: "fuel", title: "Fuel" },
8653
+ "charging-station": {
8654
+ category: "visitor-amenity",
8655
+ maki: "charging-station",
8656
+ title: "Charging station"
8657
+ },
8658
+ "drinking-water": { category: "visitor-amenity", maki: "drinking-water", title: "Drinking water" },
8659
+ harbor: { category: "visitor-amenity", maki: "harbor", title: "Marina" },
8660
+ laundry: { category: "visitor-amenity", maki: "laundry", title: "Laundry" },
8661
+ education: { category: "education", maki: "college", title: "Education" },
8662
+ college: { category: "education", maki: "college", title: "College or university" },
8663
+ library: { category: "education", maki: "library", title: "Library" }
8664
+ });
8665
+ var pictogramsByMode = {
8666
+ "major-transit": ["subway"],
8667
+ rail: ["train", "funicular"],
8668
+ "rail-light": ["light_rail", "tram", "monorail"],
8669
+ bus: ["bus"],
8670
+ ferry: ["ferry"],
8671
+ aerialway: ["aerialway"]
8672
+ };
8673
+ var pictogramsByType = {
8674
+ airport: ["airport"],
8675
+ bus: ["bus_station", "bus_stop"],
8676
+ ferry: ["ferry_terminal"],
8677
+ rail: ["train_station"],
8678
+ "rail-light": ["tram_stop"],
8679
+ bar: ["alcoholic_beverage_venue", "bar", "brewery", "distillery", "lounge", "winery"],
8680
+ coffee: ["cafe", "coffee_shop", "non_alcoholic_beverage_venue", "smoothie_juice_bar"],
8681
+ "fast-food": ["fast_food_restaurant", "food_court", "food_truck_stand"],
8682
+ culture: ["museum", "planetarium", "science_attraction"],
8683
+ "art-gallery": ["art_gallery", "arts_and_crafts_space"],
8684
+ theatre: ["comedy_club", "performing_arts_venue", "theatre_venue"],
8685
+ cinema: ["movie_theater"],
8686
+ music: ["music_venue"],
8687
+ nightclub: ["dance_club"],
8688
+ zoo: ["animal_attraction", "zoo"],
8689
+ aquarium: ["aquarium"],
8690
+ "amusement-park": ["amusement_attraction", "amusement_park", "fairgrounds"],
8691
+ casino: ["casino"],
8692
+ monument: ["monument", "sculpture_statue"],
8693
+ castle: ["castle"],
8694
+ historic: ["historic_site"],
8695
+ viewpoint: ["scenic_viewpoint"],
8696
+ cemetery: ["cemetery"],
8697
+ "street-art": ["street_art"],
8698
+ campsite: ["campground", "rv_park"],
8699
+ health: [
8700
+ "emergency_department",
8701
+ "emergency_or_urgent_care_facility",
8702
+ "hospital",
8703
+ "specialty_hospital"
8704
+ ],
8705
+ dentist: ["dental_clinic"],
8706
+ pharmacy: ["pharmacy"],
8707
+ garden: ["garden"],
8708
+ playground: ["playground"],
8709
+ "dog-park": ["dog_park"],
8710
+ beach: ["beach"],
8711
+ mountain: ["mountain"],
8712
+ waterfall: ["waterfall"],
8713
+ natural: ["canyon", "hot_springs", "island", "valley"],
8714
+ police: ["police_station", "public_safety_service"],
8715
+ "fire-station": ["fire_station"],
8716
+ post: ["post_office"],
8717
+ embassy: ["embassy"],
8718
+ prison: ["jail_or_prison"],
8719
+ community: ["community_center", "food_bank", "social_or_community_service"],
8720
+ plaza: ["public_plaza"],
8721
+ christian: ["christian_place_of_worship"],
8722
+ muslim: ["muslim_place_of_worship"],
8723
+ jewish: ["jewish_place_of_worship"],
8724
+ buddhist: ["buddhist_place_of_worship"],
8725
+ clothing: ["fashion_and_apparel_store"],
8726
+ grocery: [
8727
+ "farmers_market",
8728
+ "food_and_beverage_store",
8729
+ "market",
8730
+ "superstore",
8731
+ "warehouse_club_store"
8732
+ ],
8733
+ convenience: ["convenience_store", "kiosk"],
8734
+ car: ["auto_dealer", "vehicle_dealer"],
8735
+ "car-repair": ["vehicle_parts_store"],
8736
+ bookstore: ["books_music_and_video_store"],
8737
+ florist: ["flowers_and_gifts_store"],
8738
+ hardware: ["hardware_home_and_garden_store"],
8739
+ electronics: ["electronics_store"],
8740
+ beauty: ["personal_care_and_beauty_store"],
8741
+ stadium: ["stadium_arena"],
8742
+ golf: ["golf_course"],
8743
+ swimming: ["swimming_pool"],
8744
+ fitness: ["fitness_studio", "gym"],
8745
+ parking: ["parking", "parking_lot"],
8746
+ "parking-garage": ["parking_garage"],
8747
+ toilet: ["public_restroom"],
8748
+ bank: ["atm", "bank"],
8749
+ fuel: ["fueling_station", "gas_station"],
8750
+ "charging-station": ["ev_charging_station"],
8751
+ "drinking-water": ["drinking_water", "public_fountain"],
8752
+ harbor: ["marina"],
8753
+ laundry: ["laundry"],
8754
+ college: ["college_university", "research_institute"],
8755
+ library: ["library"]
8756
+ };
8757
+ var streetsPoiCategoryPictograms = Object.freeze({
8758
+ "arts-entertainment": "entertainment",
8759
+ education: "education",
8760
+ "food-drink": "food",
8761
+ landmark: "landmark",
8762
+ lodging: "lodging",
8763
+ medical: "doctor",
8764
+ "park-nature": "nature",
8765
+ "public-services": "town-hall",
8766
+ religion: "worship",
8767
+ retail: "shopping",
8768
+ "sport-leisure": "sport",
8769
+ transport: "major-transit",
8770
+ "visitor-amenity": "services"
8771
+ });
8772
+ function streetsPoiPictogramToken(id) {
8773
+ return token4.image(`poi.pictogram.${id}`);
8774
+ }
8775
+ function streetsPoiImageTokens(variant) {
8776
+ const suffix = {
8777
+ light: "",
8778
+ dark: "-dark",
8779
+ monochrome: "-monochrome",
8780
+ "monochrome-dark": "-monochrome-dark"
8781
+ }[variant];
8782
+ const image2 = (id) => `${id}${suffix}`;
8783
+ return Object.fromEntries([
8784
+ ...Object.entries(streetsPoiCategoryPictograms).map(([category, id]) => [
8785
+ `poi.${category}`,
8786
+ image2(id)
8787
+ ]),
8788
+ ...Object.keys(streetsPoiPictograms).map((id) => [`poi.pictogram.${id}`, image2(id)])
8789
+ ]);
8790
+ }
8791
+ function streetsPoiImage() {
8792
+ const categoryBranches = Object.keys(streetsPoiCategoryPictograms).map((category) => {
8793
+ const types = Object.entries(pictogramsByType).filter(([id]) => streetsPoiPictograms[id].category === category).map(([id, labels9]) => ({
8794
+ labels: [...labels9],
8795
+ value: streetsPoiPictogramToken(id)
8796
+ }));
8797
+ const [first, ...rest] = types;
8798
+ const categoryRole = token4.image(`poi.${category}`);
8799
+ return {
8800
+ labels: category,
8801
+ value: first ? expr9.match(
8802
+ expr9.get(field8("poiType")),
8803
+ [first, ...rest],
8804
+ categoryRole
8805
+ ) : categoryRole
8806
+ };
8807
+ });
8808
+ const [firstCategory, ...otherCategories] = categoryBranches;
8809
+ const [firstMode, ...otherModes] = Object.entries(pictogramsByMode).map(([id, labels9]) => ({
8810
+ labels: [...labels9],
8811
+ value: streetsPoiPictogramToken(id)
8812
+ }));
8813
+ return expr9.match(
8814
+ expr9.get(field8("mode")),
8815
+ [firstMode, ...otherModes],
8816
+ expr9.match(
8817
+ expr9.get(field8("poiCategory")),
8818
+ [firstCategory, ...otherCategories],
8819
+ token4.image("poi.landmark")
8820
+ )
8821
+ );
8822
+ }
8823
+
8515
8824
  // src/official/streets-themes.ts
8516
- import { defineTheme as defineTheme2, token as token4 } from "@tileflow/core";
8825
+ import { defineTheme as defineTheme2, token as token5 } from "@tileflow/core";
8517
8826
  var streetsLightColors = {
8518
8827
  "boundaries.admin": "#CE9298",
8519
8828
  "boundaries.default": "#CE9298",
8520
8829
  "boundaries.disputed": "#CE9298",
8521
- "boundaries.halo": "#F4F0EF",
8830
+ "boundaries.halo": "#F5F1F0",
8522
8831
  "boundaries.major": "#CE9298",
8523
8832
  "boundaries.maritime": "#648AA4",
8524
8833
  "boundaries.regional": "#CE9698",
8525
- "buildings.active": "#F3E9DF",
8834
+ "buildings.active": "#EFEADD",
8526
8835
  "buildings.businessCorridor": "#F4E6D8",
8527
8836
  "buildings.businessCorridorOutline": "#DCCFC3",
8528
- "buildings.civic": "#F3E9DF",
8529
- "buildings.commercial": "#F3E9DF",
8530
- "buildings.destination": "#F3E9DF",
8531
- "buildings.extrusion": "#EBE1D8",
8532
- "buildings.fill": "#F3E9DF",
8533
- "buildings.generic": "#F3E9DF",
8534
- "buildings.industrial": "#F3E9DF",
8535
- "buildings.outline": "#DED5CA",
8536
- "buildings.residential": "#F3E9DF",
8837
+ "buildings.civic": "#EFEADD",
8838
+ "buildings.commercial": "#EFEADD",
8839
+ "buildings.destination": "#EFEADD",
8840
+ "buildings.extrusion": "#EEE4DA",
8841
+ "buildings.contactShadow": "#8C8178",
8842
+ "buildings.fill": "#EFEADD",
8843
+ "buildings.generic": "#EFEADD",
8844
+ "buildings.industrial": "#EFEADD",
8845
+ "buildings.outline": "#E0CDA5",
8846
+ "buildings.residential": "#EFEADD",
8537
8847
  "buildings.shadow": "#BDB7B1",
8538
8848
  // Low-zoom bathymetry is composited over the ocean fill. These values are
8539
8849
  // deliberately pre-compensated so the rendered result, rather than the raw
@@ -8542,20 +8852,24 @@ var streetsLightColors = {
8542
8852
  "hydro.depth.m200": "#6ECEFE59",
8543
8853
  "hydro.depth.m2000": "#29B5FD59",
8544
8854
  "hydro.depth.m7000": "#15AFFA59",
8545
- "hydro.ferry": "#5A88A9",
8855
+ "hydro.ferry": "#479CEB",
8546
8856
  "hydro.label": "#5A88A9",
8547
8857
  "hydro.ocean": "#98DCFE",
8548
8858
  "hydro.water": "#98DCFE",
8549
8859
  "hydro.waterway": "#98DCFE",
8550
- "labels.country": "#303230",
8551
- "labels.halo": "#F4F0EF",
8860
+ "labels.country": "#000000",
8861
+ "labels.ferry": "#2682D9",
8862
+ "labels.ferryHalo": "#98DCFE",
8863
+ "labels.halo": "#F5F1F0",
8864
+ "labels.placeHalo": "#FFFFFF",
8865
+ "labels.roadHalo": "#F2F2F2",
8552
8866
  "labels.muted": "#6D6E6C",
8553
8867
  "labels.neighborhood": "#626361",
8554
8868
  "labels.overview": "#5B5C5A",
8555
8869
  "labels.poi": "#555654",
8556
8870
  "labels.primary": "#5B5C5A",
8557
- "labels.road": "#505050",
8558
- "labels.settlement": "#242624",
8871
+ "labels.road": "#404040",
8872
+ "labels.settlement": "#000000",
8559
8873
  "labels.shield.dark": "#1B1D27",
8560
8874
  "labels.shield.light": "#FFFFFF",
8561
8875
  "labels.strong": "#505050",
@@ -8570,72 +8884,72 @@ var streetsLightColors = {
8570
8884
  "landcover.global.shrub": "#D4F0C5",
8571
8885
  "landcover.global.snow": "#F4F7F8",
8572
8886
  "landcover.global.trees": "#C1EFBE",
8573
- "landcover.global.urban": "#F4F0EF",
8574
- "landcover.grass": "#CFF0C6",
8575
- "landcover.greenspace": "#B1EAAC",
8887
+ "landcover.global.urban": "#F5F1F0",
8888
+ "landcover.grass": "#C2EEBE",
8889
+ "landcover.greenspace": "#B3EAAD",
8576
8890
  "landcover.greenspaceDark": "#B8E0AE",
8577
8891
  "landcover.ice": "#F4F7F8",
8578
- "landcover.meadow": "#CFF0C6",
8892
+ "landcover.meadow": "#C2EEBE",
8579
8893
  "landcover.protected": "#D5E8D0",
8580
- "landcover.recreationGround": "#B1EAAC",
8894
+ "landcover.recreationGround": "#B3EAAD",
8581
8895
  "landcover.rock": "#E9E8ED",
8582
8896
  "landcover.sand": "#F0ECC6",
8583
8897
  "landcover.scrub": "#D2EEC6",
8584
- "landcover.urbanPark": "#B1EAAC",
8898
+ "landcover.urbanPark": "#B3EAAD",
8585
8899
  "landcover.villageGreen": "#C2E7B5",
8586
8900
  "landcover.wetland": "#D7E9DE",
8587
- "landcover.wood": "#9BE494",
8901
+ "landcover.wood": "#A7DFA0",
8588
8902
  "landuse.businessCorridor": "#FBEDE2",
8589
8903
  "landuse.businessCorridorOutline": "#E6D8CA",
8590
8904
  "landuse.cemetery": "#CCE5C6",
8591
- "landuse.civic": "#F4F0EF",
8905
+ "landuse.civic": "#F5F1F0",
8592
8906
  "landuse.commercial": "#FBEDE2",
8593
8907
  "landuse.education": "#ECE4D2",
8594
- "landuse.government": "#F4F0EF",
8908
+ "landuse.government": "#F5F1F0",
8595
8909
  "landuse.industrial": "#E8E8F0",
8596
8910
  "landuse.medical": "#EEE0DF",
8597
- "landuse.military": "#F4F0EF",
8911
+ "landuse.military": "#F5F1F0",
8598
8912
  "landuse.parking": "#E9E6E7",
8599
8913
  "landuse.parkingOutline": "#C8C8CF",
8600
8914
  "landuse.railway": "#E8E8F0",
8601
- "landuse.recreation": "#B1EAAC",
8915
+ "landuse.recreation": "#B3EAAD",
8602
8916
  "landuse.recreationOutline": "#AED7A5",
8603
8917
  "landuse.residential": "#F5F0EF",
8604
- "poi.arts-entertainment": "#B85CA4",
8605
- "poi.education": "#987A55",
8606
- "poi.food-drink": "#D7892C",
8918
+ "poi.arts-entertainment": "#F042B6",
8919
+ "poi.education": "#916130",
8920
+ "poi.food-drink": "#F57A00",
8607
8921
  "poi.halo": "#FFFFFF",
8608
8922
  "poi.icon": "#777876",
8609
8923
  "poi.label": "#555654",
8610
- "poi.landmark": "#B85CA4",
8611
- "poi.lodging": "#806DC4",
8612
- "poi.medical": "#C95E6B",
8613
- "poi.park-nature": "#4C9478",
8614
- "poi.public-services": "#667C9E",
8615
- "poi.religion": "#8A756B",
8616
- "poi.retail": "#557BC4",
8617
- "poi.sport-leisure": "#4C9478",
8618
- "poi.transport": "#5C74D6",
8619
- "poi.visitor-amenity": "#557BC4",
8924
+ "poi.landmark": "#F042B6",
8925
+ "poi.lodging": "#664CE6",
8926
+ "poi.medical": "#F53D3D",
8927
+ "poi.park-nature": "#267915",
8928
+ "poi.public-services": "#586E84",
8929
+ "poi.religion": "#586E84",
8930
+ "poi.retail": "#2D87E1",
8931
+ "poi.sport-leisure": "#1891AA",
8932
+ "poi.transport": "#3359CC",
8933
+ "poi.visitor-amenity": "#586E84",
8620
8934
  "roads.bridge": "#BEC5D8",
8621
- "roads.casing": "#ADB3C3",
8622
- "roads.city.casing": "#E8E5E6",
8623
- "roads.city.minor": "#CDCED7",
8624
- "roads.city.primary": "#C1C6D3",
8625
- "roads.city.secondary": "#C2C6D6",
8626
- "roads.city.tertiary": "#C2C6D6",
8935
+ "roads.casing": "#9EA9C4",
8936
+ "roads.city.casing": "#9EA9C4",
8937
+ "roads.city.minor": "#BEC5D8",
8938
+ "roads.city.primary": "#BEC5D8",
8939
+ "roads.city.secondary": "#BEC5D8",
8940
+ "roads.city.tertiary": "#BEC5D8",
8627
8941
  "roads.city.tunnel": "#E0E0E5",
8628
8942
  "roads.city.tunnelCasing": "#C5C5CF",
8629
8943
  "roads.cycleway": "#67AD73",
8630
8944
  "roads.default": "#BEC5D8",
8631
- "roads.default.casing": "#ADB3C3",
8945
+ "roads.default.casing": "#9EA9C4",
8632
8946
  "roads.default.tunnel": "#DEE0E8",
8633
- "roads.ferry": "#5A88A9",
8634
- "roads.major": "#A1B0C2",
8947
+ "roads.ferry": "#479CEB",
8948
+ "roads.major": "#A1B0C4",
8635
8949
  "roads.minor": "#BEC5D8",
8636
- "roads.motorway": "#A1B0C2",
8950
+ "roads.motorway": "#A1B0C4",
8637
8951
  "roads.motorway.casing": "#8D9EAE",
8638
- "roads.motorway.tunnel": "#D5DCE0",
8952
+ "roads.motorway.tunnel": "#BEC8D6",
8639
8953
  "roads.parkPath": "#D8E1D8",
8640
8954
  "roads.path": "#EFECEF",
8641
8955
  "roads.path.casing": "#D1C7C7",
@@ -8645,15 +8959,19 @@ var streetsLightColors = {
8645
8959
  "roads.rail": "#8B8E99",
8646
8960
  "roads.railTransit": "#8E909D",
8647
8961
  "roads.secondary": "#BEC5D8",
8962
+ "roads.sidewalk.surface": "rgba(0, 0, 0, 0.06)",
8648
8963
  "roads.trunk": "#A3A6C2",
8649
8964
  "roads.trunk.casing": "#8F91AA",
8650
8965
  "roads.trunk.tunnel": "#C6C8D4",
8651
8966
  "roads.tunnel": "#DEE0E8",
8652
- "surface.background": "#F4F0EF",
8653
- "surface.building": "#F3E9DF",
8654
- "surface.land": "#F4F0EF",
8655
- "surface.park": "#B1EAAC",
8967
+ "surface.background": "#F5F1F0",
8968
+ "surface.building": "#EFEADD",
8969
+ "surface.land": "#F5F1F0",
8970
+ "surface.park": "#B3EAAD",
8656
8971
  "surface.water": "#98DCFE",
8972
+ "terrain.hillshade.accent": "#A6AB91",
8973
+ "terrain.hillshade.highlight": "#FFFFFF",
8974
+ "terrain.hillshade.shadow": "#727B64",
8657
8975
  "transit.primary": "#5C74D6",
8658
8976
  "vegetation.tree.bark": "#918878",
8659
8977
  "vegetation.tree.broadleaf.a": "#83AD83",
@@ -8679,6 +8997,7 @@ var streetsDarkColors = {
8679
8997
  "buildings.commercial": "#2C2E3D",
8680
8998
  "buildings.destination": "#3A3947",
8681
8999
  "buildings.extrusion": "#343646",
9000
+ "buildings.contactShadow": "#121522",
8682
9001
  "buildings.fill": "#2C2E3D",
8683
9002
  "buildings.generic": "#2C2E3D",
8684
9003
  "buildings.industrial": "#2C2E3D",
@@ -8695,7 +9014,11 @@ var streetsDarkColors = {
8695
9014
  "hydro.water": "#18223B",
8696
9015
  "hydro.waterway": "#18223B",
8697
9016
  "labels.country": "#A6A7AC",
9017
+ "labels.ferry": "#8799BE",
9018
+ "labels.ferryHalo": "#18223B",
8698
9019
  "labels.halo": "#252839",
9020
+ "labels.placeHalo": "#252839",
9021
+ "labels.roadHalo": "#252839",
8699
9022
  "labels.muted": "#8F9098",
8700
9023
  "labels.neighborhood": "#8F9098",
8701
9024
  "labels.overview": "#B2B1B7",
@@ -8749,19 +9072,19 @@ var streetsDarkColors = {
8749
9072
  "landuse.recreationOutline": "#63756A",
8750
9073
  "landuse.residential": "#2D3043",
8751
9074
  "poi.arts-entertainment": "#C786BC",
8752
- "poi.education": "#8F9098",
8753
- "poi.food-drink": "#D69A58",
9075
+ "poi.education": "#B6A783",
9076
+ "poi.food-drink": "#D8BD65",
8754
9077
  "poi.halo": "#252839",
8755
9078
  "poi.icon": "#8F9098",
8756
9079
  "poi.label": "#B8B7BD",
8757
9080
  "poi.landmark": "#C786BC",
8758
9081
  "poi.lodging": "#AA94DA",
8759
9082
  "poi.medical": "#DC7C89",
8760
- "poi.park-nature": "#76B59A",
9083
+ "poi.park-nature": "#89B871",
8761
9084
  "poi.public-services": "#8F9098",
8762
- "poi.religion": "#C786BC",
8763
- "poi.retail": "#76B59A",
8764
- "poi.sport-leisure": "#76B59A",
9085
+ "poi.religion": "#9DAAB0",
9086
+ "poi.retail": "#94BCE3",
9087
+ "poi.sport-leisure": "#89B871",
8765
9088
  "poi.transport": "#8296E6",
8766
9089
  "poi.visitor-amenity": "#8F9098",
8767
9090
  "roads.bridge": "#636779",
@@ -8792,6 +9115,7 @@ var streetsDarkColors = {
8792
9115
  "roads.rail": "#7C7F8C",
8793
9116
  "roads.railTransit": "#777B89",
8794
9117
  "roads.secondary": "#636779",
9118
+ "roads.sidewalk.surface": "rgba(255, 255, 255, 0.06)",
8795
9119
  "roads.trunk": "#6F7188",
8796
9120
  "roads.trunk.casing": "#505264",
8797
9121
  "roads.trunk.tunnel": "#5B5D70",
@@ -8801,6 +9125,9 @@ var streetsDarkColors = {
8801
9125
  "surface.land": "#2D3043",
8802
9126
  "surface.park": "#34453F",
8803
9127
  "surface.water": "#18223B",
9128
+ "terrain.hillshade.accent": "#252D36",
9129
+ "terrain.hillshade.highlight": "#576374",
9130
+ "terrain.hillshade.shadow": "#101827",
8804
9131
  "transit.primary": "#8296E6",
8805
9132
  "vegetation.tree.bark": "#52483D",
8806
9133
  "vegetation.tree.broadleaf.a": "#35473F",
@@ -8811,24 +9138,126 @@ var streetsDarkColors = {
8811
9138
  "vegetation.tree.conifer.b": "#384A40",
8812
9139
  "vegetation.tree.conifer.c": "#405348"
8813
9140
  };
9141
+ function parseStreetsColor(value) {
9142
+ const hex = /^#([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/i.exec(value);
9143
+ if (hex) {
9144
+ const digits = hex[1];
9145
+ const expanded = digits.length < 5 ? [...digits].map((digit) => digit + digit).join("") : digits;
9146
+ return {
9147
+ r: Number.parseInt(expanded.slice(0, 2), 16),
9148
+ g: Number.parseInt(expanded.slice(2, 4), 16),
9149
+ b: Number.parseInt(expanded.slice(4, 6), 16),
9150
+ a: expanded.length === 8 ? Number.parseInt(expanded.slice(6, 8), 16) / 255 : 1
9151
+ };
9152
+ }
9153
+ const rgb = /^rgba?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)(?:\s*,\s*(\d+(?:\.\d+)?))?\s*\)$/i.exec(
9154
+ value
9155
+ );
9156
+ if (rgb) {
9157
+ return {
9158
+ r: Number(rgb[1]),
9159
+ g: Number(rgb[2]),
9160
+ b: Number(rgb[3]),
9161
+ a: rgb[4] === void 0 ? 1 : Number(rgb[4])
9162
+ };
9163
+ }
9164
+ throw new Error(`Unsupported Streets theme color: ${value}`);
9165
+ }
9166
+ function formatStreetsColor({ a, b, g, r }, format) {
9167
+ const channel = (value) => Math.max(0, Math.min(255, Math.round(value)));
9168
+ if (format.startsWith("rgba")) {
9169
+ return `rgba(${channel(r)}, ${channel(g)}, ${channel(b)}, ${Number(a.toFixed(3))})`;
9170
+ }
9171
+ const hex = (value) => channel(value).toString(16).padStart(2, "0");
9172
+ return `#${hex(r)}${hex(g)}${hex(b)}${format.length === 9 ? hex(a * 255) : ""}`;
9173
+ }
9174
+ function mixStreetsColor(color, tint, amount) {
9175
+ const target = parseStreetsColor(tint);
9176
+ return {
9177
+ r: color.r + (target.r - color.r) * amount,
9178
+ g: color.g + (target.g - color.g) * amount,
9179
+ b: color.b + (target.b - color.b) * amount,
9180
+ a: color.a
9181
+ };
9182
+ }
9183
+ function adjustStreetsColors(colors, transform) {
9184
+ return Object.fromEntries(
9185
+ Object.entries(colors).map(([role, value]) => [
9186
+ role,
9187
+ formatStreetsColor(transform(role, parseStreetsColor(value)), value)
9188
+ ])
9189
+ );
9190
+ }
9191
+ function applyStreetsLightPreset(colors, preset) {
9192
+ if (preset === "day" || preset === "night") return { ...colors };
9193
+ const dawn = preset === "dawn";
9194
+ return adjustStreetsColors(colors, (role, color) => {
9195
+ if (role.startsWith("hydro.") || role === "boundaries.maritime" || role === "surface.water" || role === "labels.water" || role === "labels.waterHalo" || role === "labels.ferry" || role === "labels.ferryHalo") {
9196
+ return mixStreetsColor(color, dawn ? "#8EA9B8" : "#7893AA", dawn ? 0.24 : 0.2);
9197
+ }
9198
+ if (role.startsWith("roads.")) {
9199
+ return mixStreetsColor(color, dawn ? "#B8AEB0" : "#9698A8", dawn ? 0.17 : 0.2);
9200
+ }
9201
+ const greenLandcover = role.startsWith("landcover.") && !/(?:^|\.)(?:barren|ice|rock|sand|snow|urban)$/.test(role);
9202
+ if (greenLandcover || role.startsWith("vegetation.tree.") || role === "surface.park" || role === "landuse.cemetery" || role === "landuse.recreation" || role === "landuse.recreationOutline") {
9203
+ return mixStreetsColor(color, dawn ? "#B9D5AB" : "#A6BDA8", dawn ? 0.13 : 0.17);
9204
+ }
9205
+ const halo = role === "labels.halo" || role.endsWith("Halo") || role === "poi.halo";
9206
+ if (role.startsWith("labels.") && !halo) {
9207
+ return mixStreetsColor(color, dawn ? "#514B48" : "#494A54", dawn ? 0.06 : 0.08);
9208
+ }
9209
+ if (halo) {
9210
+ return mixStreetsColor(color, dawn ? "#F2E3D7" : "#E5DFE4", dawn ? 0.23 : 0.18);
9211
+ }
9212
+ if (role.startsWith("landuse.parking")) {
9213
+ return mixStreetsColor(color, dawn ? "#D7D6D5" : "#CECFD7", dawn ? 0.16 : 0.2);
9214
+ }
9215
+ if (role.startsWith("buildings.") || role.startsWith("landuse.") || role.startsWith("surface.") || role === "boundaries.halo") {
9216
+ return mixStreetsColor(color, dawn ? "#F2E3D7" : "#E5DFE4", dawn ? 0.23 : 0.18);
9217
+ }
9218
+ return color;
9219
+ });
9220
+ }
9221
+ function applyStreetsColorTheme(colors, theme, isDark) {
9222
+ if (theme === "default") return { ...colors };
9223
+ if (theme === "monochrome") {
9224
+ return adjustStreetsColors(colors, (_role, color) => {
9225
+ const gray = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;
9226
+ return { ...color, r: gray, g: gray, b: gray };
9227
+ });
9228
+ }
9229
+ const background = isDark ? "#292C3A" : "#F1F0ED";
9230
+ return adjustStreetsColors(colors, (_role, color) => {
9231
+ const gray = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;
9232
+ const desaturated = {
9233
+ ...color,
9234
+ r: gray + (color.r - gray) * 0.52,
9235
+ g: gray + (color.g - gray) * 0.52,
9236
+ b: gray + (color.b - gray) * 0.52
9237
+ };
9238
+ return mixStreetsColor(desaturated, background, isDark ? 0.08 : 0.12);
9239
+ });
9240
+ }
9241
+ function streetsPaletteColors(preset, colorTheme) {
9242
+ const isDark = preset === "night";
9243
+ const base = isDark ? streetsDarkColors : streetsLightColors;
9244
+ return applyStreetsColorTheme(applyStreetsLightPreset(base, preset), colorTheme, isDark);
9245
+ }
8814
9246
  var streetsFonts = {
9247
+ // DIN Pro Medium has much lighter strokes than Noto Sans Bold. Of the
9248
+ // hosted Noto faces, Regular is the closer match for navigation and POIs.
8815
9249
  default: "Noto Sans Regular",
8816
- places: "Noto Sans Bold"
9250
+ places: "Noto Sans Bold",
9251
+ regular: "Noto Sans Regular",
9252
+ water: "Noto Sans Italic"
8817
9253
  };
8818
9254
  var streetsImages = {
8819
- "poi.arts-entertainment": "culture",
8820
- "poi.education": "education",
8821
- "poi.food-drink": "food",
8822
- "poi.landmark": "culture",
8823
- "poi.lodging": "lodging",
8824
- "poi.medical": "health",
8825
- "poi.park-nature": "services",
8826
- "poi.public-services": "services",
8827
- "poi.religion": "culture",
8828
- "poi.retail": "shopping",
8829
- "poi.sport-leisure": "culture",
8830
- "poi.transport": "major-transit",
8831
- "poi.visitor-amenity": "services",
9255
+ ...Object.fromEntries(
9256
+ ["round", "open", "tall", "conifer", "columnar", "palm-feather", "palm-fan"].map((form) => [
9257
+ `vegetation.tree.${form}`,
9258
+ `streets-tree-${form}`
9259
+ ])
9260
+ ),
8832
9261
  "roads.crosswalk": "crosswalk",
8833
9262
  "roads.oneway": "oneway",
8834
9263
  "roads.shield.circleNeutral": "road-shield-circle-neutral",
@@ -8840,95 +9269,136 @@ var streetsImages = {
8840
9269
  "roads.shield.rectangleYellow": "road-shield-rectangle-yellow",
8841
9270
  "roads.sidewalkPattern": "sidewalk-dot"
8842
9271
  };
8843
- var streetsThemes = Object.freeze({
8844
- light: defineTheme2({
8845
- id: "streets-light",
8846
- version: 1,
8847
- colorScheme: "light",
8848
- tokens: {
8849
- color: streetsLightColors,
8850
- number: {},
8851
- font: streetsFonts,
8852
- image: streetsImages
8853
- },
8854
- typography: {
8855
- font: token4.font("default"),
8856
- places: { font: token4.font("places") },
8857
- poi: { font: token4.font("default") },
8858
- roads: { font: token4.font("default") },
8859
- water: { font: token4.font("default") }
8860
- },
8861
- lighting: {
8862
- anchor: "viewport",
8863
- color: "#FFFFFF",
8864
- intensity: 0.15,
8865
- position: [1.15, 210, 30]
9272
+ var streetsLightTheme = defineTheme2({
9273
+ id: "streets-light",
9274
+ version: 1,
9275
+ colorScheme: "light",
9276
+ tokens: {
9277
+ color: streetsLightColors,
9278
+ number: {},
9279
+ font: streetsFonts,
9280
+ image: { ...streetsImages, ...streetsPoiImageTokens("light") }
9281
+ },
9282
+ typography: {
9283
+ font: token5.font("default"),
9284
+ places: { font: token5.font("places") },
9285
+ poi: { font: token5.font("default") },
9286
+ roads: { font: token5.font("default") },
9287
+ water: { font: token5.font("default") }
9288
+ },
9289
+ lighting: {
9290
+ // A broad, high light keeps warm roofs bright and facades softly shaded.
9291
+ // Anchor it to the map so rotating the camera does not move the light.
9292
+ anchor: "map",
9293
+ color: "#FFFFFF",
9294
+ intensity: 0.08,
9295
+ position: [1.15, 210, 30]
9296
+ }
9297
+ });
9298
+ var streetsDarkTheme = defineTheme2({
9299
+ id: "streets-dark",
9300
+ version: 1,
9301
+ colorScheme: "dark",
9302
+ tokens: {
9303
+ color: streetsDarkColors,
9304
+ number: {},
9305
+ font: streetsFonts,
9306
+ image: {
9307
+ ...streetsImages,
9308
+ ...streetsPoiImageTokens("dark"),
9309
+ ...Object.fromEntries(
9310
+ Object.entries(streetsImages).filter(([role]) => role.startsWith("vegetation.tree.")).map(([role, image2]) => [role, `${image2}-dark`])
9311
+ ),
9312
+ "roads.sidewalkPattern": "sidewalk-dot-dark"
8866
9313
  }
8867
- }),
8868
- dark: defineTheme2({
8869
- id: "streets-dark",
9314
+ },
9315
+ typography: {
9316
+ font: token5.font("default"),
9317
+ places: { font: token5.font("places") },
9318
+ poi: { font: token5.font("default") },
9319
+ roads: { font: token5.font("default") },
9320
+ water: { font: token5.font("default") }
9321
+ },
9322
+ lighting: {
9323
+ anchor: "viewport",
9324
+ color: "#9FB6D0",
9325
+ intensity: 0.08,
9326
+ position: [1.15, 210, 30]
9327
+ }
9328
+ });
9329
+ function defineStreetsPaletteTheme(name, preset, colorTheme) {
9330
+ const isDark = preset === "night";
9331
+ const imageVariant = colorTheme === "monochrome" ? isDark ? "monochrome-dark" : "monochrome" : void 0;
9332
+ return defineTheme2(isDark ? streetsDarkTheme : streetsLightTheme, {
9333
+ id: `streets-${name}`,
8870
9334
  version: 1,
8871
- colorScheme: "dark",
9335
+ colorScheme: isDark ? "dark" : "light",
8872
9336
  tokens: {
8873
- color: streetsDarkColors,
8874
- number: {},
8875
- font: streetsFonts,
8876
- image: {
8877
- ...streetsImages,
8878
- "roads.sidewalkPattern": "sidewalk-dot-dark"
8879
- }
8880
- },
8881
- typography: {
8882
- font: token4.font("default"),
8883
- places: { font: token4.font("places") },
8884
- poi: { font: token4.font("default") },
8885
- roads: { font: token4.font("default") },
8886
- water: { font: token4.font("default") }
8887
- },
8888
- lighting: {
8889
- anchor: "viewport",
8890
- color: "#9FB6D0",
8891
- intensity: 0.08,
8892
- position: [1.15, 210, 30]
9337
+ color: streetsPaletteColors(preset, colorTheme),
9338
+ ...imageVariant ? { image: streetsPoiImageTokens(imageVariant) } : {}
8893
9339
  }
8894
- })
9340
+ });
9341
+ }
9342
+ var streetsThemes = Object.freeze({
9343
+ light: streetsLightTheme,
9344
+ dark: streetsDarkTheme,
9345
+ dawn: defineStreetsPaletteTheme("dawn", "dawn", "default"),
9346
+ dusk: defineStreetsPaletteTheme("dusk", "dusk", "default"),
9347
+ faded: defineStreetsPaletteTheme("faded", "day", "faded"),
9348
+ monochrome: defineStreetsPaletteTheme("monochrome", "day", "monochrome"),
9349
+ "dawn-faded": defineStreetsPaletteTheme("dawn-faded", "dawn", "faded"),
9350
+ "dawn-monochrome": defineStreetsPaletteTheme("dawn-monochrome", "dawn", "monochrome"),
9351
+ "dusk-faded": defineStreetsPaletteTheme("dusk-faded", "dusk", "faded"),
9352
+ "dusk-monochrome": defineStreetsPaletteTheme("dusk-monochrome", "dusk", "monochrome"),
9353
+ "dark-faded": defineStreetsPaletteTheme("dark-faded", "night", "faded"),
9354
+ "dark-monochrome": defineStreetsPaletteTheme("dark-monochrome", "night", "monochrome")
8895
9355
  });
8896
9356
  var streetsVisual = {
8897
9357
  boundary: {
8898
- admin: token4.color("boundaries.admin"),
8899
- halo: token4.color("boundaries.halo"),
8900
- regional: token4.color("boundaries.regional"),
8901
- overviewLabel: token4.color("labels.overview")
9358
+ admin: token5.color("boundaries.admin"),
9359
+ halo: token5.color("boundaries.halo"),
9360
+ regional: token5.color("boundaries.regional"),
9361
+ overviewLabel: token5.color("labels.overview")
8902
9362
  },
8903
9363
  building: {
8904
- extrusion: token4.color("buildings.extrusion"),
8905
- fill: token4.color("buildings.fill"),
8906
- outline: token4.color("buildings.outline"),
8907
- shadow: token4.color("buildings.shadow")
9364
+ contactShadow: token5.color("buildings.contactShadow"),
9365
+ extrusion: token5.color("buildings.extrusion"),
9366
+ fill: token5.color("buildings.fill"),
9367
+ outline: token5.color("buildings.outline"),
9368
+ shadow: token5.color("buildings.shadow")
9369
+ },
9370
+ terrain: {
9371
+ accent: token5.color("terrain.hillshade.accent"),
9372
+ highlight: token5.color("terrain.hillshade.highlight"),
9373
+ shadow: token5.color("terrain.hillshade.shadow")
8908
9374
  },
8909
9375
  hydro: {
8910
- depth0: token4.color("hydro.depth.m0"),
8911
- depth200: token4.color("hydro.depth.m200"),
8912
- depth2000: token4.color("hydro.depth.m2000"),
8913
- depth7000: token4.color("hydro.depth.m7000"),
8914
- ocean: token4.color("hydro.ocean"),
8915
- water: token4.color("hydro.water")
9376
+ depth0: token5.color("hydro.depth.m0"),
9377
+ depth200: token5.color("hydro.depth.m200"),
9378
+ depth2000: token5.color("hydro.depth.m2000"),
9379
+ depth7000: token5.color("hydro.depth.m7000"),
9380
+ ocean: token5.color("hydro.ocean"),
9381
+ water: token5.color("hydro.water")
8916
9382
  },
8917
9383
  label: {
8918
- country: token4.color("labels.country"),
8919
- halo: token4.color("labels.halo"),
8920
- muted: token4.color("labels.muted"),
8921
- neighborhood: token4.color("labels.neighborhood"),
8922
- overview: token4.color("labels.overview"),
8923
- poi: token4.color("labels.poi"),
8924
- primary: token4.color("labels.primary"),
8925
- road: token4.color("labels.road"),
8926
- settlement: token4.color("labels.settlement"),
8927
- shieldDark: token4.color("labels.shield.dark"),
8928
- shieldLight: token4.color("labels.shield.light"),
8929
- strong: token4.color("labels.strong"),
8930
- water: token4.color("labels.water"),
8931
- waterHalo: token4.color("labels.waterHalo")
9384
+ country: token5.color("labels.country"),
9385
+ ferry: token5.color("labels.ferry"),
9386
+ ferryHalo: token5.color("labels.ferryHalo"),
9387
+ halo: token5.color("labels.halo"),
9388
+ muted: token5.color("labels.muted"),
9389
+ neighborhood: token5.color("labels.neighborhood"),
9390
+ overview: token5.color("labels.overview"),
9391
+ poi: token5.color("labels.poi"),
9392
+ primary: token5.color("labels.primary"),
9393
+ road: token5.color("labels.road"),
9394
+ settlement: token5.color("labels.settlement"),
9395
+ shieldDark: token5.color("labels.shield.dark"),
9396
+ shieldLight: token5.color("labels.shield.light"),
9397
+ strong: token5.color("labels.strong"),
9398
+ water: token5.color("labels.water"),
9399
+ waterHalo: token5.color("labels.waterHalo"),
9400
+ placeHalo: token5.color("labels.placeHalo"),
9401
+ roadHalo: token5.color("labels.roadHalo")
8932
9402
  },
8933
9403
  landcover: Object.fromEntries(
8934
9404
  [
@@ -8949,12 +9419,12 @@ var streetsVisual = {
8949
9419
  "villageGreen",
8950
9420
  "wetland",
8951
9421
  "wood"
8952
- ].map((name) => [name, token4.color(`landcover.${name}`)])
9422
+ ].map((name) => [name, token5.color(`landcover.${name}`)])
8953
9423
  ),
8954
9424
  globalLandcover: Object.fromEntries(
8955
9425
  ["barren", "crop", "grass", "shrub", "snow", "trees", "urban"].map((name) => [
8956
9426
  name,
8957
- token4.color(`landcover.global.${name}`)
9427
+ token5.color(`landcover.global.${name}`)
8958
9428
  ])
8959
9429
  ),
8960
9430
  landuse: Object.fromEntries(
@@ -8975,7 +9445,7 @@ var streetsVisual = {
8975
9445
  "recreation",
8976
9446
  "recreationOutline",
8977
9447
  "residential"
8978
- ].map((name) => [name, token4.color(`landuse.${name}`)])
9448
+ ].map((name) => [name, token5.color(`landuse.${name}`)])
8979
9449
  ),
8980
9450
  poi: Object.fromEntries(
8981
9451
  [
@@ -8995,68 +9465,309 @@ var streetsVisual = {
8995
9465
  "sport-leisure",
8996
9466
  "transport",
8997
9467
  "visitor-amenity"
8998
- ].map((name) => [name, token4.color(`poi.${name}`)])
9468
+ ].map((name) => [name, token5.color(`poi.${name}`)])
8999
9469
  ),
9000
9470
  road: {
9001
- casing: token4.color("roads.default.casing"),
9002
- cityCasing: token4.color("roads.city.casing"),
9003
- cityMinor: token4.color("roads.city.minor"),
9004
- cityPrimary: token4.color("roads.city.primary"),
9005
- citySecondary: token4.color("roads.city.secondary"),
9006
- cityTertiary: token4.color("roads.city.tertiary"),
9007
- cityTunnel: token4.color("roads.city.tunnel"),
9008
- cityTunnelCasing: token4.color("roads.city.tunnelCasing"),
9009
- cycleway: token4.color("roads.cycleway"),
9010
- default: token4.color("roads.default"),
9011
- ferry: token4.color("roads.ferry"),
9012
- motorway: token4.color("roads.motorway"),
9013
- motorwayCasing: token4.color("roads.motorway.casing"),
9014
- motorwayTunnel: token4.color("roads.motorway.tunnel"),
9015
- parkPath: token4.color("roads.parkPath"),
9016
- path: token4.color("roads.path"),
9017
- pathCasing: token4.color("roads.path.casing"),
9018
- pathTransition: token4.color("roads.path.transition"),
9019
- pathTunnel: token4.color("roads.path.tunnel"),
9020
- rail: token4.color("roads.rail"),
9021
- railTransit: token4.color("roads.railTransit"),
9022
- trunk: token4.color("roads.trunk"),
9023
- trunkCasing: token4.color("roads.trunk.casing"),
9024
- trunkTunnel: token4.color("roads.trunk.tunnel"),
9025
- tunnel: token4.color("roads.default.tunnel")
9471
+ casing: token5.color("roads.default.casing"),
9472
+ cityCasing: token5.color("roads.city.casing"),
9473
+ cityMinor: token5.color("roads.city.minor"),
9474
+ cityPrimary: token5.color("roads.city.primary"),
9475
+ citySecondary: token5.color("roads.city.secondary"),
9476
+ cityTertiary: token5.color("roads.city.tertiary"),
9477
+ cityTunnel: token5.color("roads.city.tunnel"),
9478
+ cityTunnelCasing: token5.color("roads.city.tunnelCasing"),
9479
+ cycleway: token5.color("roads.cycleway"),
9480
+ default: token5.color("roads.default"),
9481
+ ferry: token5.color("roads.ferry"),
9482
+ motorway: token5.color("roads.motorway"),
9483
+ motorwayCasing: token5.color("roads.motorway.casing"),
9484
+ motorwayTunnel: token5.color("roads.motorway.tunnel"),
9485
+ parkPath: token5.color("roads.parkPath"),
9486
+ path: token5.color("roads.path"),
9487
+ pathCasing: token5.color("roads.path.casing"),
9488
+ pathTransition: token5.color("roads.path.transition"),
9489
+ pathTunnel: token5.color("roads.path.tunnel"),
9490
+ rail: token5.color("roads.rail"),
9491
+ railTransit: token5.color("roads.railTransit"),
9492
+ sidewalkSurface: token5.color("roads.sidewalk.surface"),
9493
+ trunk: token5.color("roads.trunk"),
9494
+ trunkCasing: token5.color("roads.trunk.casing"),
9495
+ trunkTunnel: token5.color("roads.trunk.tunnel"),
9496
+ tunnel: token5.color("roads.default.tunnel")
9026
9497
  },
9027
9498
  surface: {
9028
- background: token4.color("surface.background"),
9029
- building: token4.color("surface.building"),
9030
- land: token4.color("surface.land"),
9031
- park: token4.color("surface.park"),
9032
- water: token4.color("surface.water")
9499
+ background: token5.color("surface.background"),
9500
+ building: token5.color("surface.building"),
9501
+ land: token5.color("surface.land"),
9502
+ park: token5.color("surface.park"),
9503
+ water: token5.color("surface.water")
9033
9504
  },
9034
- transit: token4.color("transit.primary"),
9505
+ transit: token5.color("transit.primary"),
9035
9506
  tree: {
9036
- bark: token4.color("vegetation.tree.bark"),
9507
+ bark: token5.color("vegetation.tree.bark"),
9037
9508
  broadleaf: ["a", "b", "c", "d"].map(
9038
- (suffix) => token4.color(`vegetation.tree.broadleaf.${suffix}`)
9509
+ (suffix) => token5.color(`vegetation.tree.broadleaf.${suffix}`)
9039
9510
  ),
9040
- conifer: ["a", "b", "c"].map((suffix) => token4.color(`vegetation.tree.conifer.${suffix}`))
9511
+ conifer: ["a", "b", "c"].map((suffix) => token5.color(`vegetation.tree.conifer.${suffix}`))
9041
9512
  },
9042
9513
  image: {
9043
- crosswalk: token4.image("roads.crosswalk"),
9044
- oneway: token4.image("roads.oneway"),
9045
- shieldCircleNeutral: token4.image("roads.shield.circleNeutral"),
9046
- shieldRectangleBlue: token4.image("roads.shield.rectangleBlue"),
9047
- shieldRectangleGreen: token4.image("roads.shield.rectangleGreen"),
9048
- shieldRectangleNeutral: token4.image("roads.shield.rectangleNeutral"),
9049
- shieldRectangleOrange: token4.image("roads.shield.rectangleOrange"),
9050
- shieldRectangleRed: token4.image("roads.shield.rectangleRed"),
9051
- shieldRectangleYellow: token4.image("roads.shield.rectangleYellow"),
9052
- sidewalkPattern: token4.image("roads.sidewalkPattern")
9514
+ crosswalk: token5.image("roads.crosswalk"),
9515
+ oneway: token5.image("roads.oneway"),
9516
+ shieldCircleNeutral: token5.image("roads.shield.circleNeutral"),
9517
+ shieldRectangleBlue: token5.image("roads.shield.rectangleBlue"),
9518
+ shieldRectangleGreen: token5.image("roads.shield.rectangleGreen"),
9519
+ shieldRectangleNeutral: token5.image("roads.shield.rectangleNeutral"),
9520
+ shieldRectangleOrange: token5.image("roads.shield.rectangleOrange"),
9521
+ shieldRectangleRed: token5.image("roads.shield.rectangleRed"),
9522
+ shieldRectangleYellow: token5.image("roads.shield.rectangleYellow"),
9523
+ sidewalkPattern: token5.image("roads.sidewalkPattern")
9053
9524
  },
9054
9525
  font: {
9055
- default: token4.font("default"),
9056
- places: token4.font("places")
9526
+ default: token5.font("default"),
9527
+ places: token5.font("places"),
9528
+ regular: token5.font("regular"),
9529
+ water: token5.font("water")
9057
9530
  }
9058
9531
  };
9059
9532
 
9533
+ // src/official/streets-trees.ts
9534
+ import {
9535
+ expr as expr10,
9536
+ field as field9,
9537
+ renderPass as renderPass8,
9538
+ token as token6,
9539
+ vegetation as vegetation6,
9540
+ withRenderStack as withRenderStack8,
9541
+ zoom as zoom9
9542
+ } from "@tileflow/core";
9543
+ var seed = expr10.toNumber(expr10.id(), 0);
9544
+ var genus = expr10.get(field9("genus"));
9545
+ var leaf = expr10.get(field9("leafType"));
9546
+ var named = (names) => expr10.match(
9547
+ genus,
9548
+ [{ labels: names.flatMap((name) => [name, name.toLowerCase()]), value: true }],
9549
+ false
9550
+ );
9551
+ var image = (form) => token6.image(`vegetation.tree.${form}`);
9552
+ var broadleaf = expr10.match(
9553
+ expr10.modulo(seed, 3),
9554
+ [
9555
+ { labels: [0], value: image("round") },
9556
+ { labels: [1], value: image("open") }
9557
+ ],
9558
+ image("tall")
9559
+ );
9560
+ var palm = expr10.match(
9561
+ expr10.modulo(seed, 2),
9562
+ [{ labels: [0], value: image("palm-feather") }],
9563
+ image("palm-fan")
9564
+ );
9565
+ var crownImage = expr10.case(
9566
+ [
9567
+ {
9568
+ when: expr10.any(
9569
+ expr10.eq(leaf, "palm"),
9570
+ named([
9571
+ "Acoelorrhaphe",
9572
+ "Adonidia",
9573
+ "Archontophoenix",
9574
+ "Areca",
9575
+ "Bismarckia",
9576
+ "Brahea",
9577
+ "Butia",
9578
+ "Caryota",
9579
+ "Chamaedorea",
9580
+ "Chamaerops",
9581
+ "Coccothrinax",
9582
+ "Cocos",
9583
+ "Dypsis",
9584
+ "Elaeis",
9585
+ "Howea",
9586
+ "Jubaea",
9587
+ "Licuala",
9588
+ "Livistona",
9589
+ "Phoenix",
9590
+ "Pritchardia",
9591
+ "Ptychosperma",
9592
+ "Rhapis",
9593
+ "Roystonea",
9594
+ "Sabal",
9595
+ "Serenoa",
9596
+ "Syagrus",
9597
+ "Thrinax",
9598
+ "Trachycarpus",
9599
+ "Veitchia",
9600
+ "Washingtonia",
9601
+ "Wodyetia"
9602
+ ])
9603
+ ),
9604
+ value: palm
9605
+ },
9606
+ { when: named(["Cupressus", "Calocedrus", "Thuja"]), value: image("columnar") },
9607
+ {
9608
+ when: expr10.any(
9609
+ expr10.eq(leaf, "needleleaved"),
9610
+ named([
9611
+ "Abies",
9612
+ "Araucaria",
9613
+ "Cedrus",
9614
+ "Cryptomeria",
9615
+ "Juniperus",
9616
+ "Larix",
9617
+ "Metasequoia",
9618
+ "Picea",
9619
+ "Pinus",
9620
+ "Pseudotsuga",
9621
+ "Sequoia",
9622
+ "Sequoiadendron",
9623
+ "Taxodium",
9624
+ "Taxus",
9625
+ "Tsuga"
9626
+ ])
9627
+ ),
9628
+ value: image("conifer")
9629
+ },
9630
+ {
9631
+ when: named([
9632
+ "Acacia",
9633
+ "Albizia",
9634
+ "Arbutus",
9635
+ "Bursera",
9636
+ "Ceratonia",
9637
+ "Delonix",
9638
+ "Ficus",
9639
+ "Gleditsia",
9640
+ "Jacaranda",
9641
+ "Olea",
9642
+ "Quercus",
9643
+ "Robinia",
9644
+ "Schinus",
9645
+ "Sophora",
9646
+ "Styphnolobium",
9647
+ "Tamarix"
9648
+ ]),
9649
+ value: image("open")
9650
+ },
9651
+ {
9652
+ when: named([
9653
+ "Betula",
9654
+ "Celtis",
9655
+ "Fraxinus",
9656
+ "Ginkgo",
9657
+ "Liquidambar",
9658
+ "Liriodendron",
9659
+ "Magnolia",
9660
+ "Platanus",
9661
+ "Populus",
9662
+ "Pyrus",
9663
+ "Ulmus",
9664
+ "Zelkova"
9665
+ ]),
9666
+ value: image("tall")
9667
+ },
9668
+ {
9669
+ when: named([
9670
+ "Acer",
9671
+ "Aesculus",
9672
+ "Carpinus",
9673
+ "Castanea",
9674
+ "Catalpa",
9675
+ "Cercis",
9676
+ "Citrus",
9677
+ "Fagus",
9678
+ "Lagerstroemia",
9679
+ "Malus",
9680
+ "Melia",
9681
+ "Morus",
9682
+ "Prunus",
9683
+ "Sorbus",
9684
+ "Tilia"
9685
+ ]),
9686
+ value: image("round")
9687
+ }
9688
+ ],
9689
+ broadleaf
9690
+ );
9691
+ var diameter = expr10.toNumber(expr10.get(field9("diameterCrown")), 0);
9692
+ var crownFactor = expr10.divide(
9693
+ expr10.max(3, expr10.min(18, expr10.case([{ when: expr10.gt(diameter, 0), value: diameter }], 7))),
9694
+ 7
9695
+ );
9696
+ var size = (divisor) => expr10.interpolate({ kind: "exponential", base: 2 }, expr10.zoom(), [
9697
+ [15, expr10.multiply(crownFactor, 2.1 / divisor)],
9698
+ [22, expr10.multiply(crownFactor, 268.8 / divisor)]
9699
+ ]);
9700
+ var streetsTrees = withRenderStack8(
9701
+ vegetation6({
9702
+ // Models stay 3D in overhead and tilted views; unsupported renderers omit trees.
9703
+ mode: "3d",
9704
+ fallback: "none",
9705
+ visible: true,
9706
+ flat: {
9707
+ minZoom: 15.5,
9708
+ color: token6.color("vegetation.tree.broadleaf.a"),
9709
+ radius: size(2),
9710
+ opacity: zoom9.linear([
9711
+ [15.5, 0],
9712
+ [16, 0.12]
9713
+ ]),
9714
+ blur: 0.7,
9715
+ pitchAlignment: "map",
9716
+ pitchScale: "map",
9717
+ strokeOpacity: 0
9718
+ },
9719
+ threeDimensional: {
9720
+ barkColor: token6.color("vegetation.tree.bark"),
9721
+ broadleafColors: ["a", "b", "c", "d"].map(
9722
+ (shade) => token6.color(`vegetation.tree.broadleaf.${shade}`)
9723
+ ),
9724
+ coniferColors: ["a", "b", "c"].map(
9725
+ (shade) => token6.color(`vegetation.tree.conifer.${shade}`)
9726
+ ),
9727
+ palmColors: ["a", "b", "c"].map((shade) => token6.color(`vegetation.tree.broadleaf.${shade}`)),
9728
+ crownScale: 1,
9729
+ heightScale: 1,
9730
+ finish: "faceted",
9731
+ edges: 0,
9732
+ forms: {
9733
+ round: { models: ["streets-tree-round"] },
9734
+ open: { models: ["streets-tree-open"] },
9735
+ tall: { models: ["streets-tree-tall"] },
9736
+ conifer: { models: ["streets-tree-conifer"] },
9737
+ columnar: { models: ["streets-tree-columnar"] },
9738
+ palm: { models: ["streets-tree-palm-feather", "streets-tree-palm-fan"] }
9739
+ }
9740
+ }
9741
+ }),
9742
+ {
9743
+ crowns: renderPass8({
9744
+ placement: { above: "vegetation.trees" },
9745
+ // Inherit the optional tree binding from the anchor; generic OpenMapTiles omits it.
9746
+ requirements: ["vegetation"],
9747
+ renderer: "symbol",
9748
+ selector: { kind: "geometry", geometry: "point" },
9749
+ style: {
9750
+ minZoom: 15.5,
9751
+ icon: {
9752
+ image: crownImage,
9753
+ size: size(52),
9754
+ opacity: zoom9.linear([
9755
+ [15.5, 0],
9756
+ [16, 0.88],
9757
+ [18, 1]
9758
+ ]),
9759
+ rotate: expr10.modulo(expr10.multiply(seed, 137.508), 360),
9760
+ rotationAlignment: "map",
9761
+ pitchAlignment: "map",
9762
+ allowOverlap: true,
9763
+ ignorePlacement: true,
9764
+ padding: 0
9765
+ }
9766
+ }
9767
+ })
9768
+ }
9769
+ );
9770
+
9060
9771
  // src/official/streets.ts
9061
9772
  var streetsDetailPalette = {
9062
9773
  greenspace: streetsVisual.landcover.greenspace,
@@ -9134,7 +9845,7 @@ var streetsGlobalLandcoverPalette = {
9134
9845
  trees: streetsVisual.globalLandcover.trees,
9135
9846
  urban: streetsVisual.globalLandcover.urban
9136
9847
  };
9137
- var globalLandcoverOpacity = zoom9.linear([
9848
+ var globalLandcoverOpacity = zoom10.linear([
9138
9849
  // At world and country zooms the source classes are the terrain palette.
9139
9850
  // Blending them into the neutral land token desaturates forests and crops
9140
9851
  // into one pale wash, so keep the authored colours intact until the detailed
@@ -9149,39 +9860,54 @@ var globalLandcoverOpacity = zoom9.linear([
9149
9860
  [10.75, 0.25],
9150
9861
  [11, 0]
9151
9862
  ]);
9152
- var detailedLandcoverOpacity = zoom9.linear([
9863
+ var detailedLandcoverOpacity = zoom10.linear([
9153
9864
  [7, 0],
9154
9865
  [8, 0.35],
9155
9866
  [9, 0.7],
9156
9867
  [10, 0.9],
9157
9868
  [11, 1]
9158
9869
  ]);
9159
- var detailedUrbanGreenOpacity = zoom9.linear([
9870
+ var detailedUrbanGreenOpacity = zoom10.linear([
9160
9871
  [8, 0],
9161
9872
  [9, 1]
9162
9873
  ]);
9163
- var protectedAreaOpacity = zoom9.linear([
9874
+ var protectedAreaOpacity = zoom10.linear([
9164
9875
  [7, 0],
9165
9876
  [8, 0.28],
9166
9877
  [9, 0.32]
9167
9878
  ]);
9168
- var streetsPoiStyle = {
9169
- icon: {
9170
- size: zoom9.linear([
9171
- [12, 1.04],
9172
- [15, 1.1],
9173
- [17, 1.14]
9174
- ])
9175
- }
9176
- };
9177
- var sparseStreetsPoiStyle = {
9178
- ...streetsPoiStyle,
9179
- density: 2
9180
- };
9181
- var deferredStreetsPoiStyle = {
9182
- ...streetsPoiStyle,
9183
- minZoom: 15.5
9184
- };
9879
+ function streetsPoiStyle(category) {
9880
+ const filterRank = expr11.toNumber(expr11.get(field10("poiFilterRank")), 6);
9881
+ const sizeRank = expr11.toNumber(expr11.get(field10("poiSizeRank")), 17);
9882
+ const featured = expr11.all(expr11.lte(filterRank, 0), expr11.lt(sizeRank, 5));
9883
+ const featuredDetail = expr11.all(expr11.lte(filterRank, 1), expr11.lt(sizeRank, 13));
9884
+ return {
9885
+ icon: {
9886
+ image: streetsPoiImage(),
9887
+ // Keep the authored 24px cell at native scale. Fractional resizing
9888
+ // softens the small pictogram strokes even with a correct 2x atlas.
9889
+ // The SVG itself fits the Maki artwork into a centered 12px box.
9890
+ size: 1
9891
+ },
9892
+ text: {
9893
+ font: streetsVisual.font.default,
9894
+ haloWidth: 1,
9895
+ haloBlur: 0,
9896
+ letterSpacing: 0.01,
9897
+ lineHeight: 1.2,
9898
+ maxWidth: 9,
9899
+ anchor: "top",
9900
+ offset: [0, 0.8],
9901
+ padding: zoom10.linear([
9902
+ [16, 6],
9903
+ [17, 4]
9904
+ ]),
9905
+ size: category === "transport" ? 13 : expr11.step(expr11.zoom(), expr11.case([{ when: featured, value: 18 }], 13), [
9906
+ [17, expr11.case([{ when: featuredDetail, value: 18 }], 13)]
9907
+ ])
9908
+ }
9909
+ };
9910
+ }
9185
9911
  var mapboxBuildingPalette = {
9186
9912
  fill: streetsVisual.building.fill,
9187
9913
  outline: streetsVisual.building.outline
@@ -9210,7 +9936,7 @@ function cityRoadColorStops(minZoom, cityColor, detailedColor) {
9210
9936
  function cityRoadCasingColorStops(minZoom) {
9211
9937
  return cityRoadColorStops(minZoom, streetsDetailPalette.roadCasing, mapboxRoadPalette.roadCasing);
9212
9938
  }
9213
- var roadBorderZoom = 6;
9939
+ var roadBorderZoom = 15;
9214
9940
  var roadBorderTotalWidth = 1;
9215
9941
  var roadWidthInterpolationBase = 1.5;
9216
9942
  var roadSurfaceColor = mapboxRoadPalette.road;
@@ -9230,94 +9956,78 @@ var visibleBuilding3dSelector = {
9230
9956
  { field: "hide3d", kind: "compare", operator: "ne", value: "1" }
9231
9957
  ]
9232
9958
  };
9233
- var building3dHeight = expr9.max(
9959
+ var groundedBuilding3dSelector = {
9960
+ kind: "all",
9961
+ selectors: [
9962
+ visibleBuilding3dSelector,
9963
+ {
9964
+ field: "renderMinHeight",
9965
+ coerce: "number",
9966
+ fallback: 0,
9967
+ kind: "compare",
9968
+ operator: "lte",
9969
+ value: 0
9970
+ },
9971
+ {
9972
+ kind: "any",
9973
+ selectors: [
9974
+ { kind: "not", selector: { kind: "has", field: "renderHeight" } },
9975
+ {
9976
+ field: "renderHeight",
9977
+ coerce: "number",
9978
+ fallback: 5,
9979
+ kind: "compare",
9980
+ operator: "gt",
9981
+ value: 0
9982
+ }
9983
+ ]
9984
+ }
9985
+ ]
9986
+ };
9987
+ var building3dHeight = expr11.max(
9234
9988
  0,
9235
- expr9.toNumber(expr9.coalesce(expr9.get(field8("renderHeight")), 5), 5)
9989
+ expr11.toNumber(expr11.coalesce(expr11.get(field10("renderHeight")), 5), 5)
9236
9990
  );
9237
- var building3dBase = expr9.max(
9991
+ var building3dBase = expr11.max(
9238
9992
  0,
9239
- expr9.min(
9240
- expr9.toNumber(expr9.coalesce(expr9.get(field8("renderMinHeight")), 0), 0),
9993
+ expr11.min(
9994
+ expr11.toNumber(expr11.coalesce(expr11.get(field10("renderMinHeight")), 0), 0),
9241
9995
  building3dHeight
9242
9996
  )
9243
9997
  );
9244
- var circularRoadRadiusAtZ15 = expr9.toNumber(expr9.get(field8("circularRadiusAtZoom15")), 0);
9245
- var circularRoadRadiusMetres = expr9.toNumber(expr9.get(field8("circularRadiusMeters")), 0);
9246
- var circularRoadOuterRadiusMetres = expr9.toNumber(
9247
- expr9.get(field8("circularOuterRadiusMeters")),
9998
+ var circularRoadRadiusAtZ15 = expr11.toNumber(expr11.get(field10("circularRadiusAtZoom15")), 0);
9999
+ var circularRoadRadiusMetres = expr11.toNumber(expr11.get(field10("circularRadiusMeters")), 0);
10000
+ var circularRoadOuterRadiusMetres = expr11.toNumber(
10001
+ expr11.get(field10("circularOuterRadiusMeters")),
9248
10002
  0
9249
10003
  );
9250
- var circularRoadInnerRadiusMetres = expr9.toNumber(
9251
- expr9.get(field8("circularInnerRadiusMeters")),
10004
+ var circularRoadInnerRadiusMetres = expr11.toNumber(
10005
+ expr11.get(field10("circularInnerRadiusMeters")),
9252
10006
  0
9253
10007
  );
9254
- var roadNeedsStructuralButtCap = expr9.any(
9255
- expr9.eq(expr9.get(field8("brunnel")), "tunnel"),
9256
- expr9.eq(expr9.get(field8("class")), "steps"),
9257
- expr9.eq(expr9.get(field8("subclass")), "steps")
9258
- );
9259
- var roadNeedsControlledSurfaceButtCap = expr9.all(
9260
- expr9.match(
9261
- expr9.get(field8("brunnel")),
9262
- [{ labels: ["tunnel", "bridge"], value: false }],
9263
- true
9264
- ),
9265
- expr9.eq(expr9.get(field8("foot")), "no"),
9266
- expr9.match(
9267
- expr9.get(field8("class")),
9268
- [
9269
- {
9270
- labels: [
9271
- "motorway",
9272
- "trunk",
9273
- "primary",
9274
- "motorway_construction",
9275
- "trunk_construction",
9276
- "primary_construction"
9277
- ],
9278
- value: true
9279
- }
9280
- ],
9281
- false
9282
- )
9283
- );
9284
- var roadLineCap = expr9.step(
9285
- expr9.zoom(),
9286
- expr9.case([{ when: roadNeedsStructuralButtCap, value: "butt" }], "round"),
9287
- [
9288
- [
9289
- 17,
9290
- expr9.case(
9291
- [
9292
- {
9293
- when: expr9.any(roadNeedsStructuralButtCap, roadNeedsControlledSurfaceButtCap),
9294
- value: "butt"
9295
- }
9296
- ],
9297
- "round"
9298
- )
9299
- ]
9300
- ]
9301
- );
9302
- var roadLineJoin = zoom9.step([
10008
+ var roadLineCap = zoom10.step([
10009
+ [3, "butt"],
10010
+ [14, "round"]
10011
+ ]);
10012
+ var roadLineJoin = zoom10.step([
9303
10013
  [3, "miter"],
9304
10014
  [14, "round"]
9305
10015
  ]);
9306
- var pathLineCap = zoom9.step([
10016
+ var pathLineCap = zoom10.step([
9307
10017
  [12, "butt"],
9308
10018
  [16, "round"]
9309
10019
  ]);
9310
- var pathLineJoin = zoom9.step([
10020
+ var pathLineJoin = zoom10.step([
9311
10021
  [12, "miter"],
9312
10022
  [16, "round"]
9313
10023
  ]);
9314
- var hasPhysicalCircularRadii = expr9.all(
9315
- expr9.gt(circularRoadRadiusMetres, 0),
9316
- expr9.gt(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
9317
- expr9.gte(circularRoadInnerRadiusMetres, 0)
10024
+ var hasPhysicalCircularRadii = expr11.all(
10025
+ expr11.gt(circularRoadRadiusMetres, 0),
10026
+ expr11.gt(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
10027
+ expr11.gte(circularRoadInnerRadiusMetres, 0)
9318
10028
  );
9319
- var circularRoadBaseWidth = expr9.match(
9320
- expr9.coalesce(expr9.get(field8("class")), "minor"),
10029
+ var circularRoadBaseWidth = expr11.match(
10030
+ expr11.coalesce(expr11.get(field10("class")), "minor"),
9321
10031
  [
9322
10032
  { labels: "motorway", value: 6 },
9323
10033
  { labels: "trunk", value: 5.5 },
@@ -9333,39 +10043,39 @@ var circularRoadRadius = circularRoadInnerRadius(false);
9333
10043
  var circularRoadCasingRadius = circularRoadInnerRadius(true);
9334
10044
  var circularRoadWidth = circularRoadStrokeWidth(false);
9335
10045
  var circularRoadCasingWidth = circularRoadStrokeWidth(true);
9336
- var expresswayWidthScale = 1.06;
10046
+ var expresswayWidthScale = 1;
9337
10047
  var tunnelBorderDash = [3, 3];
9338
10048
  var tunnelBorderWidth = 1;
9339
- function circularRoadLegacyScale(level) {
10049
+ function circularRoadFallbackScale(level) {
9340
10050
  const interpolationBase = 1.35;
9341
10051
  const progress = (interpolationBase ** (level - 15) - 1) / (interpolationBase ** (22 - 15) - 1);
9342
10052
  return 1 + progress * 1.2;
9343
10053
  }
9344
10054
  function circularRoadWidthAtLevel(level) {
9345
- const scale = circularRoadLegacyScale(level);
9346
- return level === 15 ? circularRoadBaseWidth : expr9.multiply(circularRoadBaseWidth, scale);
10055
+ const scale = circularRoadFallbackScale(level);
10056
+ return level === 15 ? circularRoadBaseWidth : expr11.multiply(circularRoadBaseWidth, scale);
9347
10057
  }
9348
10058
  function circularRoadCenterlineRadiusAtLevel(level) {
9349
- return level === 15 ? circularRoadRadiusAtZ15 : expr9.multiply(circularRoadRadiusAtZ15, 2 ** (level - 15));
10059
+ return level === 15 ? circularRoadRadiusAtZ15 : expr11.multiply(circularRoadRadiusAtZ15, 2 ** (level - 15));
9350
10060
  }
9351
10061
  function circularRoadInnerRadiusAtLevel(level, casing) {
9352
10062
  const centerlineRadius = circularRoadCenterlineRadiusAtLevel(level);
9353
- const physicalInnerRadius = expr9.multiply(
10063
+ const physicalInnerRadius = expr11.multiply(
9354
10064
  centerlineRadius,
9355
- expr9.divide(circularRoadInnerRadiusMetres, circularRoadRadiusMetres)
10065
+ expr11.divide(circularRoadInnerRadiusMetres, circularRoadRadiusMetres)
9356
10066
  );
9357
- const fallbackInnerRadius = expr9.subtract(
10067
+ const fallbackInnerRadius = expr11.subtract(
9358
10068
  centerlineRadius,
9359
- expr9.divide(circularRoadWidthAtLevel(level), 2)
10069
+ expr11.divide(circularRoadWidthAtLevel(level), 2)
9360
10070
  );
9361
- const innerRadius = expr9.case(
10071
+ const innerRadius = expr11.case(
9362
10072
  [{ when: hasPhysicalCircularRadii, value: physicalInnerRadius }],
9363
10073
  fallbackInnerRadius
9364
10074
  );
9365
- return expr9.max(0, casing ? expr9.subtract(innerRadius, roadBorderTotalWidth / 2) : innerRadius);
10075
+ return expr11.max(0, casing ? expr11.subtract(innerRadius, roadBorderTotalWidth / 2) : innerRadius);
9366
10076
  }
9367
10077
  function circularRoadInnerRadius(casing) {
9368
- return expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10078
+ return expr11.interpolate({ kind: "exponential", base: 2 }, expr11.zoom(), [
9369
10079
  [15, circularRoadInnerRadiusAtLevel(15, casing)],
9370
10080
  [16, circularRoadInnerRadiusAtLevel(16, casing)],
9371
10081
  [17, circularRoadInnerRadiusAtLevel(17, casing)],
@@ -9373,28 +10083,30 @@ function circularRoadInnerRadius(casing) {
9373
10083
  [19, circularRoadInnerRadiusAtLevel(19, casing)],
9374
10084
  [20, circularRoadInnerRadiusAtLevel(20, casing)],
9375
10085
  [21, circularRoadInnerRadiusAtLevel(21, casing)],
9376
- [22, circularRoadInnerRadiusAtLevel(22, casing)]
10086
+ [22, circularRoadInnerRadiusAtLevel(22, casing)],
10087
+ [23, circularRoadInnerRadiusAtLevel(23, casing)],
10088
+ [24, circularRoadInnerRadiusAtLevel(24, casing)]
9377
10089
  ]);
9378
10090
  }
9379
10091
  function circularRoadStrokeWidthAtLevel(level, casing) {
9380
10092
  const fallbackWidth = circularRoadWidthAtLevel(level);
9381
10093
  const centerlineRadius = circularRoadCenterlineRadiusAtLevel(level);
9382
- const physicalWidth = expr9.multiply(
10094
+ const physicalWidth = expr11.multiply(
9383
10095
  centerlineRadius,
9384
- expr9.divide(
9385
- expr9.subtract(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
10096
+ expr11.divide(
10097
+ expr11.subtract(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
9386
10098
  circularRoadRadiusMetres
9387
10099
  )
9388
10100
  );
9389
- const physicalOutput = casing ? expr9.add(physicalWidth, roadBorderTotalWidth) : physicalWidth;
9390
- const fallbackOutput = casing ? expr9.add(fallbackWidth, roadBorderTotalWidth) : fallbackWidth;
9391
- return expr9.case(
10101
+ const physicalOutput = casing ? expr11.add(physicalWidth, roadBorderTotalWidth) : physicalWidth;
10102
+ const fallbackOutput = casing ? expr11.add(fallbackWidth, roadBorderTotalWidth) : fallbackWidth;
10103
+ return expr11.case(
9392
10104
  [{ when: hasPhysicalCircularRadii, value: physicalOutput }],
9393
10105
  fallbackOutput
9394
10106
  );
9395
10107
  }
9396
10108
  function circularRoadStrokeWidth(casing) {
9397
- return expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10109
+ return expr11.interpolate({ kind: "exponential", base: 2 }, expr11.zoom(), [
9398
10110
  [15, circularRoadStrokeWidthAtLevel(15, casing)],
9399
10111
  [16, circularRoadStrokeWidthAtLevel(16, casing)],
9400
10112
  [17, circularRoadStrokeWidthAtLevel(17, casing)],
@@ -9402,20 +10114,22 @@ function circularRoadStrokeWidth(casing) {
9402
10114
  [19, circularRoadStrokeWidthAtLevel(19, casing)],
9403
10115
  [20, circularRoadStrokeWidthAtLevel(20, casing)],
9404
10116
  [21, circularRoadStrokeWidthAtLevel(21, casing)],
9405
- [22, circularRoadStrokeWidthAtLevel(22, casing)]
10117
+ [22, circularRoadStrokeWidthAtLevel(22, casing)],
10118
+ [23, circularRoadStrokeWidthAtLevel(23, casing)],
10119
+ [24, circularRoadStrokeWidthAtLevel(24, casing)]
9406
10120
  ]);
9407
10121
  }
9408
10122
  function roadWidth(widths, oneWayScale, rampWidths) {
9409
10123
  const augmentedWidths = [...widths].sort(([left], [right]) => left - right);
9410
10124
  const widthOutput = (level, width) => {
9411
- const ordinaryWidth = oneWayScale === 1 ? width : expr9.match(
9412
- expr9.get(field8("oneway")),
10125
+ const ordinaryWidth = oneWayScale === 1 ? width : expr11.match(
10126
+ expr11.get(field10("oneway")),
9413
10127
  [{ labels: [1, -1], value: width * oneWayScale }],
9414
10128
  width
9415
10129
  );
9416
10130
  const rampWidth = rampWidths?.find(([rampLevel]) => rampLevel === level)?.[1];
9417
- const surfaceWidth = rampWidth === void 0 ? ordinaryWidth : expr9.case(
9418
- [{ when: expr9.eq(expr9.get(field8("ramp")), 1), value: rampWidth }],
10131
+ const surfaceWidth = rampWidth === void 0 ? ordinaryWidth : expr11.case(
10132
+ [{ when: expr11.eq(expr11.get(field10("ramp")), 1), value: rampWidth }],
9419
10133
  ordinaryWidth
9420
10134
  );
9421
10135
  return surfaceWidth;
@@ -9425,35 +10139,26 @@ function roadWidth(widths, oneWayScale, rampWidths) {
9425
10139
  );
9426
10140
  const firstWidthStop = widthStops[0];
9427
10141
  if (firstWidthStop === void 0) throw new Error("Road widths require at least one zoom stop.");
9428
- return expr9.interpolate({ base: roadWidthInterpolationBase, kind: "exponential" }, expr9.zoom(), [
10142
+ return expr11.interpolate({ base: roadWidthInterpolationBase, kind: "exponential" }, expr11.zoom(), [
9429
10143
  firstWidthStop,
9430
10144
  ...widthStops.slice(1)
9431
10145
  ]);
9432
10146
  }
9433
- function roadCasingStrokeWidth() {
9434
- return zoom9.linear([
9435
- // Keep the visible border below one physical pixel at ordinary city
9436
- // zooms. A full 1 px stroke per side can cover a second pixel column on
9437
- // curved or fractionally positioned lines and make one edge look doubled.
9438
- [6, 0.4],
9439
- [12, 0.55],
9440
- [15, 0.75],
9441
- [18, 1],
9442
- [22, 1.5]
10147
+ function roadCasingWidth(major) {
10148
+ return expr11.interpolate({ kind: "exponential", base: 1.5 }, expr11.zoom(), [
10149
+ [
10150
+ 14,
10151
+ major ? expr11.case([{ when: expr11.eq(expr11.get(field10("ramp")), 1), value: 0.8 }], 1) : 0.8
10152
+ ],
10153
+ [22, 2]
9443
10154
  ]);
9444
10155
  }
9445
- var tunnelRoadCasingWidth = zoom9.linear([
9446
- [15, 0],
9447
- [15.5, tunnelBorderWidth],
9448
- [22, tunnelBorderWidth]
9449
- ]);
9450
- var pathCasingStrokeWidth = zoom9.exponential(1.5, [
9451
- [15, 0],
9452
- [15.5, 0.5],
10156
+ var pathCasingStrokeWidth = zoom10.exponential(1.5, [
10157
+ [14, 0.5],
9453
10158
  [18, 1],
9454
10159
  [22, 2]
9455
10160
  ]);
9456
- var pathTunnelCasingWidth = zoom9.linear([
10161
+ var pathTunnelCasingWidth = zoom10.linear([
9457
10162
  [15, 0],
9458
10163
  [15.5, tunnelBorderWidth],
9459
10164
  [22, tunnelBorderWidth]
@@ -9463,62 +10168,15 @@ var mapboxPathWidthStops = [
9463
10168
  [18, 6],
9464
10169
  [22, 80]
9465
10170
  ];
9466
- var googleParkPathWidthStops = [
9467
- [12, 0],
9468
- [15, 0.75],
9469
- [16, 1],
9470
- [18, 2],
9471
- [22, 20]
9472
- ];
9473
- var unpavedPathCondition = expr9.eq(expr9.get(field8("surface")), "unpaved");
9474
- var contextualPathLineWidth = expr9.interpolate(
9475
- { base: 1.5, kind: "exponential" },
9476
- expr9.zoom(),
9477
- [
9478
- [12, expr9.case([{ when: unpavedPathCondition, value: 0 }], 0)],
9479
- [15, expr9.case([{ when: unpavedPathCondition, value: 0.75 }], 1)],
9480
- [16, expr9.case([{ when: unpavedPathCondition, value: 1 }], 1.5)],
9481
- [17, expr9.case([{ when: unpavedPathCondition, value: 1.4 }], 3)],
9482
- [18, expr9.case([{ when: unpavedPathCondition, value: 2 }], 6)],
9483
- [19, expr9.case([{ when: unpavedPathCondition, value: 3.7 }], 12)],
9484
- [20, expr9.case([{ when: unpavedPathCondition, value: 7.5 }], 22)],
9485
- [22, expr9.case([{ when: unpavedPathCondition, value: 20 }], 60)]
9486
- ]
9487
- );
9488
- var contextualPathColor = expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
9489
- [
9490
- 15,
9491
- expr9.case(
9492
- [{ when: unpavedPathCondition, value: streetsDetailPalette.parkPath }],
9493
- mapboxRoadPalette.pathAtZ15
9494
- )
9495
- ],
9496
- [
9497
- 16,
9498
- expr9.case(
9499
- [{ when: unpavedPathCondition, value: streetsDetailPalette.parkPath }],
9500
- mapboxRoadPalette.pathFromZ16
9501
- )
9502
- ]
10171
+ var contextualPathLineWidth = zoom10.exponential(1.5, mapboxPathWidthStops);
10172
+ var contextualPathColor = expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
10173
+ [15, mapboxRoadPalette.pathAtZ15],
10174
+ [16, mapboxRoadPalette.pathFromZ16]
9503
10175
  ]);
9504
- var contextualPathCasingColor = expr9.case(
9505
- [{ when: unpavedPathCondition, value: streetsDetailPalette.parkPath }],
9506
- mapboxRoadPalette.pathCasing
9507
- );
9508
- var contextualPathCasingWidth = expr9.interpolate(
9509
- { base: 1.5, kind: "exponential" },
9510
- expr9.zoom(),
9511
- [
9512
- [15, expr9.case([{ when: unpavedPathCondition, value: 0 }], 0)],
9513
- [15.5, expr9.case([{ when: unpavedPathCondition, value: 0 }], 0.5)],
9514
- [18, expr9.case([{ when: unpavedPathCondition, value: 0 }], 1)],
9515
- [22, expr9.case([{ when: unpavedPathCondition, value: 0 }], 2)]
9516
- ]
9517
- );
9518
- var googleParkPathClasses = ["pathway", "footway", "steps", "pedestrian"];
9519
- function googleParkPathRefinements() {
10176
+ var parkPathClasses = ["pathway", "footway", "steps", "pedestrian"];
10177
+ function parkPathRefinements() {
9520
10178
  return Object.fromEntries(
9521
- googleParkPathClasses.flatMap(
10179
+ parkPathClasses.flatMap(
9522
10180
  (roadClass) => ["surface", "bridge"].flatMap((structure) => [
9523
10181
  [
9524
10182
  `${roadClass}-${structure}-fill`,
@@ -9526,6 +10184,7 @@ function googleParkPathRefinements() {
9526
10184
  renderer: "line",
9527
10185
  style: {
9528
10186
  color: roadClass === "steps" ? mapboxRoadPalette.pathFromZ16 : contextualPathColor,
10187
+ minZoom: roadClass === "steps" ? 14 : structure === "surface" ? 12 : roadClass === "pedestrian" ? 13 : 14,
9529
10188
  ...roadClass === "steps" ? { dash: [0.18, 0.15] } : {},
9530
10189
  width: contextualPathLineWidth
9531
10190
  },
@@ -9537,9 +10196,10 @@ function googleParkPathRefinements() {
9537
10196
  refineRenderTarget3({
9538
10197
  renderer: "line",
9539
10198
  style: {
9540
- color: contextualPathCasingColor,
10199
+ color: mapboxRoadPalette.pathCasing,
10200
+ minZoom: roadClass === "steps" || roadClass === "pedestrian" && structure === "surface" ? 14 : 15,
9541
10201
  gapWidth: roadClass === "steps" ? 0 : contextualPathLineWidth,
9542
- width: roadClass === "steps" ? contextualPathLineWidth : contextualPathCasingWidth
10202
+ width: roadClass === "steps" ? contextualPathLineWidth : pathCasingStrokeWidth
9543
10203
  },
9544
10204
  target: `roads.classes.${roadClass}.${structure}.casing`
9545
10205
  })
@@ -9589,7 +10249,7 @@ var namedCitySelector = {
9589
10249
  };
9590
10250
  function streetsBoundaryRenderStack() {
9591
10251
  return {
9592
- admin2Background: renderPass8({
10252
+ admin2Background: renderPass9({
9593
10253
  placement: { below: "boundaries.admin4" },
9594
10254
  feature: "boundary",
9595
10255
  renderer: "line",
@@ -9615,23 +10275,23 @@ function streetsBoundaryRenderStack() {
9615
10275
  ]
9616
10276
  },
9617
10277
  style: {
9618
- blur: zoom9.linear([
10278
+ blur: zoom10.linear([
9619
10279
  [3, 0],
9620
10280
  [12, 2]
9621
10281
  ]),
9622
10282
  color: streetsVisual.boundary.halo,
9623
10283
  minZoom: 1,
9624
- opacity: zoom9.linear([
10284
+ opacity: zoom10.linear([
9625
10285
  [3, 0],
9626
10286
  [4, 0.5]
9627
10287
  ]),
9628
- width: zoom9.linear([
10288
+ width: zoom10.linear([
9629
10289
  [3, 4],
9630
10290
  [12, 8]
9631
10291
  ])
9632
10292
  }
9633
10293
  }),
9634
- admin4Background: renderPass8({
10294
+ admin4Background: renderPass9({
9635
10295
  placement: { below: "boundaries.admin4" },
9636
10296
  feature: "boundary",
9637
10297
  renderer: "line",
@@ -9657,17 +10317,17 @@ function streetsBoundaryRenderStack() {
9657
10317
  ]
9658
10318
  },
9659
10319
  style: {
9660
- blur: zoom9.linear([
10320
+ blur: zoom10.linear([
9661
10321
  [3, 0],
9662
10322
  [12, 1]
9663
10323
  ]),
9664
10324
  color: streetsVisual.boundary.halo,
9665
10325
  minZoom: 2,
9666
- opacity: zoom9.linear([
10326
+ opacity: zoom10.linear([
9667
10327
  [2, 0],
9668
10328
  [4, 0.42]
9669
10329
  ]),
9670
- width: zoom9.linear([
10330
+ width: zoom10.linear([
9671
10331
  [3, 2.4],
9672
10332
  [6, 3.1],
9673
10333
  [12, 4.2]
@@ -9678,7 +10338,7 @@ function streetsBoundaryRenderStack() {
9678
10338
  // module deliberately exposes only the stable admin-2/admin-4 pair.
9679
10339
  // Standard uses the next tier as a restrained dotted municipal cue from
9680
10340
  // metro zooms onward, so Streets adds it as an explicit semantic pass.
9681
- admin6: renderPass8({
10341
+ admin6: renderPass9({
9682
10342
  placement: { above: "boundaries.admin4" },
9683
10343
  feature: "boundary",
9684
10344
  renderer: "line",
@@ -9707,12 +10367,12 @@ function streetsBoundaryRenderStack() {
9707
10367
  color: streetsVisual.boundary.regional,
9708
10368
  dash: [1, 1.5],
9709
10369
  minZoom: 8,
9710
- opacity: zoom9.linear([
10370
+ opacity: zoom10.linear([
9711
10371
  [8, 0],
9712
10372
  [9, 0.5],
9713
10373
  [12, 0.68]
9714
10374
  ]),
9715
- width: zoom9.linear([
10375
+ width: zoom10.linear([
9716
10376
  [8, 0.45],
9717
10377
  [10, 0.7],
9718
10378
  [12, 0.95]
@@ -9723,7 +10383,27 @@ function streetsBoundaryRenderStack() {
9723
10383
  }
9724
10384
  function streetsLandRenderStack() {
9725
10385
  return {
9726
- businessArea: renderPass8({
10386
+ // A park polygon is the base surface. Explicit lawns and meadows inside
10387
+ // it must remain visible instead of being painted over by the park fill.
10388
+ grassDetail: refineRenderTarget3({
10389
+ placement: { above: "land.landuse.recreation.fill" },
10390
+ target: "land.landcover.grass.fill"
10391
+ }),
10392
+ meadowDetail: refineRenderTarget3({
10393
+ placement: { above: "land.landcover.grass.fill" },
10394
+ target: "land.landcover.meadow.fill"
10395
+ }),
10396
+ // Mapped parking surfaces cut through broad park/forest polygons. They
10397
+ // remain below the road network and only fill areas present in the tiles.
10398
+ parkingSurface: refineRenderTarget3({
10399
+ placement: "above-land",
10400
+ target: "land.landuse.parking.fill"
10401
+ }),
10402
+ parkingOutline: refineRenderTarget3({
10403
+ placement: { above: "land.landuse.parking.fill" },
10404
+ target: "land.landuse.parking.outline"
10405
+ }),
10406
+ businessArea: renderPass9({
9727
10407
  placement: { above: "land.landuse.residential.fill" },
9728
10408
  feature: "landuse",
9729
10409
  renderer: "fill",
@@ -9741,7 +10421,7 @@ function streetsBuildingRenderStack() {
9741
10421
  // Keep just enough ambient separation for dense footprint clusters. The
9742
10422
  // fill and its close-colour outline carry the 2D building hierarchy; a
9743
10423
  // dark shadow at z15 would turn every footprint into a heavy sticker.
9744
- flatShadow: renderPass8({
10424
+ flatShadow: renderPass9({
9745
10425
  placement: { below: "buildings.flat.fill" },
9746
10426
  feature: "building",
9747
10427
  renderer: "line",
@@ -9749,7 +10429,7 @@ function streetsBuildingRenderStack() {
9749
10429
  blur: 2,
9750
10430
  color: buildingShadowColor,
9751
10431
  minZoom: 15.5,
9752
- opacity: zoom9.linear([
10432
+ opacity: zoom10.linear([
9753
10433
  [15.5, 0],
9754
10434
  [16, 0.03],
9755
10435
  [18, 0.08],
@@ -9757,7 +10437,7 @@ function streetsBuildingRenderStack() {
9757
10437
  ]),
9758
10438
  translate: [0.5, 0.75],
9759
10439
  translateAnchor: "viewport",
9760
- width: zoom9.linear([
10440
+ width: zoom10.linear([
9761
10441
  [15.5, 0.5],
9762
10442
  [16, 1],
9763
10443
  [18, 3],
@@ -9765,38 +10445,69 @@ function streetsBuildingRenderStack() {
9765
10445
  ])
9766
10446
  }
9767
10447
  }),
9768
- shadowSoft: renderPass8({
10448
+ shadowSoft: renderPass9({
9769
10449
  placement: { below: "buildings.flat.fill" },
9770
10450
  feature: "building",
9771
10451
  renderer: "line",
9772
- selector: visibleBuilding3dSelector,
10452
+ selector: groundedBuilding3dSelector,
9773
10453
  style: {
9774
- blur: 7,
9775
- color: buildingShadowColor,
9776
- minZoom: 16,
9777
- opacity: 0.12,
9778
- translate: [3, 5],
9779
- translateAnchor: "viewport",
10454
+ // A diffuse contact band, not a displaced footprint. It stays attached
10455
+ // to the walls when the camera rotates and fades in at street detail.
10456
+ blur: zoom10.linear([
10457
+ [15.5, 2],
10458
+ [18, 6],
10459
+ [20, 10]
10460
+ ]),
10461
+ cap: "round",
10462
+ color: streetsVisual.building.contactShadow,
10463
+ join: "round",
10464
+ minZoom: 15.5,
10465
+ opacity: zoom10.linear([
10466
+ [15.5, 0],
10467
+ [16.5, 0.12],
10468
+ [18, 0.22],
10469
+ [20, 0.24]
10470
+ ]),
9780
10471
  visibilityGroup: "building",
9781
- width: 9
10472
+ width: zoom10.linear([
10473
+ [15.5, 1],
10474
+ [16.5, 4],
10475
+ [18, 10],
10476
+ [20, 18]
10477
+ ])
9782
10478
  }
9783
10479
  }),
9784
- shadowCore: renderPass8({
10480
+ shadowCore: renderPass9({
9785
10481
  placement: { below: "buildings.flat.fill" },
9786
10482
  feature: "building",
9787
- renderer: "fill",
9788
- selector: visibleBuilding3dSelector,
10483
+ renderer: "line",
10484
+ selector: groundedBuilding3dSelector,
9789
10485
  style: {
9790
- antialias: true,
9791
- color: buildingShadowColor,
9792
- minZoom: 16,
9793
- opacity: 0.1,
9794
- translate: [2, 4],
9795
- translateAnchor: "viewport",
9796
- visibilityGroup: "building"
10486
+ blur: zoom10.linear([
10487
+ [15.5, 0.5],
10488
+ [18, 1.5],
10489
+ [20, 2.5]
10490
+ ]),
10491
+ cap: "round",
10492
+ color: streetsVisual.building.contactShadow,
10493
+ join: "round",
10494
+ minZoom: 15.5,
10495
+ opacity: zoom10.linear([
10496
+ [15.5, 0],
10497
+ [16.5, 0.08],
10498
+ [18, 0.16],
10499
+ [20, 0.18]
10500
+ ]),
10501
+ visibilityGroup: "building",
10502
+ width: zoom10.linear([
10503
+ [15.5, 0.5],
10504
+ [16.5, 1],
10505
+ [18, 2.5],
10506
+ [20, 4]
10507
+ ])
9797
10508
  }
9798
10509
  }),
9799
- extrusion: renderPass8({
10510
+ extrusion: renderPass9({
9800
10511
  placement: { above: "buildings.flat.outline" },
9801
10512
  feature: "building",
9802
10513
  renderer: "extrusion",
@@ -9815,7 +10526,89 @@ function streetsBuildingRenderStack() {
9815
10526
  }
9816
10527
  function streetsLabelRenderStack() {
9817
10528
  return {
9818
- settlementMarker: renderPass8({
10529
+ // Ground passes belong to Streets' label design. They do not depend on the
10530
+ // optional class targets emitted by a replacement roads module. Keep the
10531
+ // structural roads last within this group so they win road-name collisions.
10532
+ streetPedestrian: streetNamePass(
10533
+ "pedestrian",
10534
+ 12,
10535
+ ["path", "path_construction"],
10536
+ ["pedestrian"]
10537
+ ),
10538
+ streetPaths: streetNamePass(
10539
+ "path",
10540
+ 15,
10541
+ ["path", "path_construction"],
10542
+ ["path", "bridleway", "corridor", "footway", "cycleway", "steps"]
10543
+ ),
10544
+ streetService: streetNamePass("service", 15, [
10545
+ "service",
10546
+ "busway",
10547
+ "bus_guideway",
10548
+ "service_construction"
10549
+ ]),
10550
+ streetMinor: streetNamePass("street", 13, [
10551
+ "minor",
10552
+ "residential",
10553
+ "unclassified",
10554
+ "minor_construction"
10555
+ ]),
10556
+ streetTertiary: streetNamePass("major", 13, ["tertiary", "tertiary_construction"]),
10557
+ streetArterial: streetNamePass("major", 12, [
10558
+ "primary",
10559
+ "primary_construction",
10560
+ "secondary",
10561
+ "secondary_construction"
10562
+ ]),
10563
+ streetHighway: streetNamePass("major", 10, [
10564
+ "motorway",
10565
+ "motorway_construction",
10566
+ "trunk",
10567
+ "trunk_construction"
10568
+ ]),
10569
+ ferry: renderPass9({
10570
+ feature: "roadName",
10571
+ placement: "below-labels",
10572
+ renderer: "symbol",
10573
+ selector: {
10574
+ kind: "all",
10575
+ selectors: [
10576
+ { field: "name", kind: "has" },
10577
+ { field: "name", kind: "compare", operator: "ne", value: "" },
10578
+ {
10579
+ kind: "any",
10580
+ selectors: [
10581
+ { field: "class", kind: "compare", operator: "eq", value: "ferry" },
10582
+ { field: "subclass", kind: "compare", operator: "eq", value: "ferry" }
10583
+ ]
10584
+ }
10585
+ ]
10586
+ },
10587
+ style: {
10588
+ minZoom: 15,
10589
+ placement: "line",
10590
+ spacing: 250,
10591
+ text: {
10592
+ field: expr11.get(field10("name")),
10593
+ font: streetsVisual.font.default,
10594
+ color: streetsVisual.label.ferry,
10595
+ haloColor: streetsVisual.label.ferryHalo,
10596
+ haloWidth: 1,
10597
+ haloBlur: 1,
10598
+ letterSpacing: 0.01,
10599
+ maxAngle: 30,
10600
+ padding: 1,
10601
+ pitchAlignment: "viewport",
10602
+ rotationAlignment: "map",
10603
+ size: zoom10.linear([
10604
+ [10, 6.5],
10605
+ [18, 13]
10606
+ ]),
10607
+ transform: "uppercase"
10608
+ }
10609
+ }
10610
+ }),
10611
+ settlementMarker: renderPass9({
9819
10612
  placement: { below: "labels.places.city" },
9820
10613
  feature: "place",
9821
10614
  renderer: "circle",
@@ -9824,7 +10617,7 @@ function streetsLabelRenderStack() {
9824
10617
  color: streetsVisual.label.settlement,
9825
10618
  maxZoom: 8,
9826
10619
  minZoom: 2,
9827
- radius: expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 3, [
10620
+ radius: expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 3, [
9828
10621
  [3, 2.5],
9829
10622
  [7, 2]
9830
10623
  ]),
@@ -9838,7 +10631,15 @@ function streetsLabelRenderStack() {
9838
10631
  kind: "all",
9839
10632
  selectors: [
9840
10633
  { field: "name", kind: "has" },
9841
- { field: "class", kind: "compare", operator: "eq", value: "country" }
10634
+ { field: "class", kind: "compare", operator: "eq", value: "country" },
10635
+ {
10636
+ fallback: rankAtMost(4),
10637
+ kind: "step",
10638
+ stops: [
10639
+ { selector: rankAtMost(4), zoom: 3 },
10640
+ { selector: { kind: "literal", value: true }, zoom: 5 }
10641
+ ]
10642
+ }
9842
10643
  ]
9843
10644
  },
9844
10645
  style: {},
@@ -9932,8 +10733,11 @@ function streetsLabelRenderStack() {
9932
10733
  fallback: rankAtMost(18),
9933
10734
  kind: "step",
9934
10735
  stops: [
9935
- { selector: rankAtMost(16), zoom: 12 },
9936
- { selector: { kind: "literal", value: true }, zoom: 14 }
10736
+ // World ranks are local to each source zoom: Manhattan, for
10737
+ // example, moves from rank 11 at z12 to 30 at z13. Once city
10738
+ // detail begins, retain the producer's candidates and let
10739
+ // collisions choose which fit instead of hiding them again.
10740
+ { selector: { kind: "literal", value: true }, zoom: 12 }
9937
10741
  ]
9938
10742
  }
9939
10743
  ]
@@ -9943,9 +10747,50 @@ function streetsLabelRenderStack() {
9943
10747
  })
9944
10748
  };
9945
10749
  }
10750
+ function streetsRoadEligibility() {
10751
+ return Object.fromEntries(
10752
+ ["motorway", "trunk", "primary", "secondary", "tertiary"].map((roadClass) => [
10753
+ `${roadClass}-surface-eligibility`,
10754
+ refineRenderTarget3({
10755
+ renderer: "line",
10756
+ selector: {
10757
+ kind: "all",
10758
+ selectors: [
10759
+ { kind: "geometry", geometry: "line" },
10760
+ { kind: "in", field: "class", values: [roadClass, `${roadClass}_construction`] },
10761
+ {
10762
+ kind: "step",
10763
+ fallback: { kind: "literal", value: true },
10764
+ stops: [
10765
+ {
10766
+ zoom: 5,
10767
+ selector: {
10768
+ kind: "all",
10769
+ selectors: [
10770
+ { kind: "compare", field: "brunnel", operator: "ne", value: "tunnel" },
10771
+ { kind: "compare", field: "brunnel", operator: "ne", value: "bridge" }
10772
+ ]
10773
+ }
10774
+ }
10775
+ ]
10776
+ },
10777
+ {
10778
+ kind: "step",
10779
+ fallback: { kind: "compare", field: "ramp", operator: "ne", value: 1 },
10780
+ stops: [{ zoom: 12, selector: { kind: "literal", value: true } }]
10781
+ }
10782
+ ]
10783
+ },
10784
+ style: {},
10785
+ target: `roads.classes.${roadClass}.surface.fill`
10786
+ })
10787
+ ])
10788
+ );
10789
+ }
9946
10790
  function streetsRoadRenderStack() {
9947
10791
  return {
9948
- ...googleParkPathRefinements(),
10792
+ ...parkPathRefinements(),
10793
+ ...streetsRoadEligibility(),
9949
10794
  oneWayMarkers: refineRenderTarget3({
9950
10795
  renderer: "symbol",
9951
10796
  style: {
@@ -9954,27 +10799,27 @@ function streetsRoadRenderStack() {
9954
10799
  ignorePlacement: true,
9955
10800
  image: streetsVisual.image.oneway,
9956
10801
  keepUpright: false,
9957
- opacity: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
9958
- [15, 0],
9959
- [15.5, 0.92],
9960
- [16, 1]
10802
+ opacity: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
10803
+ [16.5, 0],
10804
+ [17, 0.92],
10805
+ [17.5, 1]
9961
10806
  ]),
9962
10807
  padding: 0,
9963
10808
  pitchAlignment: "map",
9964
- rotate: expr9.case(
9965
- [{ when: expr9.eq(expr9.get(field8("oneway")), -1), value: 180 }],
10809
+ rotate: expr11.case(
10810
+ [{ when: expr11.eq(expr11.get(field10("oneway")), -1), value: 180 }],
9966
10811
  0
9967
10812
  ),
9968
10813
  rotationAlignment: "map",
9969
- size: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10814
+ size: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
9970
10815
  [15, 0.38],
9971
10816
  [17, 0.55],
9972
10817
  [19, 0.7],
9973
10818
  [22, 1]
9974
10819
  ])
9975
10820
  },
9976
- minZoom: 15,
9977
- spacing: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10821
+ minZoom: 16.5,
10822
+ spacing: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
9978
10823
  [15, 95],
9979
10824
  [17, 115],
9980
10825
  [19, 150],
@@ -9982,8 +10827,8 @@ function streetsRoadRenderStack() {
9982
10827
  ]),
9983
10828
  text: {
9984
10829
  allowOverlap: true,
9985
- field: expr9.case(
9986
- [{ when: expr9.eq(expr9.get(field8("oneway")), -1), value: "\u2190" }],
10830
+ field: expr11.case(
10831
+ [{ when: expr11.eq(expr11.get(field10("oneway")), -1), value: "\u2190" }],
9987
10832
  "\u2192"
9988
10833
  ),
9989
10834
  ignorePlacement: true,
@@ -9992,7 +10837,7 @@ function streetsRoadRenderStack() {
9992
10837
  padding: 0,
9993
10838
  pitchAlignment: "map",
9994
10839
  rotationAlignment: "map",
9995
- size: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10840
+ size: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
9996
10841
  [15, 11],
9997
10842
  [17, 17],
9998
10843
  [19, 20],
@@ -10029,6 +10874,7 @@ function cityRoadStyle(color, widths, options = {}) {
10029
10874
  casingMinZoom = roadBorderZoom,
10030
10875
  colorStops,
10031
10876
  minZoom,
10877
+ major = false,
10032
10878
  oneWayScale = 1,
10033
10879
  rampWidths,
10034
10880
  tunnelCasingColor = streetsDetailPalette.roadTunnelBorder,
@@ -10036,12 +10882,12 @@ function cityRoadStyle(color, widths, options = {}) {
10036
10882
  tunnelVisible = true
10037
10883
  } = options;
10038
10884
  const zoomRange = minZoom === void 0 ? {} : { minZoom };
10039
- const opacity = zoom9.linear([
10885
+ const opacity = zoom10.linear([
10040
10886
  [3, 0],
10041
10887
  [3.5, 1]
10042
10888
  ]);
10043
- const surfaceColor = colorStops ? zoom9.linear(colorStops) : color;
10044
- const resolvedCasingColor = zoom9.linear(roadCasingColorStops(casingColorStops));
10889
+ const surfaceColor = colorStops ? zoom10.linear(colorStops) : color;
10890
+ const resolvedCasingColor = zoom10.linear(roadCasingColorStops(casingColorStops));
10045
10891
  const fill = {
10046
10892
  ...zoomRange,
10047
10893
  cap: roadLineCap,
@@ -10058,29 +10904,36 @@ function cityRoadStyle(color, widths, options = {}) {
10058
10904
  cap: roadLineCap,
10059
10905
  // Border reads as a subtle shade of the road itself rather than a white halo.
10060
10906
  color: resolvedCasingColor,
10061
- gapWidth: fill.width,
10907
+ gapWidth: roadWidth(widths, oneWayScale, rampWidths),
10062
10908
  join: roadLineJoin,
10063
10909
  opacity,
10064
- width: roadCasingStrokeWidth()
10910
+ width: roadCasingWidth(major)
10065
10911
  };
10066
10912
  return {
10067
10913
  surface: { casing, fill },
10068
- bridge: { casing, fill },
10914
+ bridge: {
10915
+ casing: { ...casing, cap: "butt", join: "miter", width: roadCasingWidth((minZoom ?? 0) < 12) },
10916
+ fill: { ...fill, cap: "round", join: "miter", minZoom: Math.max(minZoom ?? 0, 13) }
10917
+ },
10069
10918
  tunnel: tunnelVisible ? {
10070
10919
  casing: {
10071
10920
  ...casing,
10072
- cap: roadLineCap,
10921
+ cap: "butt",
10922
+ join: "miter",
10923
+ minZoom: minZoom === 3 ? 13 : (minZoom ?? 0) < 12 ? 14 : minZoom === 12 ? 15 : 16,
10073
10924
  color: tunnelCasingColor,
10074
10925
  dash: tunnelBorderDash,
10075
10926
  gapWidth: roadWidth(widths, oneWayScale, rampWidths),
10076
10927
  opacity: 1,
10077
- width: tunnelRoadCasingWidth
10928
+ width: roadCasingWidth((minZoom ?? 0) < 12)
10078
10929
  },
10079
10930
  fill: {
10080
10931
  ...fill,
10081
- cap: roadLineCap,
10932
+ cap: "butt",
10933
+ join: "miter",
10934
+ minZoom: Math.max(minZoom ?? 0, 13),
10082
10935
  color: tunnelColor,
10083
- opacity: zoom9.linear([
10936
+ opacity: zoom10.linear([
10084
10937
  [3, 0],
10085
10938
  [3.5, 0.8]
10086
10939
  ])
@@ -10098,7 +10951,7 @@ function cityRoadStyle(color, widths, options = {}) {
10098
10951
  }
10099
10952
  function pathRoadStyle(color, widths, options = {}) {
10100
10953
  const zoomRange = options.minZoom === void 0 ? {} : { minZoom: options.minZoom };
10101
- const surfaceColor = options.colorStops ? zoom9.linear(options.colorStops) : color;
10954
+ const surfaceColor = options.colorStops ? zoom10.linear(options.colorStops) : color;
10102
10955
  const cap = options.steps ? "butt" : pathLineCap;
10103
10956
  const tunnelCap = "butt";
10104
10957
  const join = options.steps ? "round" : pathLineJoin;
@@ -10147,12 +11000,43 @@ function pathRoadStyle(color, widths, options = {}) {
10147
11000
  }
10148
11001
  };
10149
11002
  }
11003
+ function streetNamePass(kind, minZoom, classes, subclasses) {
11004
+ const style = roadLabelStyle(kind);
11005
+ return renderPass9({
11006
+ feature: "roadName",
11007
+ renderer: "symbol",
11008
+ requirements: ["roads"],
11009
+ placement: "below-buildings",
11010
+ selector: {
11011
+ kind: "all",
11012
+ selectors: [
11013
+ { field: "name", kind: "has" },
11014
+ { field: "class", kind: "in", values: classes },
11015
+ ...subclasses ? [{ field: "subclass", kind: "in", values: subclasses }] : []
11016
+ ]
11017
+ },
11018
+ style: {
11019
+ ...style,
11020
+ minZoom,
11021
+ text: {
11022
+ ...style.text,
11023
+ field: expr11.coalesce(
11024
+ expr11.get(field10("name")),
11025
+ expr11.get(field10("nameLatin")),
11026
+ expr11.get(field10("nameEnglish"))
11027
+ ),
11028
+ optional: true
11029
+ }
11030
+ }
11031
+ });
11032
+ }
10150
11033
  function roadLabelStyle(kind) {
10151
11034
  const major = kind === "major";
10152
11035
  const pedestrian = kind === "pedestrian";
10153
11036
  const path = kind === "path";
10154
- const startSize = major ? 9 : pedestrian ? 9 : path ? 6.5 : 8;
10155
- const endSize = major ? 16 : pedestrian ? 14 : path ? 13 : 14;
11037
+ const small = path || kind === "service";
11038
+ const startSize = major ? 9 : pedestrian ? 9 : small ? 6.5 : 8;
11039
+ const endSize = major ? 16 : pedestrian ? 14 : small ? 13 : 14;
10156
11040
  return {
10157
11041
  placement: "line",
10158
11042
  priority: major ? 90 : 50,
@@ -10160,12 +11044,14 @@ function roadLabelStyle(kind) {
10160
11044
  text: {
10161
11045
  color: streetsVisual.label.road,
10162
11046
  font: streetsVisual.font.default,
10163
- haloColor: streetsDetailPalette.halo,
11047
+ haloColor: streetsVisual.label.roadHalo,
10164
11048
  haloWidth: 1,
10165
11049
  letterSpacing: path || pedestrian ? 0.01 : 0.15,
10166
11050
  maxAngle: 30,
10167
11051
  padding: 1,
10168
- size: zoom9.linear([
11052
+ pitchAlignment: "map",
11053
+ rotationAlignment: "map",
11054
+ size: zoom10.linear([
10169
11055
  [10, startSize],
10170
11056
  [18, endSize]
10171
11057
  ]),
@@ -10181,9 +11067,19 @@ var streets = bindOfficialMapTheme(
10181
11067
  glyphs: {
10182
11068
  kind: "url",
10183
11069
  url: "https://api.tileflow.dev/base/33d4de5e8086d9d629d67d3f39fedb87e23686c4c1ac653c27e2a52aee9d00b3/glyphs/{fontstack}/{range}.pbf",
10184
- fontStacks: ["Noto Sans Regular", "Noto Sans Bold"]
11070
+ fontStacks: ["Noto Sans Regular", "Noto Sans Bold", "Noto Sans Italic"]
10185
11071
  },
10186
11072
  themes: streetsThemes,
11073
+ timeOfDay: {
11074
+ light: { day: "light", dawn: "dawn", dusk: "dusk", night: "dark" },
11075
+ faded: { day: "faded", dawn: "dawn-faded", dusk: "dusk-faded", night: "dark-faded" },
11076
+ monochrome: {
11077
+ day: "monochrome",
11078
+ dawn: "dawn-monochrome",
11079
+ dusk: "dusk-monochrome",
11080
+ night: "dark-monochrome"
11081
+ }
11082
+ },
10187
11083
  defaultTheme: "light",
10188
11084
  systemThemes: { light: "light", dark: "dark" },
10189
11085
  projection: "globe",
@@ -10194,25 +11090,57 @@ var streets = bindOfficialMapTheme(
10194
11090
  type: "tileflow-world"
10195
11091
  },
10196
11092
  icons: [streetsIcons],
10197
- // The development terrain archive currently returns uncached tiles in the reviewed cities.
10198
- // Keep it disabled until that archive is complete so navigation does not wait on failed DEM requests.
10199
- terrain: "none",
11093
+ models: [streetsModels],
11094
+ // The same open DEM used by the other terrain maps. Restrict relief to
11095
+ // regional zooms so street detail does not fetch high-resolution DEM tiles.
11096
+ terrain: {
11097
+ mode: "hillshade",
11098
+ encoding: "terrarium",
11099
+ url: "https://tiles.mapterhorn.com/tilejson.json",
11100
+ attribution: 'Terrain: <a href="https://mapterhorn.com/attribution">\xA9 Mapterhorn</a>',
11101
+ hillshade: {
11102
+ minZoom: 5,
11103
+ maxZoom: 14,
11104
+ accentColor: streetsVisual.terrain.accent,
11105
+ highlightColor: streetsVisual.terrain.highlight,
11106
+ shadowColor: streetsVisual.terrain.shadow,
11107
+ exaggeration: 0.23,
11108
+ illuminationAnchor: "map",
11109
+ illuminationDirection: 315
11110
+ }
11111
+ },
10200
11112
  modules: {
10201
11113
  // Optional keys: addresses, aeroways, boundaries, buildings, labels, land,
10202
11114
  // landforms, poi, roads, transit, vegetation, water. Object order never
10203
11115
  // controls layer order.
10204
11116
  // Streets deliberately omits parcel-level house numbers. POI and road/place
10205
11117
  // labels carry the useful navigation hierarchy without close-zoom numeric noise.
10206
- addresses: disable6(),
10207
- land: withRenderStack8(
11118
+ addresses: addresses4({
11119
+ labels: {
11120
+ minZoom: 17,
11121
+ text: {
11122
+ font: streetsVisual.font.default,
11123
+ color: streetsVisual.label.muted,
11124
+ haloColor: streetsVisual.label.placeHalo,
11125
+ haloWidth: 1,
11126
+ maxWidth: 10,
11127
+ padding: 20,
11128
+ size: zoom10.linear([
11129
+ [18, 11],
11130
+ [20, 13]
11131
+ ])
11132
+ }
11133
+ }
11134
+ }),
11135
+ land: withRenderStack9(
10208
11136
  land8({
10209
11137
  background: {
10210
11138
  color: streetsSurfacePalette.background,
10211
11139
  opacity: 1
10212
11140
  },
10213
11141
  globalLandcover: {
10214
- color: expr9.match(
10215
- expr9.get(field8("class")),
11142
+ color: expr11.match(
11143
+ expr11.get(field10("class")),
10216
11144
  [
10217
11145
  { labels: "barren", value: streetsGlobalLandcoverPalette.barren },
10218
11146
  { labels: "crop", value: streetsGlobalLandcoverPalette.crop },
@@ -10348,7 +11276,7 @@ var streets = bindOfficialMapTheme(
10348
11276
  industrial: { fill: { color: streetsSurfacePalette.industrial, opacity: 1 } },
10349
11277
  medical: { fill: { color: streetsSurfacePalette.medical, opacity: 1 } },
10350
11278
  parking: {
10351
- fill: { color: streetsSurfacePalette.parking, minZoom: 15, opacity: 0.9 },
11279
+ fill: { color: streetsSurfacePalette.parking, minZoom: 15, opacity: 1 },
10352
11280
  outline: {
10353
11281
  color: streetsSurfacePalette.parkingOutline,
10354
11282
  minZoom: 16,
@@ -10378,9 +11306,9 @@ var streets = bindOfficialMapTheme(
10378
11306
  water: water8({
10379
11307
  bathymetry: {
10380
11308
  antialias: false,
10381
- color: expr9.interpolate(
11309
+ color: expr11.interpolate(
10382
11310
  { kind: "linear" },
10383
- expr9.multiply(-1, expr9.toNumber(expr9.get(field8("bathymetryMinDepth")), 0)),
11311
+ expr11.multiply(-1, expr11.toNumber(expr11.get(field10("bathymetryMinDepth")), 0)),
10384
11312
  [
10385
11313
  [0, streetsSurfacePalette.waterDepth0],
10386
11314
  [200, streetsSurfacePalette.waterDepth200],
@@ -10390,7 +11318,7 @@ var streets = bindOfficialMapTheme(
10390
11318
  ),
10391
11319
  maxZoom: 8,
10392
11320
  minZoom: 0,
10393
- opacity: zoom9.linear([
11321
+ opacity: zoom10.linear([
10394
11322
  [0, 1],
10395
11323
  [6, 1],
10396
11324
  [8, 0]
@@ -10398,8 +11326,8 @@ var streets = bindOfficialMapTheme(
10398
11326
  },
10399
11327
  bodies: {
10400
11328
  fill: {
10401
- color: expr9.match(
10402
- expr9.get(field8("class")),
11329
+ color: expr11.match(
11330
+ expr11.get(field10("class")),
10403
11331
  [{ labels: ["ocean", "sea"], value: streetsSurfacePalette.waterOcean }],
10404
11332
  streetsSurfacePalette.water
10405
11333
  ),
@@ -10424,7 +11352,7 @@ var streets = bindOfficialMapTheme(
10424
11352
  join: "round",
10425
11353
  minZoom: 8,
10426
11354
  opacity: 0.96,
10427
- width: zoom9.linear([
11355
+ width: zoom10.linear([
10428
11356
  [8, 0.35],
10429
11357
  [13, 1.05],
10430
11358
  [16, 2.2]
@@ -10436,7 +11364,7 @@ var streets = bindOfficialMapTheme(
10436
11364
  join: "round",
10437
11365
  minZoom: 12,
10438
11366
  opacity: 0.92,
10439
- width: zoom9.linear([
11367
+ width: zoom10.linear([
10440
11368
  [12, 0.35],
10441
11369
  [14, 0.8],
10442
11370
  [16, 1.4]
@@ -10448,7 +11376,7 @@ var streets = bindOfficialMapTheme(
10448
11376
  join: "round",
10449
11377
  minZoom: 6,
10450
11378
  opacity: 0.96,
10451
- width: zoom9.linear([
11379
+ width: zoom10.linear([
10452
11380
  [6, 0.45],
10453
11381
  [13, 1.25],
10454
11382
  [16, 3.2]
@@ -10460,7 +11388,7 @@ var streets = bindOfficialMapTheme(
10460
11388
  join: "round",
10461
11389
  minZoom: 10,
10462
11390
  opacity: 0.94,
10463
- width: zoom9.linear([
11391
+ width: zoom10.linear([
10464
11392
  [10, 0.3],
10465
11393
  [12, 0.55],
10466
11394
  [13, 0.9],
@@ -10470,31 +11398,8 @@ var streets = bindOfficialMapTheme(
10470
11398
  }
10471
11399
  }
10472
11400
  }),
10473
- vegetation: vegetation6({
10474
- flat: {
10475
- color: streetsDetailPalette.greenspaceDark,
10476
- minZoom: 16,
10477
- opacity: 0.82,
10478
- pitchAlignment: "map",
10479
- pitchScale: "map",
10480
- radius: zoom9.linear([
10481
- [16, 2.2],
10482
- [20, 8]
10483
- ]),
10484
- strokeColor: streetsDetailPalette.greenspace,
10485
- strokeOpacity: 0.55,
10486
- strokeWidth: 0.8
10487
- },
10488
- mode: "3d",
10489
- threeDimensional: {
10490
- barkColor: streetsVisual.tree.bark,
10491
- broadleafColors: streetsVisual.tree.broadleaf,
10492
- coniferColors: streetsVisual.tree.conifer,
10493
- crownScale: 1,
10494
- heightScale: 1
10495
- }
10496
- }),
10497
- boundaries: withRenderStack8(
11401
+ vegetation: streetsTrees,
11402
+ boundaries: withRenderStack9(
10498
11403
  boundaries8({
10499
11404
  // Mapbox Standard's admin-0/admin-1 layers map to OpenMapTiles
10500
11405
  // admin_level 2/4 respectively.
@@ -10503,7 +11408,7 @@ var streets = bindOfficialMapTheme(
10503
11408
  dash: [10, 0],
10504
11409
  minZoom: 1,
10505
11410
  opacity: 1,
10506
- width: zoom9.linear([
11411
+ width: zoom10.linear([
10507
11412
  [3, 0.8],
10508
11413
  [6, 1.35],
10509
11414
  [12, 2.1]
@@ -10513,11 +11418,11 @@ var streets = bindOfficialMapTheme(
10513
11418
  color: streetsOverviewPalette.admin1,
10514
11419
  dash: [3, 2],
10515
11420
  minZoom: 2,
10516
- opacity: zoom9.linear([
11421
+ opacity: zoom10.linear([
10517
11422
  [2, 0],
10518
11423
  [3, 1]
10519
11424
  ]),
10520
- width: zoom9.linear([
11425
+ width: zoom10.linear([
10521
11426
  [3, 0.7],
10522
11427
  [6, 1.2],
10523
11428
  [12, 1.8]
@@ -10525,12 +11430,12 @@ var streets = bindOfficialMapTheme(
10525
11430
  },
10526
11431
  disputed: {
10527
11432
  color: streetsOverviewPalette.admin0,
10528
- dash: expr9.step(expr9.zoom(), expr9.literal([3, 2, 5]), [
10529
- [7, expr9.literal([2, 1.5])]
11433
+ dash: expr11.step(expr11.zoom(), expr11.literal([3, 2, 5]), [
11434
+ [7, expr11.literal([2, 1.5])]
10530
11435
  ]),
10531
11436
  minZoom: 1,
10532
11437
  opacity: 1,
10533
- width: zoom9.linear([
11438
+ width: zoom10.linear([
10534
11439
  [3, 0.5],
10535
11440
  [12, 2]
10536
11441
  ])
@@ -10539,7 +11444,7 @@ var streets = bindOfficialMapTheme(
10539
11444
  }),
10540
11445
  streetsBoundaryRenderStack()
10541
11446
  ),
10542
- roads: withRenderStack8(
11447
+ roads: withRenderStack9(
10543
11448
  roads7({
10544
11449
  detail: "all",
10545
11450
  // 'none' | 'highways' | 'major' | 'streets' | 'all'.
@@ -10557,10 +11462,12 @@ var streets = bindOfficialMapTheme(
10557
11462
  },
10558
11463
  crossings: {
10559
11464
  image: streetsVisual.image.crosswalk,
10560
- minZoom: 15,
10561
- opacity: zoom9.linear([
10562
- [15, 0],
10563
- [15.5, 1]
11465
+ // At city detail these white markings wash out otherwise matching
11466
+ // road fills. Introduce them with the closer street-level detail.
11467
+ minZoom: 16.5,
11468
+ opacity: zoom10.linear([
11469
+ [16.5, 0],
11470
+ [17, 1]
10564
11471
  ])
10565
11472
  },
10566
11473
  roundabouts: {
@@ -10590,9 +11497,12 @@ var streets = bindOfficialMapTheme(
10590
11497
  pattern: streetsVisual.image.sidewalkPattern
10591
11498
  },
10592
11499
  surface: {
10593
- color: streetsDetailPalette.roadCasing,
11500
+ // Preserve the ground beneath mapped pedestrian polygons. A
11501
+ // neutral translucent tint darkens grass as green and pavement
11502
+ // as neutral, without requiring a spatial join in the style.
11503
+ color: streetsVisual.road.sidewalkSurface,
10594
11504
  minZoom: 17,
10595
- opacity: 0.96
11505
+ opacity: 1
10596
11506
  }
10597
11507
  },
10598
11508
  modifiers: {
@@ -10601,11 +11511,10 @@ var streets = bindOfficialMapTheme(
10601
11511
  // phases accept color, opacity, dash, blur, gapWidth, offset, and width.
10602
11512
  construction: {
10603
11513
  surface: {
10604
- casing: {
10605
- color: mapboxRoadPalette.roadCasing,
10606
- dash: [1.5, 1],
10607
- opacity: 0.9
10608
- },
11514
+ // Keep construction dashes in the fill. A conditional casing
11515
+ // dash adds a [1, 0] fallback to every ordinary road, selecting
11516
+ // MapLibre's SDF dash shader and stippling thin hollow borders.
11517
+ casing: { dash: [1, 0], opacity: 0 },
10609
11518
  fill: {
10610
11519
  color: mapboxRoadPalette.road,
10611
11520
  dash: [1.5, 1],
@@ -10726,6 +11635,7 @@ var streets = bindOfficialMapTheme(
10726
11635
  [22, mapboxRoadPalette.motorway]
10727
11636
  ],
10728
11637
  minZoom: 3,
11638
+ major: true,
10729
11639
  rampWidths: mapboxMajorRampWidthStops,
10730
11640
  tunnelCasingColor: mapboxRoadPalette.motorwayCasing,
10731
11641
  tunnelColor: mapboxRoadPalette.motorwayTunnel
@@ -10749,6 +11659,7 @@ var streets = bindOfficialMapTheme(
10749
11659
  [22, mapboxRoadPalette.trunk]
10750
11660
  ],
10751
11661
  minZoom: 3,
11662
+ major: true,
10752
11663
  rampWidths: mapboxMajorRampWidthStops,
10753
11664
  tunnelCasingColor: mapboxRoadPalette.trunkCasing,
10754
11665
  tunnelColor: mapboxRoadPalette.trunkTunnel
@@ -10758,7 +11669,7 @@ var streets = bindOfficialMapTheme(
10758
11669
  primaryRoadSurfaceColor,
10759
11670
  [
10760
11671
  [3, 0.8],
10761
- [12, 2.6],
11672
+ [12, 3],
10762
11673
  [18, 28],
10763
11674
  [22, 280]
10764
11675
  ],
@@ -10769,7 +11680,8 @@ var streets = bindOfficialMapTheme(
10769
11680
  streetsCityRoadPalette.primary,
10770
11681
  primaryRoadSurfaceColor
10771
11682
  ),
10772
- minZoom: 5,
11683
+ minZoom: 6,
11684
+ major: true,
10773
11685
  rampWidths: mapboxArterialRampWidthStops,
10774
11686
  tunnelCasingColor: mapboxRoadPalette.roadCasing,
10775
11687
  tunnelColor: mapboxRoadPalette.roadTunnel
@@ -10779,7 +11691,7 @@ var streets = bindOfficialMapTheme(
10779
11691
  secondaryRoadSurfaceColor,
10780
11692
  [
10781
11693
  [3, 0],
10782
- [12, 1.8],
11694
+ [12, 2.2],
10783
11695
  [18, 26],
10784
11696
  [22, 260]
10785
11697
  ],
@@ -10800,7 +11712,7 @@ var streets = bindOfficialMapTheme(
10800
11712
  tertiaryRoadSurfaceColor,
10801
11713
  [
10802
11714
  [3, 0],
10803
- [12, 1.2],
11715
+ [12, 2.2],
10804
11716
  [18, 26],
10805
11717
  [22, 260]
10806
11718
  ],
@@ -10821,13 +11733,12 @@ var streets = bindOfficialMapTheme(
10821
11733
  roadSurfaceColor,
10822
11734
  [
10823
11735
  [3, 0],
10824
- [12, 0.35],
11736
+ [12, 0.5],
10825
11737
  [18, 20],
10826
11738
  [22, 200]
10827
11739
  ],
10828
11740
  {
10829
11741
  casingColorStops: cityRoadCasingColorStops(12),
10830
- casingMinZoom: 14.5,
10831
11742
  colorStops: cityRoadColorStops(12, streetsCityRoadPalette.minor, roadSurfaceColor),
10832
11743
  minZoom: 12,
10833
11744
  tunnelCasingColor: mapboxRoadPalette.roadCasing,
@@ -10838,16 +11749,12 @@ var streets = bindOfficialMapTheme(
10838
11749
  roadSurfaceColor,
10839
11750
  [
10840
11751
  [3, 0],
10841
- [13, 0],
10842
- [13.5, 0.35],
10843
- [14, 0.8],
10844
- [15, 2.2],
10845
- [16, 3.8],
11752
+ [12, 0],
10846
11753
  [18, 10],
10847
11754
  [22, 100]
10848
11755
  ],
10849
11756
  {
10850
- casingMinZoom: 14.5,
11757
+ casingMinZoom: 16,
10851
11758
  casingColorStops: [
10852
11759
  [14.5, mapboxRoadPalette.roadCasing],
10853
11760
  [22, mapboxRoadPalette.roadCasing]
@@ -10856,24 +11763,21 @@ var streets = bindOfficialMapTheme(
10856
11763
  [13.5, roadSurfaceColor],
10857
11764
  [22, roadSurfaceColor]
10858
11765
  ],
10859
- minZoom: 13.5,
10860
- tunnelVisible: false
11766
+ minZoom: 15,
11767
+ tunnelCasingColor: mapboxRoadPalette.roadCasing,
11768
+ tunnelColor: mapboxRoadPalette.roadTunnel
10861
11769
  }
10862
11770
  ),
10863
11771
  track: cityRoadStyle(
10864
11772
  mapboxRoadPalette.road,
10865
11773
  [
10866
11774
  [3, 0],
10867
- [13, 0],
10868
- [13.5, 0.25],
10869
- [14, 0.6],
10870
- [15, 1.8],
10871
- [16, 3.2],
11775
+ [12, 0],
10872
11776
  [18, 10],
10873
11777
  [22, 100]
10874
11778
  ],
10875
11779
  {
10876
- casingMinZoom: 14.5,
11780
+ casingMinZoom: 16,
10877
11781
  casingColorStops: [
10878
11782
  [14.5, mapboxRoadPalette.roadCasing],
10879
11783
  [22, mapboxRoadPalette.roadCasing]
@@ -10882,32 +11786,28 @@ var streets = bindOfficialMapTheme(
10882
11786
  [13.5, mapboxRoadPalette.road],
10883
11787
  [22, mapboxRoadPalette.road]
10884
11788
  ],
10885
- minZoom: 13.5,
11789
+ minZoom: 15,
10886
11790
  tunnelCasingColor: mapboxRoadPalette.roadCasing,
10887
11791
  tunnelColor: mapboxRoadPalette.roadTunnel
10888
11792
  }
10889
11793
  ),
10890
- pathway: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
10891
- casingColor: streetsDetailPalette.parkPath,
10892
- casingWidth: 0,
11794
+ pathway: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10893
11795
  minZoom: 12
10894
11796
  }),
10895
- footway: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
10896
- casingColor: streetsDetailPalette.parkPath,
10897
- casingWidth: 0,
11797
+ footway: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10898
11798
  minZoom: 12
10899
11799
  }),
10900
11800
  cycleway: pathRoadStyle(mapboxRoadPalette.cycleway, mapboxPathWidthStops, {
10901
11801
  casingColor: mapboxRoadPalette.pathCasing,
10902
11802
  casingGapWidth: roadWidth(mapboxPathWidthStops, 1),
10903
- fillOpacity: zoom9.linear([
11803
+ fillOpacity: zoom10.linear([
10904
11804
  [15, 0],
10905
11805
  [16, 1]
10906
11806
  ]),
10907
11807
  minZoom: 15,
10908
11808
  underlay: {
10909
11809
  cap: pathLineCap,
10910
- color: zoom9.linear([
11810
+ color: zoom10.linear([
10911
11811
  [15, mapboxRoadPalette.pathAtZ15],
10912
11812
  [16, mapboxRoadPalette.pathFromZ16]
10913
11813
  ]),
@@ -10916,16 +11816,16 @@ var streets = bindOfficialMapTheme(
10916
11816
  opacity: 1,
10917
11817
  width: roadWidth(mapboxPathWidthStops, 1)
10918
11818
  },
10919
- width: zoom9.linear([
11819
+ width: zoom10.linear([
10920
11820
  [12, 0],
10921
11821
  [18, 2],
10922
11822
  [22, 20]
10923
11823
  ])
10924
11824
  }),
10925
- steps: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
11825
+ steps: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10926
11826
  casingMinZoom: 14,
10927
- casingColor: streetsDetailPalette.parkPath,
10928
- casingWidth: 0,
11827
+ casingWidth: contextualPathLineWidth,
11828
+ casingGapWidth: 0,
10929
11829
  // World V1 overzooms its native z15 tile above street level.
10930
11830
  // Keep this literal: a zoom-dependent dash is evaluated at the
10931
11831
  // source tile zoom and would remain a continuous line at z16+.
@@ -10935,18 +11835,35 @@ var streets = bindOfficialMapTheme(
10935
11835
  minZoom: 14,
10936
11836
  steps: true
10937
11837
  }),
10938
- pedestrian: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
11838
+ pedestrian: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10939
11839
  casingMinZoom: 14,
10940
- casingColor: streetsDetailPalette.parkPath,
10941
- casingWidth: 0,
10942
11840
  minZoom: 12
10943
11841
  })
10944
11842
  }
10945
11843
  }),
10946
11844
  streetsRoadRenderStack()
10947
11845
  ),
10948
- transit: transit8(mapboxRailTransitStyle(mapboxRailColor)),
10949
- buildings: withRenderStack8(
11846
+ transit: transit8({
11847
+ ...mapboxRailTransitStyle(mapboxRailColor),
11848
+ // Fine blue routes fade in at regional scale; street-scale dashes
11849
+ // and names follow the same hierarchy as the Standard reference.
11850
+ ferry: {
11851
+ color: streetsVisual.road.ferry,
11852
+ minZoom: 8,
11853
+ dash: expr11.step(expr11.zoom(), expr11.literal([1, 0]), [
11854
+ [13, expr11.literal([12, 4])]
11855
+ ]),
11856
+ opacity: zoom10.linear([
11857
+ [8, 0],
11858
+ [17, 1]
11859
+ ]),
11860
+ width: zoom10.exponential(1.5, [
11861
+ [14, 0.5],
11862
+ [20, 1]
11863
+ ])
11864
+ }
11865
+ }),
11866
+ buildings: withRenderStack9(
10950
11867
  buildings7({
10951
11868
  mode: "flat",
10952
11869
  // 'flat' | '3d'.
@@ -10961,7 +11878,7 @@ var streets = bindOfficialMapTheme(
10961
11878
  fill: {
10962
11879
  color: buildingFillColor,
10963
11880
  minZoom: 14.25,
10964
- opacity: zoom9.linear([
11881
+ opacity: zoom10.linear([
10965
11882
  [14.25, 0],
10966
11883
  [14.75, 0.5],
10967
11884
  [15, 1]
@@ -10970,14 +11887,14 @@ var streets = bindOfficialMapTheme(
10970
11887
  outline: {
10971
11888
  color: buildingOutlineColor,
10972
11889
  minZoom: 14.5,
10973
- opacity: zoom9.linear([
11890
+ opacity: zoom10.linear([
10974
11891
  [14.5, 0],
10975
11892
  [15, 0.6],
10976
11893
  [16, 0.82],
10977
11894
  [17, 0.96],
10978
11895
  [18, 1]
10979
11896
  ]),
10980
- width: zoom9.linear([
11897
+ width: zoom10.linear([
10981
11898
  [14.5, 0.25],
10982
11899
  [15, 0.4],
10983
11900
  [16, 0.65],
@@ -10989,15 +11906,15 @@ var streets = bindOfficialMapTheme(
10989
11906
  }),
10990
11907
  streetsBuildingRenderStack()
10991
11908
  ),
10992
- labels: withRenderStack8(
11909
+ labels: withRenderStack9(
10993
11910
  labels8({
10994
11911
  collisionPriority: "navigation",
10995
11912
  language: "local",
10996
11913
  // 'auto' | 'local' | 'en' | another language field suffix.
10997
11914
  places: "all",
10998
11915
  // 'none' | 'major' | 'all'.
10999
- roads: "all",
11000
- // 'none' | 'highways' | 'major' | 'streets' | 'all'.
11916
+ // Street names use the ground passes below; shields remain in the foreground.
11917
+ roads: "none",
11001
11918
  shields: "major",
11002
11919
  // 'none' | 'major' | 'all'.
11003
11920
  junctions: true,
@@ -11006,7 +11923,7 @@ var streets = bindOfficialMapTheme(
11006
11923
  // 'none' | 'major' | 'all'.
11007
11924
  styles: {
11008
11925
  places: {
11009
- // Mapbox Streets v12 hierarchy: continents disappear first, then
11926
+ // Standard overview hierarchy: continents disappear first, then
11010
11927
  // countries and administrative regions hand over to settlements.
11011
11928
  continent: {
11012
11929
  minZoom: 0.75,
@@ -11014,17 +11931,17 @@ var streets = bindOfficialMapTheme(
11014
11931
  priority: 100,
11015
11932
  text: {
11016
11933
  color: streetsOverviewPalette.label,
11017
- haloColor: streetsDetailPalette.halo,
11934
+ haloColor: streetsVisual.label.placeHalo,
11018
11935
  haloWidth: 1.5,
11019
11936
  letterSpacing: 0.05,
11020
11937
  lineHeight: 1.1,
11021
11938
  maxWidth: 6,
11022
- opacity: zoom9.linear([
11939
+ opacity: zoom10.linear([
11023
11940
  [0, 0.8],
11024
11941
  [1.5, 0.5],
11025
11942
  [2.5, 0.5]
11026
11943
  ]),
11027
- size: zoom9.exponential(0.5, [
11944
+ size: zoom10.exponential(0.5, [
11028
11945
  [0, 10],
11029
11946
  [2.5, 15]
11030
11947
  ]),
@@ -11036,46 +11953,33 @@ var streets = bindOfficialMapTheme(
11036
11953
  maxZoom: 10,
11037
11954
  priority: 95,
11038
11955
  text: {
11956
+ font: streetsVisual.font.default,
11039
11957
  color: streetsOverviewPalette.label,
11040
- haloColor: streetsDetailPalette.halo,
11958
+ haloColor: streetsVisual.label.placeHalo,
11041
11959
  haloWidth: 1.25,
11042
11960
  lineHeight: 1.1,
11043
11961
  maxWidth: 6,
11044
11962
  padding: 3,
11045
- radialOffset: zoom9.step([
11963
+ radialOffset: zoom10.step([
11046
11964
  [1, 0.6],
11047
11965
  [8, 0]
11048
11966
  ]),
11049
- size: expr9.interpolate(
11967
+ size: expr11.interpolate(
11050
11968
  { kind: "cubic-bezier", x1: 0.2, x2: 0.7, y1: 0, y2: 1 },
11051
- expr9.zoom(),
11969
+ expr11.zoom(),
11052
11970
  [
11053
11971
  [
11054
11972
  1,
11055
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 11, [
11973
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 11, [
11056
11974
  [4, 9],
11057
11975
  [5, 8]
11058
11976
  ])
11059
11977
  ],
11060
- [
11061
- 5,
11062
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 14, [
11063
- [3, 13],
11064
- [5, 11]
11065
- ])
11066
- ],
11067
- [
11068
- 7,
11069
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 16, [
11070
- [3, 15],
11071
- [5, 13]
11072
- ])
11073
- ],
11074
11978
  [
11075
11979
  9,
11076
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 18, [
11077
- [3, 17],
11078
- [5, 15]
11980
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 22, [
11981
+ [4, 19],
11982
+ [5, 17]
11079
11983
  ])
11080
11984
  ]
11081
11985
  ]
@@ -11088,26 +11992,27 @@ var streets = bindOfficialMapTheme(
11088
11992
  maxZoom: 9,
11089
11993
  priority: 86,
11090
11994
  text: {
11995
+ font: streetsVisual.font.places,
11091
11996
  color: streetsOverviewPalette.label,
11092
- haloColor: streetsDetailPalette.halo,
11997
+ haloColor: streetsVisual.label.placeHalo,
11093
11998
  haloWidth: 1,
11094
11999
  letterSpacing: 0.15,
11095
12000
  maxWidth: 6,
11096
12001
  opacity: 0.5,
11097
- size: expr9.interpolate(
12002
+ size: expr11.interpolate(
11098
12003
  { kind: "cubic-bezier", x1: 0.85, x2: 0.65, y1: 0.7, y2: 1 },
11099
- expr9.zoom(),
12004
+ expr11.zoom(),
11100
12005
  [
11101
12006
  [
11102
12007
  4,
11103
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 9, [
12008
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 9, [
11104
12009
  [6, 8],
11105
12010
  [7, 7]
11106
12011
  ])
11107
12012
  ],
11108
12013
  [
11109
12014
  9,
11110
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 21, [
12015
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 21, [
11111
12016
  [6, 16],
11112
12017
  [7, 14]
11113
12018
  ])
@@ -11119,67 +12024,46 @@ var streets = bindOfficialMapTheme(
11119
12024
  },
11120
12025
  city: {
11121
12026
  minZoom: 2,
11122
- maxZoom: 16,
11123
- priority: expr9.subtract(100, expr9.coalesce(expr9.get(field8("rank")), 20)),
12027
+ maxZoom: 15,
12028
+ priority: expr11.subtract(100, expr11.coalesce(expr11.get(field10("rank")), 20)),
11124
12029
  text: {
11125
- color: zoom9.linear([
12030
+ color: zoom10.linear([
11126
12031
  [2, streetsOverviewPalette.label],
11127
12032
  [4, streetsOverviewPalette.label],
11128
12033
  [6, streetsVisual.label.settlement]
11129
12034
  ]),
11130
- haloColor: streetsDetailPalette.halo,
12035
+ haloColor: streetsVisual.label.placeHalo,
11131
12036
  haloBlur: 1,
11132
12037
  haloWidth: 1,
11133
12038
  lineHeight: 1.1,
11134
12039
  maxWidth: 7,
11135
12040
  padding: 1,
11136
- radialOffset: zoom9.step([
12041
+ radialOffset: zoom10.step([
11137
12042
  [2, 0.6],
11138
12043
  [8, 0]
11139
12044
  ]),
11140
- size: expr9.interpolate(
12045
+ size: expr11.interpolate(
11141
12046
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
11142
- expr9.zoom(),
12047
+ expr11.zoom(),
11143
12048
  [
11144
- [
11145
- 3,
11146
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 13, [
11147
- [3, 12],
11148
- [6, 10]
11149
- ])
11150
- ],
11151
- [
11152
- 5,
11153
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 15, [
11154
- [3, 13],
11155
- [4, 12],
11156
- [6, 11],
11157
- [8, 10],
11158
- [14, 9.5]
11159
- ])
11160
- ],
12049
+ [3, expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 13, [[6, 11]])],
11161
12050
  [
11162
12051
  6,
11163
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 17, [
11164
- [3, 15],
11165
- [4, 13],
11166
- [6, 12],
11167
- [8, 10.5],
11168
- [14, 10]
12052
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 18, [
12053
+ [6, 16],
12054
+ [7, 14]
11169
12055
  ])
11170
12056
  ],
11171
12057
  [
11172
12058
  8,
11173
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 20, [
11174
- [3, 18],
11175
- [6, 16],
11176
- [9, 14],
11177
- [12, 12]
12059
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 20, [
12060
+ [9, 16],
12061
+ [10, 14]
11178
12062
  ])
11179
12063
  ],
11180
12064
  [
11181
12065
  15,
11182
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 24, [
12066
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 24, [
11183
12067
  [9, 20],
11184
12068
  [12, 16],
11185
12069
  [15, 14]
@@ -11187,54 +12071,41 @@ var streets = bindOfficialMapTheme(
11187
12071
  ]
11188
12072
  ]
11189
12073
  ),
11190
- // Regular minor-city labels leave room for the denser
11191
- // regional label field used by Standard. Capital dots and
11192
- // rank-driven size still carry the major-city hierarchy.
11193
12074
  font: streetsVisual.font.default,
11194
- variableAnchors: [
11195
- "left",
11196
- "right",
11197
- "top",
11198
- "bottom",
11199
- "top-left",
11200
- "top-right",
11201
- "bottom-left",
11202
- "bottom-right"
11203
- ]
12075
+ variableAnchors: ["right"]
11204
12076
  }
11205
12077
  },
11206
12078
  town: {
11207
12079
  minZoom: 2,
11208
- maxZoom: 16,
11209
- priority: expr9.subtract(80, expr9.coalesce(expr9.get(field8("rank")), 20)),
12080
+ maxZoom: 13,
12081
+ priority: expr11.subtract(80, expr11.coalesce(expr11.get(field10("rank")), 20)),
11210
12082
  text: {
11211
12083
  color: streetsVisual.label.settlement,
11212
- haloColor: streetsDetailPalette.halo,
12084
+ haloColor: streetsVisual.label.placeHalo,
11213
12085
  haloBlur: 1,
11214
12086
  haloWidth: 1,
11215
12087
  lineHeight: 1.1,
11216
12088
  maxWidth: 7,
11217
12089
  padding: 1,
11218
- radialOffset: zoom9.step([
12090
+ radialOffset: zoom10.step([
11219
12091
  [2, 0.55],
11220
- [8, 0.35],
11221
- [11, 0]
12092
+ [8, 0]
11222
12093
  ]),
11223
- size: expr9.interpolate(
12094
+ size: expr11.interpolate(
11224
12095
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
11225
- expr9.zoom(),
12096
+ expr11.zoom(),
11226
12097
  [
11227
- [3, expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 11, [[9, 10]])],
12098
+ [3, expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 11, [[9, 10]])],
11228
12099
  [
11229
12100
  6,
11230
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 14, [
12101
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 14, [
11231
12102
  [9, 12],
11232
12103
  [12, 10]
11233
12104
  ])
11234
12105
  ],
11235
12106
  [
11236
12107
  8,
11237
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 16, [
12108
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 16, [
11238
12109
  [9, 14],
11239
12110
  [12, 12],
11240
12111
  [15, 10]
@@ -11242,7 +12113,7 @@ var streets = bindOfficialMapTheme(
11242
12113
  ],
11243
12114
  [
11244
12115
  13,
11245
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 22, [
12116
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 22, [
11246
12117
  [9, 20],
11247
12118
  [12, 16],
11248
12119
  [15, 14]
@@ -11250,7 +12121,7 @@ var streets = bindOfficialMapTheme(
11250
12121
  ]
11251
12122
  ]
11252
12123
  ),
11253
- font: streetsVisual.font.default,
12124
+ font: streetsVisual.font.regular,
11254
12125
  variableAnchors: [
11255
12126
  "left",
11256
12127
  "right",
@@ -11265,36 +12136,35 @@ var streets = bindOfficialMapTheme(
11265
12136
  },
11266
12137
  village: {
11267
12138
  minZoom: 2,
11268
- maxZoom: 16,
11269
- priority: expr9.subtract(65, expr9.coalesce(expr9.get(field8("rank")), 20)),
12139
+ maxZoom: 13,
12140
+ priority: expr11.subtract(65, expr11.coalesce(expr11.get(field10("rank")), 20)),
11270
12141
  text: {
11271
12142
  color: streetsVisual.label.settlement,
11272
- haloColor: streetsDetailPalette.halo,
12143
+ haloColor: streetsVisual.label.placeHalo,
11273
12144
  haloBlur: 1,
11274
12145
  haloWidth: 1,
11275
12146
  lineHeight: 1.1,
11276
12147
  maxWidth: 7,
11277
12148
  padding: 1,
11278
- radialOffset: zoom9.step([
12149
+ radialOffset: zoom10.step([
11279
12150
  [2, 0.55],
11280
- [8, 0.35],
11281
- [11, 0]
12151
+ [8, 0]
11282
12152
  ]),
11283
- size: expr9.interpolate(
12153
+ size: expr11.interpolate(
11284
12154
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
11285
- expr9.zoom(),
12155
+ expr11.zoom(),
11286
12156
  [
11287
- [3, expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 11, [[9, 10]])],
12157
+ [3, expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 11, [[9, 10]])],
11288
12158
  [
11289
12159
  6,
11290
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 14, [
12160
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 14, [
11291
12161
  [9, 12],
11292
12162
  [12, 10]
11293
12163
  ])
11294
12164
  ],
11295
12165
  [
11296
12166
  8,
11297
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 16, [
12167
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 16, [
11298
12168
  [9, 14],
11299
12169
  [12, 12],
11300
12170
  [15, 10]
@@ -11302,7 +12172,7 @@ var streets = bindOfficialMapTheme(
11302
12172
  ],
11303
12173
  [
11304
12174
  13,
11305
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 22, [
12175
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 22, [
11306
12176
  [9, 20],
11307
12177
  [12, 16],
11308
12178
  [15, 14]
@@ -11310,7 +12180,7 @@ var streets = bindOfficialMapTheme(
11310
12180
  ]
11311
12181
  ]
11312
12182
  ),
11313
- font: streetsVisual.font.default,
12183
+ font: streetsVisual.font.regular,
11314
12184
  variableAnchors: [
11315
12185
  "left",
11316
12186
  "right",
@@ -11325,46 +12195,40 @@ var streets = bindOfficialMapTheme(
11325
12195
  },
11326
12196
  neighborhood: {
11327
12197
  minZoom: 10,
11328
- maxZoom: 16,
11329
- priority: expr9.subtract(65, expr9.coalesce(expr9.get(field8("rank")), 20)),
12198
+ maxZoom: 15,
12199
+ priority: expr11.subtract(65, expr11.coalesce(expr11.get(field10("rank")), 20)),
11330
12200
  text: {
12201
+ font: streetsVisual.font.default,
11331
12202
  color: streetsVisual.label.neighborhood,
11332
- haloColor: streetsDetailPalette.halo,
11333
- haloBlur: 0.5,
12203
+ haloColor: streetsVisual.label.placeHalo,
12204
+ haloBlur: 0,
11334
12205
  haloWidth: 1.3,
11335
- letterSpacing: expr9.match(
11336
- expr9.get(field8("class")),
12206
+ letterSpacing: expr11.match(
12207
+ expr11.get(field10("class")),
11337
12208
  [{ labels: "suburb", value: 0.15 }],
11338
12209
  0.05
11339
12210
  ),
12211
+ lineHeight: 1.1,
11340
12212
  maxWidth: 7,
11341
- padding: 2,
11342
- size: expr9.interpolate(
12213
+ padding: 3,
12214
+ size: expr11.interpolate(
11343
12215
  { kind: "cubic-bezier", x1: 0.5, x2: 1, y1: 0, y2: 1 },
11344
- expr9.zoom(),
12216
+ expr11.zoom(),
11345
12217
  [
11346
12218
  [
11347
- 10,
11348
- expr9.match(
11349
- expr9.get(field8("class")),
11350
- [{ labels: "suburb", value: 10.5 }],
11351
- 10
11352
- )
11353
- ],
11354
- [
11355
- 12,
11356
- expr9.match(
11357
- expr9.get(field8("class")),
12219
+ 11,
12220
+ expr11.match(
12221
+ expr11.get(field10("class")),
11358
12222
  [{ labels: "suburb", value: 12 }],
11359
12223
  11.5
11360
12224
  )
11361
12225
  ],
11362
12226
  [
11363
12227
  15,
11364
- expr9.match(
11365
- expr9.get(field8("class")),
11366
- [{ labels: "suburb", value: 15 }],
11367
- 14
12228
+ expr11.match(
12229
+ expr11.get(field10("class")),
12230
+ [{ labels: "suburb", value: 16 }],
12231
+ 15
11368
12232
  )
11369
12233
  ]
11370
12234
  ]
@@ -11377,11 +12241,12 @@ var streets = bindOfficialMapTheme(
11377
12241
  maxZoom: 16,
11378
12242
  priority: 40,
11379
12243
  text: {
12244
+ font: streetsVisual.font.default,
11380
12245
  color: streetsVisual.label.neighborhood,
11381
- haloColor: streetsDetailPalette.halo,
12246
+ haloColor: streetsVisual.label.placeHalo,
11382
12247
  haloBlur: 0.5,
11383
12248
  haloWidth: 1,
11384
- size: zoom9.linear([
12249
+ size: zoom10.linear([
11385
12250
  [11, 10],
11386
12251
  [15, 14]
11387
12252
  ])
@@ -11389,32 +12254,17 @@ var streets = bindOfficialMapTheme(
11389
12254
  }
11390
12255
  },
11391
12256
  junctions: {
11392
- // Exit references are useful at street scale but overwhelm city overviews.
11393
- minZoom: 16,
12257
+ // Standard exit references start at z14 and use the shield weight.
12258
+ minZoom: 14,
11394
12259
  placement: "point",
11395
12260
  text: {
11396
12261
  color: streetsVisual.label.road,
11397
- font: streetsVisual.font.default,
12262
+ font: streetsVisual.font.places,
11398
12263
  haloColor: streetsDetailPalette.halo,
11399
- haloWidth: 2,
11400
- size: 10
12264
+ haloWidth: 1,
12265
+ size: 9
11401
12266
  }
11402
12267
  },
11403
- roads: {
11404
- motorway: { ...roadLabelStyle("major"), minZoom: 10 },
11405
- trunk: { ...roadLabelStyle("major"), minZoom: 10 },
11406
- primary: { ...roadLabelStyle("major"), minZoom: 12 },
11407
- secondary: { ...roadLabelStyle("major"), minZoom: 12 },
11408
- tertiary: { ...roadLabelStyle("major"), minZoom: 13 },
11409
- minor: { ...roadLabelStyle("street"), minZoom: 13 },
11410
- service: { ...roadLabelStyle("street"), minZoom: 15 },
11411
- track: { ...roadLabelStyle("path"), visible: false },
11412
- pathway: { ...roadLabelStyle("path"), minZoom: 15 },
11413
- footway: { ...roadLabelStyle("path"), minZoom: 15 },
11414
- cycleway: { ...roadLabelStyle("path"), minZoom: 15 },
11415
- steps: { ...roadLabelStyle("path"), minZoom: 15 },
11416
- pedestrian: { ...roadLabelStyle("pedestrian"), minZoom: 12 }
11417
- },
11418
12268
  shields: {
11419
12269
  default: {
11420
12270
  minZoom: 6,
@@ -11448,7 +12298,7 @@ var streets = bindOfficialMapTheme(
11448
12298
  detail: {
11449
12299
  // Core switches to line placement at street scale while retaining viewport
11450
12300
  // alignment, so each route reference remains horizontal during navigation.
11451
- spacing: zoom9.linear([
12301
+ spacing: zoom10.linear([
11452
12302
  [11, 400],
11453
12303
  [14, 600]
11454
12304
  ])
@@ -11473,11 +12323,12 @@ var streets = bindOfficialMapTheme(
11473
12323
  minZoom: 1,
11474
12324
  priority: 70,
11475
12325
  text: {
12326
+ font: streetsVisual.font.water,
11476
12327
  color: streetsDetailPalette.waterText,
11477
12328
  haloColor: streetsVisual.label.waterHalo,
11478
- haloWidth: 0.5,
11479
- letterSpacing: 0.2,
11480
- size: zoom9.linear([
12329
+ haloWidth: 0,
12330
+ letterSpacing: 0.25,
12331
+ size: zoom10.linear([
11481
12332
  [1, 12],
11482
12333
  [8, 18]
11483
12334
  ])
@@ -11488,10 +12339,11 @@ var streets = bindOfficialMapTheme(
11488
12339
  maxZoom: 15,
11489
12340
  priority: 60,
11490
12341
  text: {
12342
+ font: streetsVisual.font.water,
11491
12343
  color: streetsDetailPalette.waterText,
11492
12344
  haloColor: streetsVisual.label.waterHalo,
11493
- haloWidth: 0.5,
11494
- size: zoom9.linear([
12345
+ haloWidth: 0,
12346
+ size: zoom10.linear([
11495
12347
  [5, 11],
11496
12348
  [14, 16]
11497
12349
  ])
@@ -11502,12 +12354,20 @@ var streets = bindOfficialMapTheme(
11502
12354
  placement: "line-center",
11503
12355
  priority: 65,
11504
12356
  text: {
12357
+ font: streetsVisual.font.water,
11505
12358
  color: streetsDetailPalette.waterText,
11506
12359
  haloColor: streetsVisual.label.waterHalo,
11507
- haloWidth: 0.5,
11508
- letterSpacing: 0.12,
12360
+ haloWidth: 0,
12361
+ letterSpacing: expr11.match(
12362
+ expr11.get(field10("class")),
12363
+ [
12364
+ { labels: "ocean", value: 0.25 },
12365
+ { labels: ["sea", "bay"], value: 0.15 }
12366
+ ],
12367
+ 0
12368
+ ),
11509
12369
  maxAngle: 30,
11510
- size: zoom9.linear([
12370
+ size: zoom10.linear([
11511
12371
  [1, 12],
11512
12372
  [8, 18]
11513
12373
  ])
@@ -11516,15 +12376,17 @@ var streets = bindOfficialMapTheme(
11516
12376
  waterway: {
11517
12377
  minZoom: 13,
11518
12378
  placement: "line",
11519
- spacing: zoom9.linear([
12379
+ spacing: zoom10.linear([
11520
12380
  [15, 250],
11521
12381
  [17, 400]
11522
12382
  ]),
11523
12383
  text: {
12384
+ font: streetsVisual.font.water,
11524
12385
  color: streetsDetailPalette.waterText,
11525
12386
  haloColor: streetsVisual.label.waterHalo,
12387
+ haloWidth: 0,
11526
12388
  maxAngle: 30,
11527
- size: zoom9.linear([
12389
+ size: zoom10.linear([
11528
12390
  [13, 12],
11529
12391
  [18, 18]
11530
12392
  ])
@@ -11535,13 +12397,14 @@ var streets = bindOfficialMapTheme(
11535
12397
  minZoom: 8,
11536
12398
  priority: 68,
11537
12399
  text: {
12400
+ font: streetsVisual.font.default,
11538
12401
  color: streetsDetailPalette.transit,
11539
12402
  haloColor: streetsDetailPalette.halo,
11540
12403
  haloWidth: 1,
11541
12404
  letterSpacing: 0.01,
11542
12405
  lineHeight: 1.1,
11543
12406
  maxWidth: 9,
11544
- size: zoom9.linear([
12407
+ size: zoom10.linear([
11545
12408
  [8, 12],
11546
12409
  [14, 15]
11547
12410
  ])
@@ -11552,9 +12415,9 @@ var streets = bindOfficialMapTheme(
11552
12415
  streetsLabelRenderStack()
11553
12416
  ),
11554
12417
  poi: poi4({
11555
- // World owns POI taxonomy, zoom eligibility and density tiers. Streets
11556
- // selects only the canonical categories and leaves final placement to
11557
- // MapLibre collision handling.
12418
+ // World owns taxonomy, zoom eligibility, density ranks and importance. Streets
12419
+ // shows every category at one density and places them all in World's importance
12420
+ // order, so collision keeps the most relevant places whatever their category.
11558
12421
  categories: [
11559
12422
  "transport",
11560
12423
  "food-drink",
@@ -11578,26 +12441,30 @@ var streets = bindOfficialMapTheme(
11578
12441
  icons: true,
11579
12442
  labels: true,
11580
12443
  placement: {
11581
- // One collision unit: the circular icon is required while its name is
11582
- // optional and may move around the marker when space is tight.
12444
+ // One collision unit: a POI shows its disc and its name, or nothing. Parking and
12445
+ // toilets, whose pictogram says what they are, show the disc alone.
11583
12446
  coupleIconAndLabel: true,
11584
- iconPadding: 10,
11585
- textPadding: 12
12447
+ iconPadding: 3,
12448
+ order: "importance",
12449
+ // Street and place names outrank everyday destinations ('navigation' labels), but
12450
+ // not the places that make a city recognisable: World's two most important ranks.
12451
+ prominentRank: 1,
12452
+ textPadding: 3
11586
12453
  },
11587
12454
  styles: {
11588
- "arts-entertainment": sparseStreetsPoiStyle,
11589
- education: deferredStreetsPoiStyle,
11590
- "food-drink": streetsPoiStyle,
11591
- landmark: deferredStreetsPoiStyle,
11592
- lodging: sparseStreetsPoiStyle,
11593
- medical: deferredStreetsPoiStyle,
11594
- "park-nature": deferredStreetsPoiStyle,
11595
- "public-services": deferredStreetsPoiStyle,
11596
- religion: deferredStreetsPoiStyle,
11597
- retail: streetsPoiStyle,
11598
- "sport-leisure": streetsPoiStyle,
11599
- transport: streetsPoiStyle,
11600
- "visitor-amenity": deferredStreetsPoiStyle
12455
+ "arts-entertainment": streetsPoiStyle("arts-entertainment"),
12456
+ education: streetsPoiStyle("education"),
12457
+ "food-drink": streetsPoiStyle("food-drink"),
12458
+ landmark: streetsPoiStyle("landmark"),
12459
+ lodging: streetsPoiStyle("lodging"),
12460
+ medical: streetsPoiStyle("medical"),
12461
+ "park-nature": streetsPoiStyle("park-nature"),
12462
+ "public-services": streetsPoiStyle("public-services"),
12463
+ religion: streetsPoiStyle("religion"),
12464
+ retail: streetsPoiStyle("retail"),
12465
+ "sport-leisure": streetsPoiStyle("sport-leisure"),
12466
+ transport: streetsPoiStyle("transport"),
12467
+ "visitor-amenity": streetsPoiStyle("visitor-amenity")
11601
12468
  }
11602
12469
  })
11603
12470
  },
@@ -11638,5 +12505,6 @@ export {
11638
12505
  soundingsIcons,
11639
12506
  streets2 as streets,
11640
12507
  streetsIcons,
12508
+ streetsModels,
11641
12509
  streetsThemes
11642
12510
  };