@tileflow/maps 0.1.0-alpha.8 → 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 +146 -4
  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 +1638 -766
  377. package/docs/design-and-assets.md +35 -14
  378. package/package.json +3 -3
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: {
@@ -2786,13 +2789,14 @@ var blueprint = bindOfficialMapTheme(
2786
2789
  }),
2787
2790
  poi: withRenderStack2(
2788
2791
  poi2({
2792
+ // Placed in this order: the primary callouts first.
2789
2793
  categories: [
2794
+ "transport",
2795
+ "medical",
2790
2796
  "arts-entertainment",
2791
2797
  "education",
2792
- "medical",
2793
2798
  "park-nature",
2794
2799
  "public-services",
2795
- "transport",
2796
2800
  "visitor-amenity"
2797
2801
  ],
2798
2802
  color: "category",
@@ -2803,6 +2807,9 @@ var blueprint = bindOfficialMapTheme(
2803
2807
  placement: {
2804
2808
  coupleIconAndLabel: false,
2805
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",
2806
2813
  textPadding: 7
2807
2814
  },
2808
2815
  styles: {
@@ -2817,7 +2824,8 @@ var blueprint = bindOfficialMapTheme(
2817
2824
  }),
2818
2825
  {
2819
2826
  architecturalCallouts: renderPass2({
2820
- 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" },
2821
2829
  feature: "poi",
2822
2830
  renderer: "symbol",
2823
2831
  selector: {
@@ -3432,7 +3440,7 @@ function footpath(minZoom) {
3432
3440
  function wash(color, minZoom, opacity = 1) {
3433
3441
  return { fill: { color, minZoom, opacity }, outline: { visible: false } };
3434
3442
  }
3435
- function place(minZoom, maxZoom, size, options = {}) {
3443
+ function place(minZoom, maxZoom, size2, options = {}) {
3436
3444
  return {
3437
3445
  minZoom,
3438
3446
  maxZoom,
@@ -3447,8 +3455,8 @@ function place(minZoom, maxZoom, size, options = {}) {
3447
3455
  maxWidth: 10,
3448
3456
  padding: 5,
3449
3457
  size: zoom3.linear([
3450
- [minZoom, size],
3451
- [Math.min(maxZoom, minZoom + 6), size + 5]
3458
+ [minZoom, size2],
3459
+ [Math.min(maxZoom, minZoom + 6), size2 + 5]
3452
3460
  ]),
3453
3461
  transform: "uppercase"
3454
3462
  }
@@ -3477,15 +3485,14 @@ function streetName(minZoom, major = false) {
3477
3485
  }
3478
3486
  };
3479
3487
  }
3480
- function destination(image, minZoom, color, featured = false, role = "caption") {
3488
+ function destination(image2, minZoom, color, featured = false, role = "caption") {
3481
3489
  const park = role === "park";
3482
3490
  const station = role === "station";
3483
3491
  const principalPark = expr3.lte(expr3.toNumber(expr3.get(field3("poiSizeRank")), 16), 4);
3484
3492
  return {
3485
3493
  minZoom,
3486
- density: featured ? 3 : 2,
3487
3494
  icon: {
3488
- image,
3495
+ image: image2,
3489
3496
  allowOverlap: false,
3490
3497
  ignorePlacement: false,
3491
3498
  optional: false,
@@ -4231,7 +4238,15 @@ var civica = bindOfficialMapTheme(
4231
4238
  minZoom: 12,
4232
4239
  icons: true,
4233
4240
  labels: true,
4234
- 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
+ },
4235
4250
  styles: {
4236
4251
  landmark: destination("civica-poi-monument", 13, ink.type, true),
4237
4252
  "arts-entertainment": destination("civica-poi-museum", 13.5, ink.type, true),
@@ -8427,24 +8442,23 @@ var soundings = bindOfficialMapTheme(
8427
8442
 
8428
8443
  // src/official/streets.ts
8429
8444
  import {
8445
+ addresses as addresses4,
8430
8446
  boundaries as boundaries8,
8431
8447
  buildings as buildings7,
8432
8448
  defineMap as defineMap8,
8433
- disable as disable6,
8434
- expr as expr9,
8435
- field as field8,
8449
+ expr as expr11,
8450
+ field as field10,
8436
8451
  fixed as fixed3,
8437
8452
  labels as labels8,
8438
8453
  land as land8,
8439
8454
  poi as poi4,
8440
8455
  refineRenderTarget as refineRenderTarget3,
8441
- renderPass as renderPass8,
8456
+ renderPass as renderPass9,
8442
8457
  roads as roads7,
8443
8458
  transit as transit8,
8444
- vegetation as vegetation6,
8445
8459
  water as water8,
8446
- withRenderStack as withRenderStack8,
8447
- zoom as zoom9
8460
+ withRenderStack as withRenderStack9,
8461
+ zoom as zoom10
8448
8462
  } from "@tileflow/core";
8449
8463
 
8450
8464
  // src/official/mapbox-rail.ts
@@ -8508,28 +8522,328 @@ function mapboxRailTransitStyle(color) {
8508
8522
  };
8509
8523
  }
8510
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
+
8511
8824
  // src/official/streets-themes.ts
8512
- import { defineTheme as defineTheme2, token as token4 } from "@tileflow/core";
8825
+ import { defineTheme as defineTheme2, token as token5 } from "@tileflow/core";
8513
8826
  var streetsLightColors = {
8514
8827
  "boundaries.admin": "#CE9298",
8515
8828
  "boundaries.default": "#CE9298",
8516
8829
  "boundaries.disputed": "#CE9298",
8517
- "boundaries.halo": "#F4F0EF",
8830
+ "boundaries.halo": "#F5F1F0",
8518
8831
  "boundaries.major": "#CE9298",
8519
8832
  "boundaries.maritime": "#648AA4",
8520
8833
  "boundaries.regional": "#CE9698",
8521
- "buildings.active": "#F3E9DF",
8834
+ "buildings.active": "#EFEADD",
8522
8835
  "buildings.businessCorridor": "#F4E6D8",
8523
8836
  "buildings.businessCorridorOutline": "#DCCFC3",
8524
- "buildings.civic": "#F3E9DF",
8525
- "buildings.commercial": "#F3E9DF",
8526
- "buildings.destination": "#F3E9DF",
8527
- "buildings.extrusion": "#EBE1D8",
8528
- "buildings.fill": "#F3E9DF",
8529
- "buildings.generic": "#F3E9DF",
8530
- "buildings.industrial": "#F3E9DF",
8531
- "buildings.outline": "#DED5CA",
8532
- "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",
8533
8847
  "buildings.shadow": "#BDB7B1",
8534
8848
  // Low-zoom bathymetry is composited over the ocean fill. These values are
8535
8849
  // deliberately pre-compensated so the rendered result, rather than the raw
@@ -8538,20 +8852,24 @@ var streetsLightColors = {
8538
8852
  "hydro.depth.m200": "#6ECEFE59",
8539
8853
  "hydro.depth.m2000": "#29B5FD59",
8540
8854
  "hydro.depth.m7000": "#15AFFA59",
8541
- "hydro.ferry": "#5A88A9",
8855
+ "hydro.ferry": "#479CEB",
8542
8856
  "hydro.label": "#5A88A9",
8543
8857
  "hydro.ocean": "#98DCFE",
8544
8858
  "hydro.water": "#98DCFE",
8545
8859
  "hydro.waterway": "#98DCFE",
8546
- "labels.country": "#303230",
8547
- "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",
8548
8866
  "labels.muted": "#6D6E6C",
8549
8867
  "labels.neighborhood": "#626361",
8550
8868
  "labels.overview": "#5B5C5A",
8551
8869
  "labels.poi": "#555654",
8552
8870
  "labels.primary": "#5B5C5A",
8553
- "labels.road": "#505050",
8554
- "labels.settlement": "#242624",
8871
+ "labels.road": "#404040",
8872
+ "labels.settlement": "#000000",
8555
8873
  "labels.shield.dark": "#1B1D27",
8556
8874
  "labels.shield.light": "#FFFFFF",
8557
8875
  "labels.strong": "#505050",
@@ -8566,72 +8884,72 @@ var streetsLightColors = {
8566
8884
  "landcover.global.shrub": "#D4F0C5",
8567
8885
  "landcover.global.snow": "#F4F7F8",
8568
8886
  "landcover.global.trees": "#C1EFBE",
8569
- "landcover.global.urban": "#F4F0EF",
8570
- "landcover.grass": "#CFF0C6",
8571
- "landcover.greenspace": "#B1EAAC",
8887
+ "landcover.global.urban": "#F5F1F0",
8888
+ "landcover.grass": "#C2EEBE",
8889
+ "landcover.greenspace": "#B3EAAD",
8572
8890
  "landcover.greenspaceDark": "#B8E0AE",
8573
8891
  "landcover.ice": "#F4F7F8",
8574
- "landcover.meadow": "#CFF0C6",
8892
+ "landcover.meadow": "#C2EEBE",
8575
8893
  "landcover.protected": "#D5E8D0",
8576
- "landcover.recreationGround": "#B1EAAC",
8894
+ "landcover.recreationGround": "#B3EAAD",
8577
8895
  "landcover.rock": "#E9E8ED",
8578
8896
  "landcover.sand": "#F0ECC6",
8579
8897
  "landcover.scrub": "#D2EEC6",
8580
- "landcover.urbanPark": "#B1EAAC",
8898
+ "landcover.urbanPark": "#B3EAAD",
8581
8899
  "landcover.villageGreen": "#C2E7B5",
8582
8900
  "landcover.wetland": "#D7E9DE",
8583
- "landcover.wood": "#9BE494",
8901
+ "landcover.wood": "#A7DFA0",
8584
8902
  "landuse.businessCorridor": "#FBEDE2",
8585
8903
  "landuse.businessCorridorOutline": "#E6D8CA",
8586
8904
  "landuse.cemetery": "#CCE5C6",
8587
- "landuse.civic": "#F4F0EF",
8905
+ "landuse.civic": "#F5F1F0",
8588
8906
  "landuse.commercial": "#FBEDE2",
8589
8907
  "landuse.education": "#ECE4D2",
8590
- "landuse.government": "#F4F0EF",
8908
+ "landuse.government": "#F5F1F0",
8591
8909
  "landuse.industrial": "#E8E8F0",
8592
8910
  "landuse.medical": "#EEE0DF",
8593
- "landuse.military": "#F4F0EF",
8911
+ "landuse.military": "#F5F1F0",
8594
8912
  "landuse.parking": "#E9E6E7",
8595
8913
  "landuse.parkingOutline": "#C8C8CF",
8596
8914
  "landuse.railway": "#E8E8F0",
8597
- "landuse.recreation": "#B1EAAC",
8915
+ "landuse.recreation": "#B3EAAD",
8598
8916
  "landuse.recreationOutline": "#AED7A5",
8599
8917
  "landuse.residential": "#F5F0EF",
8600
- "poi.arts-entertainment": "#B85CA4",
8601
- "poi.education": "#987A55",
8602
- "poi.food-drink": "#D7892C",
8918
+ "poi.arts-entertainment": "#F042B6",
8919
+ "poi.education": "#916130",
8920
+ "poi.food-drink": "#F57A00",
8603
8921
  "poi.halo": "#FFFFFF",
8604
8922
  "poi.icon": "#777876",
8605
8923
  "poi.label": "#555654",
8606
- "poi.landmark": "#B85CA4",
8607
- "poi.lodging": "#806DC4",
8608
- "poi.medical": "#C95E6B",
8609
- "poi.park-nature": "#4C9478",
8610
- "poi.public-services": "#667C9E",
8611
- "poi.religion": "#8A756B",
8612
- "poi.retail": "#557BC4",
8613
- "poi.sport-leisure": "#4C9478",
8614
- "poi.transport": "#5C74D6",
8615
- "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",
8616
8934
  "roads.bridge": "#BEC5D8",
8617
- "roads.casing": "#ADB3C3",
8618
- "roads.city.casing": "#E8E5E6",
8619
- "roads.city.minor": "#CDCED7",
8620
- "roads.city.primary": "#C1C6D3",
8621
- "roads.city.secondary": "#C2C6D6",
8622
- "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",
8623
8941
  "roads.city.tunnel": "#E0E0E5",
8624
8942
  "roads.city.tunnelCasing": "#C5C5CF",
8625
8943
  "roads.cycleway": "#67AD73",
8626
8944
  "roads.default": "#BEC5D8",
8627
- "roads.default.casing": "#ADB3C3",
8945
+ "roads.default.casing": "#9EA9C4",
8628
8946
  "roads.default.tunnel": "#DEE0E8",
8629
- "roads.ferry": "#5A88A9",
8630
- "roads.major": "#A1B0C2",
8947
+ "roads.ferry": "#479CEB",
8948
+ "roads.major": "#A1B0C4",
8631
8949
  "roads.minor": "#BEC5D8",
8632
- "roads.motorway": "#A1B0C2",
8950
+ "roads.motorway": "#A1B0C4",
8633
8951
  "roads.motorway.casing": "#8D9EAE",
8634
- "roads.motorway.tunnel": "#D5DCE0",
8952
+ "roads.motorway.tunnel": "#BEC8D6",
8635
8953
  "roads.parkPath": "#D8E1D8",
8636
8954
  "roads.path": "#EFECEF",
8637
8955
  "roads.path.casing": "#D1C7C7",
@@ -8641,15 +8959,19 @@ var streetsLightColors = {
8641
8959
  "roads.rail": "#8B8E99",
8642
8960
  "roads.railTransit": "#8E909D",
8643
8961
  "roads.secondary": "#BEC5D8",
8962
+ "roads.sidewalk.surface": "rgba(0, 0, 0, 0.06)",
8644
8963
  "roads.trunk": "#A3A6C2",
8645
8964
  "roads.trunk.casing": "#8F91AA",
8646
8965
  "roads.trunk.tunnel": "#C6C8D4",
8647
8966
  "roads.tunnel": "#DEE0E8",
8648
- "surface.background": "#F4F0EF",
8649
- "surface.building": "#F3E9DF",
8650
- "surface.land": "#F4F0EF",
8651
- "surface.park": "#B1EAAC",
8967
+ "surface.background": "#F5F1F0",
8968
+ "surface.building": "#EFEADD",
8969
+ "surface.land": "#F5F1F0",
8970
+ "surface.park": "#B3EAAD",
8652
8971
  "surface.water": "#98DCFE",
8972
+ "terrain.hillshade.accent": "#A6AB91",
8973
+ "terrain.hillshade.highlight": "#FFFFFF",
8974
+ "terrain.hillshade.shadow": "#727B64",
8653
8975
  "transit.primary": "#5C74D6",
8654
8976
  "vegetation.tree.bark": "#918878",
8655
8977
  "vegetation.tree.broadleaf.a": "#83AD83",
@@ -8675,6 +8997,7 @@ var streetsDarkColors = {
8675
8997
  "buildings.commercial": "#2C2E3D",
8676
8998
  "buildings.destination": "#3A3947",
8677
8999
  "buildings.extrusion": "#343646",
9000
+ "buildings.contactShadow": "#121522",
8678
9001
  "buildings.fill": "#2C2E3D",
8679
9002
  "buildings.generic": "#2C2E3D",
8680
9003
  "buildings.industrial": "#2C2E3D",
@@ -8691,7 +9014,11 @@ var streetsDarkColors = {
8691
9014
  "hydro.water": "#18223B",
8692
9015
  "hydro.waterway": "#18223B",
8693
9016
  "labels.country": "#A6A7AC",
9017
+ "labels.ferry": "#8799BE",
9018
+ "labels.ferryHalo": "#18223B",
8694
9019
  "labels.halo": "#252839",
9020
+ "labels.placeHalo": "#252839",
9021
+ "labels.roadHalo": "#252839",
8695
9022
  "labels.muted": "#8F9098",
8696
9023
  "labels.neighborhood": "#8F9098",
8697
9024
  "labels.overview": "#B2B1B7",
@@ -8745,19 +9072,19 @@ var streetsDarkColors = {
8745
9072
  "landuse.recreationOutline": "#63756A",
8746
9073
  "landuse.residential": "#2D3043",
8747
9074
  "poi.arts-entertainment": "#C786BC",
8748
- "poi.education": "#8F9098",
8749
- "poi.food-drink": "#D69A58",
9075
+ "poi.education": "#B6A783",
9076
+ "poi.food-drink": "#D8BD65",
8750
9077
  "poi.halo": "#252839",
8751
9078
  "poi.icon": "#8F9098",
8752
9079
  "poi.label": "#B8B7BD",
8753
9080
  "poi.landmark": "#C786BC",
8754
9081
  "poi.lodging": "#AA94DA",
8755
9082
  "poi.medical": "#DC7C89",
8756
- "poi.park-nature": "#76B59A",
9083
+ "poi.park-nature": "#89B871",
8757
9084
  "poi.public-services": "#8F9098",
8758
- "poi.religion": "#C786BC",
8759
- "poi.retail": "#76B59A",
8760
- "poi.sport-leisure": "#76B59A",
9085
+ "poi.religion": "#9DAAB0",
9086
+ "poi.retail": "#94BCE3",
9087
+ "poi.sport-leisure": "#89B871",
8761
9088
  "poi.transport": "#8296E6",
8762
9089
  "poi.visitor-amenity": "#8F9098",
8763
9090
  "roads.bridge": "#636779",
@@ -8788,6 +9115,7 @@ var streetsDarkColors = {
8788
9115
  "roads.rail": "#7C7F8C",
8789
9116
  "roads.railTransit": "#777B89",
8790
9117
  "roads.secondary": "#636779",
9118
+ "roads.sidewalk.surface": "rgba(255, 255, 255, 0.06)",
8791
9119
  "roads.trunk": "#6F7188",
8792
9120
  "roads.trunk.casing": "#505264",
8793
9121
  "roads.trunk.tunnel": "#5B5D70",
@@ -8797,6 +9125,9 @@ var streetsDarkColors = {
8797
9125
  "surface.land": "#2D3043",
8798
9126
  "surface.park": "#34453F",
8799
9127
  "surface.water": "#18223B",
9128
+ "terrain.hillshade.accent": "#252D36",
9129
+ "terrain.hillshade.highlight": "#576374",
9130
+ "terrain.hillshade.shadow": "#101827",
8800
9131
  "transit.primary": "#8296E6",
8801
9132
  "vegetation.tree.bark": "#52483D",
8802
9133
  "vegetation.tree.broadleaf.a": "#35473F",
@@ -8807,24 +9138,126 @@ var streetsDarkColors = {
8807
9138
  "vegetation.tree.conifer.b": "#384A40",
8808
9139
  "vegetation.tree.conifer.c": "#405348"
8809
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
+ }
8810
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.
8811
9249
  default: "Noto Sans Regular",
8812
- places: "Noto Sans Bold"
9250
+ places: "Noto Sans Bold",
9251
+ regular: "Noto Sans Regular",
9252
+ water: "Noto Sans Italic"
8813
9253
  };
8814
9254
  var streetsImages = {
8815
- "poi.arts-entertainment": "culture",
8816
- "poi.education": "education",
8817
- "poi.food-drink": "food",
8818
- "poi.landmark": "culture",
8819
- "poi.lodging": "lodging",
8820
- "poi.medical": "health",
8821
- "poi.park-nature": "services",
8822
- "poi.public-services": "services",
8823
- "poi.religion": "culture",
8824
- "poi.retail": "shopping",
8825
- "poi.sport-leisure": "culture",
8826
- "poi.transport": "major-transit",
8827
- "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
+ ),
8828
9261
  "roads.crosswalk": "crosswalk",
8829
9262
  "roads.oneway": "oneway",
8830
9263
  "roads.shield.circleNeutral": "road-shield-circle-neutral",
@@ -8836,95 +9269,136 @@ var streetsImages = {
8836
9269
  "roads.shield.rectangleYellow": "road-shield-rectangle-yellow",
8837
9270
  "roads.sidewalkPattern": "sidewalk-dot"
8838
9271
  };
8839
- var streetsThemes = Object.freeze({
8840
- light: defineTheme2({
8841
- id: "streets-light",
8842
- version: 1,
8843
- colorScheme: "light",
8844
- tokens: {
8845
- color: streetsLightColors,
8846
- number: {},
8847
- font: streetsFonts,
8848
- image: streetsImages
8849
- },
8850
- typography: {
8851
- font: token4.font("default"),
8852
- places: { font: token4.font("places") },
8853
- poi: { font: token4.font("default") },
8854
- roads: { font: token4.font("default") },
8855
- water: { font: token4.font("default") }
8856
- },
8857
- lighting: {
8858
- anchor: "viewport",
8859
- color: "#FFFFFF",
8860
- intensity: 0.15,
8861
- 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"
8862
9313
  }
8863
- }),
8864
- dark: defineTheme2({
8865
- 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}`,
8866
9334
  version: 1,
8867
- colorScheme: "dark",
9335
+ colorScheme: isDark ? "dark" : "light",
8868
9336
  tokens: {
8869
- color: streetsDarkColors,
8870
- number: {},
8871
- font: streetsFonts,
8872
- image: {
8873
- ...streetsImages,
8874
- "roads.sidewalkPattern": "sidewalk-dot-dark"
8875
- }
8876
- },
8877
- typography: {
8878
- font: token4.font("default"),
8879
- places: { font: token4.font("places") },
8880
- poi: { font: token4.font("default") },
8881
- roads: { font: token4.font("default") },
8882
- water: { font: token4.font("default") }
8883
- },
8884
- lighting: {
8885
- anchor: "viewport",
8886
- color: "#9FB6D0",
8887
- intensity: 0.08,
8888
- position: [1.15, 210, 30]
9337
+ color: streetsPaletteColors(preset, colorTheme),
9338
+ ...imageVariant ? { image: streetsPoiImageTokens(imageVariant) } : {}
8889
9339
  }
8890
- })
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")
8891
9355
  });
8892
9356
  var streetsVisual = {
8893
9357
  boundary: {
8894
- admin: token4.color("boundaries.admin"),
8895
- halo: token4.color("boundaries.halo"),
8896
- regional: token4.color("boundaries.regional"),
8897
- 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")
8898
9362
  },
8899
9363
  building: {
8900
- extrusion: token4.color("buildings.extrusion"),
8901
- fill: token4.color("buildings.fill"),
8902
- outline: token4.color("buildings.outline"),
8903
- 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")
8904
9374
  },
8905
9375
  hydro: {
8906
- depth0: token4.color("hydro.depth.m0"),
8907
- depth200: token4.color("hydro.depth.m200"),
8908
- depth2000: token4.color("hydro.depth.m2000"),
8909
- depth7000: token4.color("hydro.depth.m7000"),
8910
- ocean: token4.color("hydro.ocean"),
8911
- 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")
8912
9382
  },
8913
9383
  label: {
8914
- country: token4.color("labels.country"),
8915
- halo: token4.color("labels.halo"),
8916
- muted: token4.color("labels.muted"),
8917
- neighborhood: token4.color("labels.neighborhood"),
8918
- overview: token4.color("labels.overview"),
8919
- poi: token4.color("labels.poi"),
8920
- primary: token4.color("labels.primary"),
8921
- road: token4.color("labels.road"),
8922
- settlement: token4.color("labels.settlement"),
8923
- shieldDark: token4.color("labels.shield.dark"),
8924
- shieldLight: token4.color("labels.shield.light"),
8925
- strong: token4.color("labels.strong"),
8926
- water: token4.color("labels.water"),
8927
- 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")
8928
9402
  },
8929
9403
  landcover: Object.fromEntries(
8930
9404
  [
@@ -8945,12 +9419,12 @@ var streetsVisual = {
8945
9419
  "villageGreen",
8946
9420
  "wetland",
8947
9421
  "wood"
8948
- ].map((name) => [name, token4.color(`landcover.${name}`)])
9422
+ ].map((name) => [name, token5.color(`landcover.${name}`)])
8949
9423
  ),
8950
9424
  globalLandcover: Object.fromEntries(
8951
9425
  ["barren", "crop", "grass", "shrub", "snow", "trees", "urban"].map((name) => [
8952
9426
  name,
8953
- token4.color(`landcover.global.${name}`)
9427
+ token5.color(`landcover.global.${name}`)
8954
9428
  ])
8955
9429
  ),
8956
9430
  landuse: Object.fromEntries(
@@ -8971,7 +9445,7 @@ var streetsVisual = {
8971
9445
  "recreation",
8972
9446
  "recreationOutline",
8973
9447
  "residential"
8974
- ].map((name) => [name, token4.color(`landuse.${name}`)])
9448
+ ].map((name) => [name, token5.color(`landuse.${name}`)])
8975
9449
  ),
8976
9450
  poi: Object.fromEntries(
8977
9451
  [
@@ -8991,68 +9465,309 @@ var streetsVisual = {
8991
9465
  "sport-leisure",
8992
9466
  "transport",
8993
9467
  "visitor-amenity"
8994
- ].map((name) => [name, token4.color(`poi.${name}`)])
9468
+ ].map((name) => [name, token5.color(`poi.${name}`)])
8995
9469
  ),
8996
9470
  road: {
8997
- casing: token4.color("roads.default.casing"),
8998
- cityCasing: token4.color("roads.city.casing"),
8999
- cityMinor: token4.color("roads.city.minor"),
9000
- cityPrimary: token4.color("roads.city.primary"),
9001
- citySecondary: token4.color("roads.city.secondary"),
9002
- cityTertiary: token4.color("roads.city.tertiary"),
9003
- cityTunnel: token4.color("roads.city.tunnel"),
9004
- cityTunnelCasing: token4.color("roads.city.tunnelCasing"),
9005
- cycleway: token4.color("roads.cycleway"),
9006
- default: token4.color("roads.default"),
9007
- ferry: token4.color("roads.ferry"),
9008
- motorway: token4.color("roads.motorway"),
9009
- motorwayCasing: token4.color("roads.motorway.casing"),
9010
- motorwayTunnel: token4.color("roads.motorway.tunnel"),
9011
- parkPath: token4.color("roads.parkPath"),
9012
- path: token4.color("roads.path"),
9013
- pathCasing: token4.color("roads.path.casing"),
9014
- pathTransition: token4.color("roads.path.transition"),
9015
- pathTunnel: token4.color("roads.path.tunnel"),
9016
- rail: token4.color("roads.rail"),
9017
- railTransit: token4.color("roads.railTransit"),
9018
- trunk: token4.color("roads.trunk"),
9019
- trunkCasing: token4.color("roads.trunk.casing"),
9020
- trunkTunnel: token4.color("roads.trunk.tunnel"),
9021
- 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")
9022
9497
  },
9023
9498
  surface: {
9024
- background: token4.color("surface.background"),
9025
- building: token4.color("surface.building"),
9026
- land: token4.color("surface.land"),
9027
- park: token4.color("surface.park"),
9028
- 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")
9029
9504
  },
9030
- transit: token4.color("transit.primary"),
9505
+ transit: token5.color("transit.primary"),
9031
9506
  tree: {
9032
- bark: token4.color("vegetation.tree.bark"),
9507
+ bark: token5.color("vegetation.tree.bark"),
9033
9508
  broadleaf: ["a", "b", "c", "d"].map(
9034
- (suffix) => token4.color(`vegetation.tree.broadleaf.${suffix}`)
9509
+ (suffix) => token5.color(`vegetation.tree.broadleaf.${suffix}`)
9035
9510
  ),
9036
- 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}`))
9037
9512
  },
9038
9513
  image: {
9039
- crosswalk: token4.image("roads.crosswalk"),
9040
- oneway: token4.image("roads.oneway"),
9041
- shieldCircleNeutral: token4.image("roads.shield.circleNeutral"),
9042
- shieldRectangleBlue: token4.image("roads.shield.rectangleBlue"),
9043
- shieldRectangleGreen: token4.image("roads.shield.rectangleGreen"),
9044
- shieldRectangleNeutral: token4.image("roads.shield.rectangleNeutral"),
9045
- shieldRectangleOrange: token4.image("roads.shield.rectangleOrange"),
9046
- shieldRectangleRed: token4.image("roads.shield.rectangleRed"),
9047
- shieldRectangleYellow: token4.image("roads.shield.rectangleYellow"),
9048
- 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")
9049
9524
  },
9050
9525
  font: {
9051
- default: token4.font("default"),
9052
- places: token4.font("places")
9526
+ default: token5.font("default"),
9527
+ places: token5.font("places"),
9528
+ regular: token5.font("regular"),
9529
+ water: token5.font("water")
9053
9530
  }
9054
9531
  };
9055
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
+
9056
9771
  // src/official/streets.ts
9057
9772
  var streetsDetailPalette = {
9058
9773
  greenspace: streetsVisual.landcover.greenspace,
@@ -9130,7 +9845,7 @@ var streetsGlobalLandcoverPalette = {
9130
9845
  trees: streetsVisual.globalLandcover.trees,
9131
9846
  urban: streetsVisual.globalLandcover.urban
9132
9847
  };
9133
- var globalLandcoverOpacity = zoom9.linear([
9848
+ var globalLandcoverOpacity = zoom10.linear([
9134
9849
  // At world and country zooms the source classes are the terrain palette.
9135
9850
  // Blending them into the neutral land token desaturates forests and crops
9136
9851
  // into one pale wash, so keep the authored colours intact until the detailed
@@ -9145,39 +9860,54 @@ var globalLandcoverOpacity = zoom9.linear([
9145
9860
  [10.75, 0.25],
9146
9861
  [11, 0]
9147
9862
  ]);
9148
- var detailedLandcoverOpacity = zoom9.linear([
9863
+ var detailedLandcoverOpacity = zoom10.linear([
9149
9864
  [7, 0],
9150
9865
  [8, 0.35],
9151
9866
  [9, 0.7],
9152
9867
  [10, 0.9],
9153
9868
  [11, 1]
9154
9869
  ]);
9155
- var detailedUrbanGreenOpacity = zoom9.linear([
9870
+ var detailedUrbanGreenOpacity = zoom10.linear([
9156
9871
  [8, 0],
9157
9872
  [9, 1]
9158
9873
  ]);
9159
- var protectedAreaOpacity = zoom9.linear([
9874
+ var protectedAreaOpacity = zoom10.linear([
9160
9875
  [7, 0],
9161
9876
  [8, 0.28],
9162
9877
  [9, 0.32]
9163
9878
  ]);
9164
- var streetsPoiStyle = {
9165
- icon: {
9166
- size: zoom9.linear([
9167
- [12, 1.04],
9168
- [15, 1.1],
9169
- [17, 1.14]
9170
- ])
9171
- }
9172
- };
9173
- var sparseStreetsPoiStyle = {
9174
- ...streetsPoiStyle,
9175
- density: 2
9176
- };
9177
- var deferredStreetsPoiStyle = {
9178
- ...streetsPoiStyle,
9179
- minZoom: 15.5
9180
- };
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
+ }
9181
9911
  var mapboxBuildingPalette = {
9182
9912
  fill: streetsVisual.building.fill,
9183
9913
  outline: streetsVisual.building.outline
@@ -9206,7 +9936,7 @@ function cityRoadColorStops(minZoom, cityColor, detailedColor) {
9206
9936
  function cityRoadCasingColorStops(minZoom) {
9207
9937
  return cityRoadColorStops(minZoom, streetsDetailPalette.roadCasing, mapboxRoadPalette.roadCasing);
9208
9938
  }
9209
- var roadBorderZoom = 6;
9939
+ var roadBorderZoom = 15;
9210
9940
  var roadBorderTotalWidth = 1;
9211
9941
  var roadWidthInterpolationBase = 1.5;
9212
9942
  var roadSurfaceColor = mapboxRoadPalette.road;
@@ -9226,94 +9956,78 @@ var visibleBuilding3dSelector = {
9226
9956
  { field: "hide3d", kind: "compare", operator: "ne", value: "1" }
9227
9957
  ]
9228
9958
  };
9229
- 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(
9230
9988
  0,
9231
- expr9.toNumber(expr9.coalesce(expr9.get(field8("renderHeight")), 5), 5)
9989
+ expr11.toNumber(expr11.coalesce(expr11.get(field10("renderHeight")), 5), 5)
9232
9990
  );
9233
- var building3dBase = expr9.max(
9991
+ var building3dBase = expr11.max(
9234
9992
  0,
9235
- expr9.min(
9236
- expr9.toNumber(expr9.coalesce(expr9.get(field8("renderMinHeight")), 0), 0),
9993
+ expr11.min(
9994
+ expr11.toNumber(expr11.coalesce(expr11.get(field10("renderMinHeight")), 0), 0),
9237
9995
  building3dHeight
9238
9996
  )
9239
9997
  );
9240
- var circularRoadRadiusAtZ15 = expr9.toNumber(expr9.get(field8("circularRadiusAtZoom15")), 0);
9241
- var circularRoadRadiusMetres = expr9.toNumber(expr9.get(field8("circularRadiusMeters")), 0);
9242
- var circularRoadOuterRadiusMetres = expr9.toNumber(
9243
- 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")),
9244
10002
  0
9245
10003
  );
9246
- var circularRoadInnerRadiusMetres = expr9.toNumber(
9247
- expr9.get(field8("circularInnerRadiusMeters")),
10004
+ var circularRoadInnerRadiusMetres = expr11.toNumber(
10005
+ expr11.get(field10("circularInnerRadiusMeters")),
9248
10006
  0
9249
10007
  );
9250
- var roadNeedsStructuralButtCap = expr9.any(
9251
- expr9.eq(expr9.get(field8("brunnel")), "tunnel"),
9252
- expr9.eq(expr9.get(field8("class")), "steps"),
9253
- expr9.eq(expr9.get(field8("subclass")), "steps")
9254
- );
9255
- var roadNeedsControlledSurfaceButtCap = expr9.all(
9256
- expr9.match(
9257
- expr9.get(field8("brunnel")),
9258
- [{ labels: ["tunnel", "bridge"], value: false }],
9259
- true
9260
- ),
9261
- expr9.eq(expr9.get(field8("foot")), "no"),
9262
- expr9.match(
9263
- expr9.get(field8("class")),
9264
- [
9265
- {
9266
- labels: [
9267
- "motorway",
9268
- "trunk",
9269
- "primary",
9270
- "motorway_construction",
9271
- "trunk_construction",
9272
- "primary_construction"
9273
- ],
9274
- value: true
9275
- }
9276
- ],
9277
- false
9278
- )
9279
- );
9280
- var roadLineCap = expr9.step(
9281
- expr9.zoom(),
9282
- expr9.case([{ when: roadNeedsStructuralButtCap, value: "butt" }], "round"),
9283
- [
9284
- [
9285
- 17,
9286
- expr9.case(
9287
- [
9288
- {
9289
- when: expr9.any(roadNeedsStructuralButtCap, roadNeedsControlledSurfaceButtCap),
9290
- value: "butt"
9291
- }
9292
- ],
9293
- "round"
9294
- )
9295
- ]
9296
- ]
9297
- );
9298
- var roadLineJoin = zoom9.step([
10008
+ var roadLineCap = zoom10.step([
10009
+ [3, "butt"],
10010
+ [14, "round"]
10011
+ ]);
10012
+ var roadLineJoin = zoom10.step([
9299
10013
  [3, "miter"],
9300
10014
  [14, "round"]
9301
10015
  ]);
9302
- var pathLineCap = zoom9.step([
10016
+ var pathLineCap = zoom10.step([
9303
10017
  [12, "butt"],
9304
10018
  [16, "round"]
9305
10019
  ]);
9306
- var pathLineJoin = zoom9.step([
10020
+ var pathLineJoin = zoom10.step([
9307
10021
  [12, "miter"],
9308
10022
  [16, "round"]
9309
10023
  ]);
9310
- var hasPhysicalCircularRadii = expr9.all(
9311
- expr9.gt(circularRoadRadiusMetres, 0),
9312
- expr9.gt(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
9313
- expr9.gte(circularRoadInnerRadiusMetres, 0)
10024
+ var hasPhysicalCircularRadii = expr11.all(
10025
+ expr11.gt(circularRoadRadiusMetres, 0),
10026
+ expr11.gt(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
10027
+ expr11.gte(circularRoadInnerRadiusMetres, 0)
9314
10028
  );
9315
- var circularRoadBaseWidth = expr9.match(
9316
- expr9.coalesce(expr9.get(field8("class")), "minor"),
10029
+ var circularRoadBaseWidth = expr11.match(
10030
+ expr11.coalesce(expr11.get(field10("class")), "minor"),
9317
10031
  [
9318
10032
  { labels: "motorway", value: 6 },
9319
10033
  { labels: "trunk", value: 5.5 },
@@ -9329,7 +10043,7 @@ var circularRoadRadius = circularRoadInnerRadius(false);
9329
10043
  var circularRoadCasingRadius = circularRoadInnerRadius(true);
9330
10044
  var circularRoadWidth = circularRoadStrokeWidth(false);
9331
10045
  var circularRoadCasingWidth = circularRoadStrokeWidth(true);
9332
- var expresswayWidthScale = 1.06;
10046
+ var expresswayWidthScale = 1;
9333
10047
  var tunnelBorderDash = [3, 3];
9334
10048
  var tunnelBorderWidth = 1;
9335
10049
  function circularRoadFallbackScale(level) {
@@ -9339,29 +10053,29 @@ function circularRoadFallbackScale(level) {
9339
10053
  }
9340
10054
  function circularRoadWidthAtLevel(level) {
9341
10055
  const scale = circularRoadFallbackScale(level);
9342
- return level === 15 ? circularRoadBaseWidth : expr9.multiply(circularRoadBaseWidth, scale);
10056
+ return level === 15 ? circularRoadBaseWidth : expr11.multiply(circularRoadBaseWidth, scale);
9343
10057
  }
9344
10058
  function circularRoadCenterlineRadiusAtLevel(level) {
9345
- return level === 15 ? circularRoadRadiusAtZ15 : expr9.multiply(circularRoadRadiusAtZ15, 2 ** (level - 15));
10059
+ return level === 15 ? circularRoadRadiusAtZ15 : expr11.multiply(circularRoadRadiusAtZ15, 2 ** (level - 15));
9346
10060
  }
9347
10061
  function circularRoadInnerRadiusAtLevel(level, casing) {
9348
10062
  const centerlineRadius = circularRoadCenterlineRadiusAtLevel(level);
9349
- const physicalInnerRadius = expr9.multiply(
10063
+ const physicalInnerRadius = expr11.multiply(
9350
10064
  centerlineRadius,
9351
- expr9.divide(circularRoadInnerRadiusMetres, circularRoadRadiusMetres)
10065
+ expr11.divide(circularRoadInnerRadiusMetres, circularRoadRadiusMetres)
9352
10066
  );
9353
- const fallbackInnerRadius = expr9.subtract(
10067
+ const fallbackInnerRadius = expr11.subtract(
9354
10068
  centerlineRadius,
9355
- expr9.divide(circularRoadWidthAtLevel(level), 2)
10069
+ expr11.divide(circularRoadWidthAtLevel(level), 2)
9356
10070
  );
9357
- const innerRadius = expr9.case(
10071
+ const innerRadius = expr11.case(
9358
10072
  [{ when: hasPhysicalCircularRadii, value: physicalInnerRadius }],
9359
10073
  fallbackInnerRadius
9360
10074
  );
9361
- return expr9.max(0, casing ? expr9.subtract(innerRadius, roadBorderTotalWidth / 2) : innerRadius);
10075
+ return expr11.max(0, casing ? expr11.subtract(innerRadius, roadBorderTotalWidth / 2) : innerRadius);
9362
10076
  }
9363
10077
  function circularRoadInnerRadius(casing) {
9364
- return expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10078
+ return expr11.interpolate({ kind: "exponential", base: 2 }, expr11.zoom(), [
9365
10079
  [15, circularRoadInnerRadiusAtLevel(15, casing)],
9366
10080
  [16, circularRoadInnerRadiusAtLevel(16, casing)],
9367
10081
  [17, circularRoadInnerRadiusAtLevel(17, casing)],
@@ -9369,28 +10083,30 @@ function circularRoadInnerRadius(casing) {
9369
10083
  [19, circularRoadInnerRadiusAtLevel(19, casing)],
9370
10084
  [20, circularRoadInnerRadiusAtLevel(20, casing)],
9371
10085
  [21, circularRoadInnerRadiusAtLevel(21, casing)],
9372
- [22, circularRoadInnerRadiusAtLevel(22, casing)]
10086
+ [22, circularRoadInnerRadiusAtLevel(22, casing)],
10087
+ [23, circularRoadInnerRadiusAtLevel(23, casing)],
10088
+ [24, circularRoadInnerRadiusAtLevel(24, casing)]
9373
10089
  ]);
9374
10090
  }
9375
10091
  function circularRoadStrokeWidthAtLevel(level, casing) {
9376
10092
  const fallbackWidth = circularRoadWidthAtLevel(level);
9377
10093
  const centerlineRadius = circularRoadCenterlineRadiusAtLevel(level);
9378
- const physicalWidth = expr9.multiply(
10094
+ const physicalWidth = expr11.multiply(
9379
10095
  centerlineRadius,
9380
- expr9.divide(
9381
- expr9.subtract(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
10096
+ expr11.divide(
10097
+ expr11.subtract(circularRoadOuterRadiusMetres, circularRoadInnerRadiusMetres),
9382
10098
  circularRoadRadiusMetres
9383
10099
  )
9384
10100
  );
9385
- const physicalOutput = casing ? expr9.add(physicalWidth, roadBorderTotalWidth) : physicalWidth;
9386
- const fallbackOutput = casing ? expr9.add(fallbackWidth, roadBorderTotalWidth) : fallbackWidth;
9387
- 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(
9388
10104
  [{ when: hasPhysicalCircularRadii, value: physicalOutput }],
9389
10105
  fallbackOutput
9390
10106
  );
9391
10107
  }
9392
10108
  function circularRoadStrokeWidth(casing) {
9393
- return expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10109
+ return expr11.interpolate({ kind: "exponential", base: 2 }, expr11.zoom(), [
9394
10110
  [15, circularRoadStrokeWidthAtLevel(15, casing)],
9395
10111
  [16, circularRoadStrokeWidthAtLevel(16, casing)],
9396
10112
  [17, circularRoadStrokeWidthAtLevel(17, casing)],
@@ -9398,20 +10114,22 @@ function circularRoadStrokeWidth(casing) {
9398
10114
  [19, circularRoadStrokeWidthAtLevel(19, casing)],
9399
10115
  [20, circularRoadStrokeWidthAtLevel(20, casing)],
9400
10116
  [21, circularRoadStrokeWidthAtLevel(21, casing)],
9401
- [22, circularRoadStrokeWidthAtLevel(22, casing)]
10117
+ [22, circularRoadStrokeWidthAtLevel(22, casing)],
10118
+ [23, circularRoadStrokeWidthAtLevel(23, casing)],
10119
+ [24, circularRoadStrokeWidthAtLevel(24, casing)]
9402
10120
  ]);
9403
10121
  }
9404
10122
  function roadWidth(widths, oneWayScale, rampWidths) {
9405
10123
  const augmentedWidths = [...widths].sort(([left], [right]) => left - right);
9406
10124
  const widthOutput = (level, width) => {
9407
- const ordinaryWidth = oneWayScale === 1 ? width : expr9.match(
9408
- expr9.get(field8("oneway")),
10125
+ const ordinaryWidth = oneWayScale === 1 ? width : expr11.match(
10126
+ expr11.get(field10("oneway")),
9409
10127
  [{ labels: [1, -1], value: width * oneWayScale }],
9410
10128
  width
9411
10129
  );
9412
10130
  const rampWidth = rampWidths?.find(([rampLevel]) => rampLevel === level)?.[1];
9413
- const surfaceWidth = rampWidth === void 0 ? ordinaryWidth : expr9.case(
9414
- [{ 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 }],
9415
10133
  ordinaryWidth
9416
10134
  );
9417
10135
  return surfaceWidth;
@@ -9421,35 +10139,26 @@ function roadWidth(widths, oneWayScale, rampWidths) {
9421
10139
  );
9422
10140
  const firstWidthStop = widthStops[0];
9423
10141
  if (firstWidthStop === void 0) throw new Error("Road widths require at least one zoom stop.");
9424
- return expr9.interpolate({ base: roadWidthInterpolationBase, kind: "exponential" }, expr9.zoom(), [
10142
+ return expr11.interpolate({ base: roadWidthInterpolationBase, kind: "exponential" }, expr11.zoom(), [
9425
10143
  firstWidthStop,
9426
10144
  ...widthStops.slice(1)
9427
10145
  ]);
9428
10146
  }
9429
- function roadCasingStrokeWidth() {
9430
- return zoom9.linear([
9431
- // Keep the visible border below one physical pixel at ordinary city
9432
- // zooms. A full 1 px stroke per side can cover a second pixel column on
9433
- // curved or fractionally positioned lines and make one edge look doubled.
9434
- [6, 0.4],
9435
- [12, 0.55],
9436
- [15, 0.75],
9437
- [18, 1],
9438
- [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]
9439
10154
  ]);
9440
10155
  }
9441
- var tunnelRoadCasingWidth = zoom9.linear([
9442
- [15, 0],
9443
- [15.5, tunnelBorderWidth],
9444
- [22, tunnelBorderWidth]
9445
- ]);
9446
- var pathCasingStrokeWidth = zoom9.exponential(1.5, [
9447
- [15, 0],
9448
- [15.5, 0.5],
10156
+ var pathCasingStrokeWidth = zoom10.exponential(1.5, [
10157
+ [14, 0.5],
9449
10158
  [18, 1],
9450
10159
  [22, 2]
9451
10160
  ]);
9452
- var pathTunnelCasingWidth = zoom9.linear([
10161
+ var pathTunnelCasingWidth = zoom10.linear([
9453
10162
  [15, 0],
9454
10163
  [15.5, tunnelBorderWidth],
9455
10164
  [22, tunnelBorderWidth]
@@ -9459,62 +10168,15 @@ var mapboxPathWidthStops = [
9459
10168
  [18, 6],
9460
10169
  [22, 80]
9461
10170
  ];
9462
- var googleParkPathWidthStops = [
9463
- [12, 0],
9464
- [15, 0.75],
9465
- [16, 1],
9466
- [18, 2],
9467
- [22, 20]
9468
- ];
9469
- var unpavedPathCondition = expr9.eq(expr9.get(field8("surface")), "unpaved");
9470
- var contextualPathLineWidth = expr9.interpolate(
9471
- { base: 1.5, kind: "exponential" },
9472
- expr9.zoom(),
9473
- [
9474
- [12, expr9.case([{ when: unpavedPathCondition, value: 0 }], 0)],
9475
- [15, expr9.case([{ when: unpavedPathCondition, value: 0.75 }], 1)],
9476
- [16, expr9.case([{ when: unpavedPathCondition, value: 1 }], 1.5)],
9477
- [17, expr9.case([{ when: unpavedPathCondition, value: 1.4 }], 3)],
9478
- [18, expr9.case([{ when: unpavedPathCondition, value: 2 }], 6)],
9479
- [19, expr9.case([{ when: unpavedPathCondition, value: 3.7 }], 12)],
9480
- [20, expr9.case([{ when: unpavedPathCondition, value: 7.5 }], 22)],
9481
- [22, expr9.case([{ when: unpavedPathCondition, value: 20 }], 60)]
9482
- ]
9483
- );
9484
- var contextualPathColor = expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
9485
- [
9486
- 15,
9487
- expr9.case(
9488
- [{ when: unpavedPathCondition, value: streetsDetailPalette.parkPath }],
9489
- mapboxRoadPalette.pathAtZ15
9490
- )
9491
- ],
9492
- [
9493
- 16,
9494
- expr9.case(
9495
- [{ when: unpavedPathCondition, value: streetsDetailPalette.parkPath }],
9496
- mapboxRoadPalette.pathFromZ16
9497
- )
9498
- ]
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]
9499
10175
  ]);
9500
- var contextualPathCasingColor = expr9.case(
9501
- [{ when: unpavedPathCondition, value: streetsDetailPalette.parkPath }],
9502
- mapboxRoadPalette.pathCasing
9503
- );
9504
- var contextualPathCasingWidth = expr9.interpolate(
9505
- { base: 1.5, kind: "exponential" },
9506
- expr9.zoom(),
9507
- [
9508
- [15, expr9.case([{ when: unpavedPathCondition, value: 0 }], 0)],
9509
- [15.5, expr9.case([{ when: unpavedPathCondition, value: 0 }], 0.5)],
9510
- [18, expr9.case([{ when: unpavedPathCondition, value: 0 }], 1)],
9511
- [22, expr9.case([{ when: unpavedPathCondition, value: 0 }], 2)]
9512
- ]
9513
- );
9514
- var googleParkPathClasses = ["pathway", "footway", "steps", "pedestrian"];
9515
- function googleParkPathRefinements() {
10176
+ var parkPathClasses = ["pathway", "footway", "steps", "pedestrian"];
10177
+ function parkPathRefinements() {
9516
10178
  return Object.fromEntries(
9517
- googleParkPathClasses.flatMap(
10179
+ parkPathClasses.flatMap(
9518
10180
  (roadClass) => ["surface", "bridge"].flatMap((structure) => [
9519
10181
  [
9520
10182
  `${roadClass}-${structure}-fill`,
@@ -9522,6 +10184,7 @@ function googleParkPathRefinements() {
9522
10184
  renderer: "line",
9523
10185
  style: {
9524
10186
  color: roadClass === "steps" ? mapboxRoadPalette.pathFromZ16 : contextualPathColor,
10187
+ minZoom: roadClass === "steps" ? 14 : structure === "surface" ? 12 : roadClass === "pedestrian" ? 13 : 14,
9525
10188
  ...roadClass === "steps" ? { dash: [0.18, 0.15] } : {},
9526
10189
  width: contextualPathLineWidth
9527
10190
  },
@@ -9533,9 +10196,10 @@ function googleParkPathRefinements() {
9533
10196
  refineRenderTarget3({
9534
10197
  renderer: "line",
9535
10198
  style: {
9536
- color: contextualPathCasingColor,
10199
+ color: mapboxRoadPalette.pathCasing,
10200
+ minZoom: roadClass === "steps" || roadClass === "pedestrian" && structure === "surface" ? 14 : 15,
9537
10201
  gapWidth: roadClass === "steps" ? 0 : contextualPathLineWidth,
9538
- width: roadClass === "steps" ? contextualPathLineWidth : contextualPathCasingWidth
10202
+ width: roadClass === "steps" ? contextualPathLineWidth : pathCasingStrokeWidth
9539
10203
  },
9540
10204
  target: `roads.classes.${roadClass}.${structure}.casing`
9541
10205
  })
@@ -9585,7 +10249,7 @@ var namedCitySelector = {
9585
10249
  };
9586
10250
  function streetsBoundaryRenderStack() {
9587
10251
  return {
9588
- admin2Background: renderPass8({
10252
+ admin2Background: renderPass9({
9589
10253
  placement: { below: "boundaries.admin4" },
9590
10254
  feature: "boundary",
9591
10255
  renderer: "line",
@@ -9611,23 +10275,23 @@ function streetsBoundaryRenderStack() {
9611
10275
  ]
9612
10276
  },
9613
10277
  style: {
9614
- blur: zoom9.linear([
10278
+ blur: zoom10.linear([
9615
10279
  [3, 0],
9616
10280
  [12, 2]
9617
10281
  ]),
9618
10282
  color: streetsVisual.boundary.halo,
9619
10283
  minZoom: 1,
9620
- opacity: zoom9.linear([
10284
+ opacity: zoom10.linear([
9621
10285
  [3, 0],
9622
10286
  [4, 0.5]
9623
10287
  ]),
9624
- width: zoom9.linear([
10288
+ width: zoom10.linear([
9625
10289
  [3, 4],
9626
10290
  [12, 8]
9627
10291
  ])
9628
10292
  }
9629
10293
  }),
9630
- admin4Background: renderPass8({
10294
+ admin4Background: renderPass9({
9631
10295
  placement: { below: "boundaries.admin4" },
9632
10296
  feature: "boundary",
9633
10297
  renderer: "line",
@@ -9653,17 +10317,17 @@ function streetsBoundaryRenderStack() {
9653
10317
  ]
9654
10318
  },
9655
10319
  style: {
9656
- blur: zoom9.linear([
10320
+ blur: zoom10.linear([
9657
10321
  [3, 0],
9658
10322
  [12, 1]
9659
10323
  ]),
9660
10324
  color: streetsVisual.boundary.halo,
9661
10325
  minZoom: 2,
9662
- opacity: zoom9.linear([
10326
+ opacity: zoom10.linear([
9663
10327
  [2, 0],
9664
10328
  [4, 0.42]
9665
10329
  ]),
9666
- width: zoom9.linear([
10330
+ width: zoom10.linear([
9667
10331
  [3, 2.4],
9668
10332
  [6, 3.1],
9669
10333
  [12, 4.2]
@@ -9674,7 +10338,7 @@ function streetsBoundaryRenderStack() {
9674
10338
  // module deliberately exposes only the stable admin-2/admin-4 pair.
9675
10339
  // Standard uses the next tier as a restrained dotted municipal cue from
9676
10340
  // metro zooms onward, so Streets adds it as an explicit semantic pass.
9677
- admin6: renderPass8({
10341
+ admin6: renderPass9({
9678
10342
  placement: { above: "boundaries.admin4" },
9679
10343
  feature: "boundary",
9680
10344
  renderer: "line",
@@ -9703,12 +10367,12 @@ function streetsBoundaryRenderStack() {
9703
10367
  color: streetsVisual.boundary.regional,
9704
10368
  dash: [1, 1.5],
9705
10369
  minZoom: 8,
9706
- opacity: zoom9.linear([
10370
+ opacity: zoom10.linear([
9707
10371
  [8, 0],
9708
10372
  [9, 0.5],
9709
10373
  [12, 0.68]
9710
10374
  ]),
9711
- width: zoom9.linear([
10375
+ width: zoom10.linear([
9712
10376
  [8, 0.45],
9713
10377
  [10, 0.7],
9714
10378
  [12, 0.95]
@@ -9719,7 +10383,27 @@ function streetsBoundaryRenderStack() {
9719
10383
  }
9720
10384
  function streetsLandRenderStack() {
9721
10385
  return {
9722
- 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({
9723
10407
  placement: { above: "land.landuse.residential.fill" },
9724
10408
  feature: "landuse",
9725
10409
  renderer: "fill",
@@ -9737,7 +10421,7 @@ function streetsBuildingRenderStack() {
9737
10421
  // Keep just enough ambient separation for dense footprint clusters. The
9738
10422
  // fill and its close-colour outline carry the 2D building hierarchy; a
9739
10423
  // dark shadow at z15 would turn every footprint into a heavy sticker.
9740
- flatShadow: renderPass8({
10424
+ flatShadow: renderPass9({
9741
10425
  placement: { below: "buildings.flat.fill" },
9742
10426
  feature: "building",
9743
10427
  renderer: "line",
@@ -9745,7 +10429,7 @@ function streetsBuildingRenderStack() {
9745
10429
  blur: 2,
9746
10430
  color: buildingShadowColor,
9747
10431
  minZoom: 15.5,
9748
- opacity: zoom9.linear([
10432
+ opacity: zoom10.linear([
9749
10433
  [15.5, 0],
9750
10434
  [16, 0.03],
9751
10435
  [18, 0.08],
@@ -9753,7 +10437,7 @@ function streetsBuildingRenderStack() {
9753
10437
  ]),
9754
10438
  translate: [0.5, 0.75],
9755
10439
  translateAnchor: "viewport",
9756
- width: zoom9.linear([
10440
+ width: zoom10.linear([
9757
10441
  [15.5, 0.5],
9758
10442
  [16, 1],
9759
10443
  [18, 3],
@@ -9761,38 +10445,69 @@ function streetsBuildingRenderStack() {
9761
10445
  ])
9762
10446
  }
9763
10447
  }),
9764
- shadowSoft: renderPass8({
10448
+ shadowSoft: renderPass9({
9765
10449
  placement: { below: "buildings.flat.fill" },
9766
10450
  feature: "building",
9767
10451
  renderer: "line",
9768
- selector: visibleBuilding3dSelector,
10452
+ selector: groundedBuilding3dSelector,
9769
10453
  style: {
9770
- blur: 7,
9771
- color: buildingShadowColor,
9772
- minZoom: 16,
9773
- opacity: 0.12,
9774
- translate: [3, 5],
9775
- 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
+ ]),
9776
10471
  visibilityGroup: "building",
9777
- width: 9
10472
+ width: zoom10.linear([
10473
+ [15.5, 1],
10474
+ [16.5, 4],
10475
+ [18, 10],
10476
+ [20, 18]
10477
+ ])
9778
10478
  }
9779
10479
  }),
9780
- shadowCore: renderPass8({
10480
+ shadowCore: renderPass9({
9781
10481
  placement: { below: "buildings.flat.fill" },
9782
10482
  feature: "building",
9783
- renderer: "fill",
9784
- selector: visibleBuilding3dSelector,
10483
+ renderer: "line",
10484
+ selector: groundedBuilding3dSelector,
9785
10485
  style: {
9786
- antialias: true,
9787
- color: buildingShadowColor,
9788
- minZoom: 16,
9789
- opacity: 0.1,
9790
- translate: [2, 4],
9791
- translateAnchor: "viewport",
9792
- 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
+ ])
9793
10508
  }
9794
10509
  }),
9795
- extrusion: renderPass8({
10510
+ extrusion: renderPass9({
9796
10511
  placement: { above: "buildings.flat.outline" },
9797
10512
  feature: "building",
9798
10513
  renderer: "extrusion",
@@ -9811,7 +10526,89 @@ function streetsBuildingRenderStack() {
9811
10526
  }
9812
10527
  function streetsLabelRenderStack() {
9813
10528
  return {
9814
- 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({
9815
10612
  placement: { below: "labels.places.city" },
9816
10613
  feature: "place",
9817
10614
  renderer: "circle",
@@ -9820,7 +10617,7 @@ function streetsLabelRenderStack() {
9820
10617
  color: streetsVisual.label.settlement,
9821
10618
  maxZoom: 8,
9822
10619
  minZoom: 2,
9823
- radius: expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 3, [
10620
+ radius: expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 3, [
9824
10621
  [3, 2.5],
9825
10622
  [7, 2]
9826
10623
  ]),
@@ -9834,7 +10631,15 @@ function streetsLabelRenderStack() {
9834
10631
  kind: "all",
9835
10632
  selectors: [
9836
10633
  { field: "name", kind: "has" },
9837
- { 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
+ }
9838
10643
  ]
9839
10644
  },
9840
10645
  style: {},
@@ -9928,8 +10733,11 @@ function streetsLabelRenderStack() {
9928
10733
  fallback: rankAtMost(18),
9929
10734
  kind: "step",
9930
10735
  stops: [
9931
- { selector: rankAtMost(16), zoom: 12 },
9932
- { 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 }
9933
10741
  ]
9934
10742
  }
9935
10743
  ]
@@ -9939,9 +10747,50 @@ function streetsLabelRenderStack() {
9939
10747
  })
9940
10748
  };
9941
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
+ }
9942
10790
  function streetsRoadRenderStack() {
9943
10791
  return {
9944
- ...googleParkPathRefinements(),
10792
+ ...parkPathRefinements(),
10793
+ ...streetsRoadEligibility(),
9945
10794
  oneWayMarkers: refineRenderTarget3({
9946
10795
  renderer: "symbol",
9947
10796
  style: {
@@ -9950,27 +10799,27 @@ function streetsRoadRenderStack() {
9950
10799
  ignorePlacement: true,
9951
10800
  image: streetsVisual.image.oneway,
9952
10801
  keepUpright: false,
9953
- opacity: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
9954
- [15, 0],
9955
- [15.5, 0.92],
9956
- [16, 1]
10802
+ opacity: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
10803
+ [16.5, 0],
10804
+ [17, 0.92],
10805
+ [17.5, 1]
9957
10806
  ]),
9958
10807
  padding: 0,
9959
10808
  pitchAlignment: "map",
9960
- rotate: expr9.case(
9961
- [{ 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 }],
9962
10811
  0
9963
10812
  ),
9964
10813
  rotationAlignment: "map",
9965
- size: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10814
+ size: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
9966
10815
  [15, 0.38],
9967
10816
  [17, 0.55],
9968
10817
  [19, 0.7],
9969
10818
  [22, 1]
9970
10819
  ])
9971
10820
  },
9972
- minZoom: 15,
9973
- spacing: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10821
+ minZoom: 16.5,
10822
+ spacing: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
9974
10823
  [15, 95],
9975
10824
  [17, 115],
9976
10825
  [19, 150],
@@ -9978,8 +10827,8 @@ function streetsRoadRenderStack() {
9978
10827
  ]),
9979
10828
  text: {
9980
10829
  allowOverlap: true,
9981
- field: expr9.case(
9982
- [{ 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" }],
9983
10832
  "\u2192"
9984
10833
  ),
9985
10834
  ignorePlacement: true,
@@ -9988,7 +10837,7 @@ function streetsRoadRenderStack() {
9988
10837
  padding: 0,
9989
10838
  pitchAlignment: "map",
9990
10839
  rotationAlignment: "map",
9991
- size: expr9.interpolate({ kind: "linear" }, expr9.zoom(), [
10840
+ size: expr11.interpolate({ kind: "linear" }, expr11.zoom(), [
9992
10841
  [15, 11],
9993
10842
  [17, 17],
9994
10843
  [19, 20],
@@ -10025,6 +10874,7 @@ function cityRoadStyle(color, widths, options = {}) {
10025
10874
  casingMinZoom = roadBorderZoom,
10026
10875
  colorStops,
10027
10876
  minZoom,
10877
+ major = false,
10028
10878
  oneWayScale = 1,
10029
10879
  rampWidths,
10030
10880
  tunnelCasingColor = streetsDetailPalette.roadTunnelBorder,
@@ -10032,12 +10882,12 @@ function cityRoadStyle(color, widths, options = {}) {
10032
10882
  tunnelVisible = true
10033
10883
  } = options;
10034
10884
  const zoomRange = minZoom === void 0 ? {} : { minZoom };
10035
- const opacity = zoom9.linear([
10885
+ const opacity = zoom10.linear([
10036
10886
  [3, 0],
10037
10887
  [3.5, 1]
10038
10888
  ]);
10039
- const surfaceColor = colorStops ? zoom9.linear(colorStops) : color;
10040
- const resolvedCasingColor = zoom9.linear(roadCasingColorStops(casingColorStops));
10889
+ const surfaceColor = colorStops ? zoom10.linear(colorStops) : color;
10890
+ const resolvedCasingColor = zoom10.linear(roadCasingColorStops(casingColorStops));
10041
10891
  const fill = {
10042
10892
  ...zoomRange,
10043
10893
  cap: roadLineCap,
@@ -10054,29 +10904,36 @@ function cityRoadStyle(color, widths, options = {}) {
10054
10904
  cap: roadLineCap,
10055
10905
  // Border reads as a subtle shade of the road itself rather than a white halo.
10056
10906
  color: resolvedCasingColor,
10057
- gapWidth: fill.width,
10907
+ gapWidth: roadWidth(widths, oneWayScale, rampWidths),
10058
10908
  join: roadLineJoin,
10059
10909
  opacity,
10060
- width: roadCasingStrokeWidth()
10910
+ width: roadCasingWidth(major)
10061
10911
  };
10062
10912
  return {
10063
10913
  surface: { casing, fill },
10064
- 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
+ },
10065
10918
  tunnel: tunnelVisible ? {
10066
10919
  casing: {
10067
10920
  ...casing,
10068
- cap: roadLineCap,
10921
+ cap: "butt",
10922
+ join: "miter",
10923
+ minZoom: minZoom === 3 ? 13 : (minZoom ?? 0) < 12 ? 14 : minZoom === 12 ? 15 : 16,
10069
10924
  color: tunnelCasingColor,
10070
10925
  dash: tunnelBorderDash,
10071
10926
  gapWidth: roadWidth(widths, oneWayScale, rampWidths),
10072
10927
  opacity: 1,
10073
- width: tunnelRoadCasingWidth
10928
+ width: roadCasingWidth((minZoom ?? 0) < 12)
10074
10929
  },
10075
10930
  fill: {
10076
10931
  ...fill,
10077
- cap: roadLineCap,
10932
+ cap: "butt",
10933
+ join: "miter",
10934
+ minZoom: Math.max(minZoom ?? 0, 13),
10078
10935
  color: tunnelColor,
10079
- opacity: zoom9.linear([
10936
+ opacity: zoom10.linear([
10080
10937
  [3, 0],
10081
10938
  [3.5, 0.8]
10082
10939
  ])
@@ -10094,7 +10951,7 @@ function cityRoadStyle(color, widths, options = {}) {
10094
10951
  }
10095
10952
  function pathRoadStyle(color, widths, options = {}) {
10096
10953
  const zoomRange = options.minZoom === void 0 ? {} : { minZoom: options.minZoom };
10097
- const surfaceColor = options.colorStops ? zoom9.linear(options.colorStops) : color;
10954
+ const surfaceColor = options.colorStops ? zoom10.linear(options.colorStops) : color;
10098
10955
  const cap = options.steps ? "butt" : pathLineCap;
10099
10956
  const tunnelCap = "butt";
10100
10957
  const join = options.steps ? "round" : pathLineJoin;
@@ -10143,12 +11000,43 @@ function pathRoadStyle(color, widths, options = {}) {
10143
11000
  }
10144
11001
  };
10145
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
+ }
10146
11033
  function roadLabelStyle(kind) {
10147
11034
  const major = kind === "major";
10148
11035
  const pedestrian = kind === "pedestrian";
10149
11036
  const path = kind === "path";
10150
- const startSize = major ? 9 : pedestrian ? 9 : path ? 6.5 : 8;
10151
- 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;
10152
11040
  return {
10153
11041
  placement: "line",
10154
11042
  priority: major ? 90 : 50,
@@ -10156,12 +11044,14 @@ function roadLabelStyle(kind) {
10156
11044
  text: {
10157
11045
  color: streetsVisual.label.road,
10158
11046
  font: streetsVisual.font.default,
10159
- haloColor: streetsDetailPalette.halo,
11047
+ haloColor: streetsVisual.label.roadHalo,
10160
11048
  haloWidth: 1,
10161
11049
  letterSpacing: path || pedestrian ? 0.01 : 0.15,
10162
11050
  maxAngle: 30,
10163
11051
  padding: 1,
10164
- size: zoom9.linear([
11052
+ pitchAlignment: "map",
11053
+ rotationAlignment: "map",
11054
+ size: zoom10.linear([
10165
11055
  [10, startSize],
10166
11056
  [18, endSize]
10167
11057
  ]),
@@ -10177,9 +11067,19 @@ var streets = bindOfficialMapTheme(
10177
11067
  glyphs: {
10178
11068
  kind: "url",
10179
11069
  url: "https://api.tileflow.dev/base/33d4de5e8086d9d629d67d3f39fedb87e23686c4c1ac653c27e2a52aee9d00b3/glyphs/{fontstack}/{range}.pbf",
10180
- fontStacks: ["Noto Sans Regular", "Noto Sans Bold"]
11070
+ fontStacks: ["Noto Sans Regular", "Noto Sans Bold", "Noto Sans Italic"]
10181
11071
  },
10182
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
+ },
10183
11083
  defaultTheme: "light",
10184
11084
  systemThemes: { light: "light", dark: "dark" },
10185
11085
  projection: "globe",
@@ -10190,25 +11090,57 @@ var streets = bindOfficialMapTheme(
10190
11090
  type: "tileflow-world"
10191
11091
  },
10192
11092
  icons: [streetsIcons],
10193
- // The development terrain archive currently returns uncached tiles in the reviewed cities.
10194
- // Keep it disabled until that archive is complete so navigation does not wait on failed DEM requests.
10195
- 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
+ },
10196
11112
  modules: {
10197
11113
  // Optional keys: addresses, aeroways, boundaries, buildings, labels, land,
10198
11114
  // landforms, poi, roads, transit, vegetation, water. Object order never
10199
11115
  // controls layer order.
10200
11116
  // Streets deliberately omits parcel-level house numbers. POI and road/place
10201
11117
  // labels carry the useful navigation hierarchy without close-zoom numeric noise.
10202
- addresses: disable6(),
10203
- 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(
10204
11136
  land8({
10205
11137
  background: {
10206
11138
  color: streetsSurfacePalette.background,
10207
11139
  opacity: 1
10208
11140
  },
10209
11141
  globalLandcover: {
10210
- color: expr9.match(
10211
- expr9.get(field8("class")),
11142
+ color: expr11.match(
11143
+ expr11.get(field10("class")),
10212
11144
  [
10213
11145
  { labels: "barren", value: streetsGlobalLandcoverPalette.barren },
10214
11146
  { labels: "crop", value: streetsGlobalLandcoverPalette.crop },
@@ -10344,7 +11276,7 @@ var streets = bindOfficialMapTheme(
10344
11276
  industrial: { fill: { color: streetsSurfacePalette.industrial, opacity: 1 } },
10345
11277
  medical: { fill: { color: streetsSurfacePalette.medical, opacity: 1 } },
10346
11278
  parking: {
10347
- fill: { color: streetsSurfacePalette.parking, minZoom: 15, opacity: 0.9 },
11279
+ fill: { color: streetsSurfacePalette.parking, minZoom: 15, opacity: 1 },
10348
11280
  outline: {
10349
11281
  color: streetsSurfacePalette.parkingOutline,
10350
11282
  minZoom: 16,
@@ -10374,9 +11306,9 @@ var streets = bindOfficialMapTheme(
10374
11306
  water: water8({
10375
11307
  bathymetry: {
10376
11308
  antialias: false,
10377
- color: expr9.interpolate(
11309
+ color: expr11.interpolate(
10378
11310
  { kind: "linear" },
10379
- expr9.multiply(-1, expr9.toNumber(expr9.get(field8("bathymetryMinDepth")), 0)),
11311
+ expr11.multiply(-1, expr11.toNumber(expr11.get(field10("bathymetryMinDepth")), 0)),
10380
11312
  [
10381
11313
  [0, streetsSurfacePalette.waterDepth0],
10382
11314
  [200, streetsSurfacePalette.waterDepth200],
@@ -10386,7 +11318,7 @@ var streets = bindOfficialMapTheme(
10386
11318
  ),
10387
11319
  maxZoom: 8,
10388
11320
  minZoom: 0,
10389
- opacity: zoom9.linear([
11321
+ opacity: zoom10.linear([
10390
11322
  [0, 1],
10391
11323
  [6, 1],
10392
11324
  [8, 0]
@@ -10394,8 +11326,8 @@ var streets = bindOfficialMapTheme(
10394
11326
  },
10395
11327
  bodies: {
10396
11328
  fill: {
10397
- color: expr9.match(
10398
- expr9.get(field8("class")),
11329
+ color: expr11.match(
11330
+ expr11.get(field10("class")),
10399
11331
  [{ labels: ["ocean", "sea"], value: streetsSurfacePalette.waterOcean }],
10400
11332
  streetsSurfacePalette.water
10401
11333
  ),
@@ -10420,7 +11352,7 @@ var streets = bindOfficialMapTheme(
10420
11352
  join: "round",
10421
11353
  minZoom: 8,
10422
11354
  opacity: 0.96,
10423
- width: zoom9.linear([
11355
+ width: zoom10.linear([
10424
11356
  [8, 0.35],
10425
11357
  [13, 1.05],
10426
11358
  [16, 2.2]
@@ -10432,7 +11364,7 @@ var streets = bindOfficialMapTheme(
10432
11364
  join: "round",
10433
11365
  minZoom: 12,
10434
11366
  opacity: 0.92,
10435
- width: zoom9.linear([
11367
+ width: zoom10.linear([
10436
11368
  [12, 0.35],
10437
11369
  [14, 0.8],
10438
11370
  [16, 1.4]
@@ -10444,7 +11376,7 @@ var streets = bindOfficialMapTheme(
10444
11376
  join: "round",
10445
11377
  minZoom: 6,
10446
11378
  opacity: 0.96,
10447
- width: zoom9.linear([
11379
+ width: zoom10.linear([
10448
11380
  [6, 0.45],
10449
11381
  [13, 1.25],
10450
11382
  [16, 3.2]
@@ -10456,7 +11388,7 @@ var streets = bindOfficialMapTheme(
10456
11388
  join: "round",
10457
11389
  minZoom: 10,
10458
11390
  opacity: 0.94,
10459
- width: zoom9.linear([
11391
+ width: zoom10.linear([
10460
11392
  [10, 0.3],
10461
11393
  [12, 0.55],
10462
11394
  [13, 0.9],
@@ -10466,31 +11398,8 @@ var streets = bindOfficialMapTheme(
10466
11398
  }
10467
11399
  }
10468
11400
  }),
10469
- vegetation: vegetation6({
10470
- flat: {
10471
- color: streetsDetailPalette.greenspaceDark,
10472
- minZoom: 16,
10473
- opacity: 0.82,
10474
- pitchAlignment: "map",
10475
- pitchScale: "map",
10476
- radius: zoom9.linear([
10477
- [16, 2.2],
10478
- [20, 8]
10479
- ]),
10480
- strokeColor: streetsDetailPalette.greenspace,
10481
- strokeOpacity: 0.55,
10482
- strokeWidth: 0.8
10483
- },
10484
- mode: "3d",
10485
- threeDimensional: {
10486
- barkColor: streetsVisual.tree.bark,
10487
- broadleafColors: streetsVisual.tree.broadleaf,
10488
- coniferColors: streetsVisual.tree.conifer,
10489
- crownScale: 1,
10490
- heightScale: 1
10491
- }
10492
- }),
10493
- boundaries: withRenderStack8(
11401
+ vegetation: streetsTrees,
11402
+ boundaries: withRenderStack9(
10494
11403
  boundaries8({
10495
11404
  // Mapbox Standard's admin-0/admin-1 layers map to OpenMapTiles
10496
11405
  // admin_level 2/4 respectively.
@@ -10499,7 +11408,7 @@ var streets = bindOfficialMapTheme(
10499
11408
  dash: [10, 0],
10500
11409
  minZoom: 1,
10501
11410
  opacity: 1,
10502
- width: zoom9.linear([
11411
+ width: zoom10.linear([
10503
11412
  [3, 0.8],
10504
11413
  [6, 1.35],
10505
11414
  [12, 2.1]
@@ -10509,11 +11418,11 @@ var streets = bindOfficialMapTheme(
10509
11418
  color: streetsOverviewPalette.admin1,
10510
11419
  dash: [3, 2],
10511
11420
  minZoom: 2,
10512
- opacity: zoom9.linear([
11421
+ opacity: zoom10.linear([
10513
11422
  [2, 0],
10514
11423
  [3, 1]
10515
11424
  ]),
10516
- width: zoom9.linear([
11425
+ width: zoom10.linear([
10517
11426
  [3, 0.7],
10518
11427
  [6, 1.2],
10519
11428
  [12, 1.8]
@@ -10521,12 +11430,12 @@ var streets = bindOfficialMapTheme(
10521
11430
  },
10522
11431
  disputed: {
10523
11432
  color: streetsOverviewPalette.admin0,
10524
- dash: expr9.step(expr9.zoom(), expr9.literal([3, 2, 5]), [
10525
- [7, expr9.literal([2, 1.5])]
11433
+ dash: expr11.step(expr11.zoom(), expr11.literal([3, 2, 5]), [
11434
+ [7, expr11.literal([2, 1.5])]
10526
11435
  ]),
10527
11436
  minZoom: 1,
10528
11437
  opacity: 1,
10529
- width: zoom9.linear([
11438
+ width: zoom10.linear([
10530
11439
  [3, 0.5],
10531
11440
  [12, 2]
10532
11441
  ])
@@ -10535,7 +11444,7 @@ var streets = bindOfficialMapTheme(
10535
11444
  }),
10536
11445
  streetsBoundaryRenderStack()
10537
11446
  ),
10538
- roads: withRenderStack8(
11447
+ roads: withRenderStack9(
10539
11448
  roads7({
10540
11449
  detail: "all",
10541
11450
  // 'none' | 'highways' | 'major' | 'streets' | 'all'.
@@ -10553,10 +11462,12 @@ var streets = bindOfficialMapTheme(
10553
11462
  },
10554
11463
  crossings: {
10555
11464
  image: streetsVisual.image.crosswalk,
10556
- minZoom: 15,
10557
- opacity: zoom9.linear([
10558
- [15, 0],
10559
- [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]
10560
11471
  ])
10561
11472
  },
10562
11473
  roundabouts: {
@@ -10586,9 +11497,12 @@ var streets = bindOfficialMapTheme(
10586
11497
  pattern: streetsVisual.image.sidewalkPattern
10587
11498
  },
10588
11499
  surface: {
10589
- 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,
10590
11504
  minZoom: 17,
10591
- opacity: 0.96
11505
+ opacity: 1
10592
11506
  }
10593
11507
  },
10594
11508
  modifiers: {
@@ -10597,11 +11511,10 @@ var streets = bindOfficialMapTheme(
10597
11511
  // phases accept color, opacity, dash, blur, gapWidth, offset, and width.
10598
11512
  construction: {
10599
11513
  surface: {
10600
- casing: {
10601
- color: mapboxRoadPalette.roadCasing,
10602
- dash: [1.5, 1],
10603
- opacity: 0.9
10604
- },
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 },
10605
11518
  fill: {
10606
11519
  color: mapboxRoadPalette.road,
10607
11520
  dash: [1.5, 1],
@@ -10722,6 +11635,7 @@ var streets = bindOfficialMapTheme(
10722
11635
  [22, mapboxRoadPalette.motorway]
10723
11636
  ],
10724
11637
  minZoom: 3,
11638
+ major: true,
10725
11639
  rampWidths: mapboxMajorRampWidthStops,
10726
11640
  tunnelCasingColor: mapboxRoadPalette.motorwayCasing,
10727
11641
  tunnelColor: mapboxRoadPalette.motorwayTunnel
@@ -10745,6 +11659,7 @@ var streets = bindOfficialMapTheme(
10745
11659
  [22, mapboxRoadPalette.trunk]
10746
11660
  ],
10747
11661
  minZoom: 3,
11662
+ major: true,
10748
11663
  rampWidths: mapboxMajorRampWidthStops,
10749
11664
  tunnelCasingColor: mapboxRoadPalette.trunkCasing,
10750
11665
  tunnelColor: mapboxRoadPalette.trunkTunnel
@@ -10754,7 +11669,7 @@ var streets = bindOfficialMapTheme(
10754
11669
  primaryRoadSurfaceColor,
10755
11670
  [
10756
11671
  [3, 0.8],
10757
- [12, 2.6],
11672
+ [12, 3],
10758
11673
  [18, 28],
10759
11674
  [22, 280]
10760
11675
  ],
@@ -10765,7 +11680,8 @@ var streets = bindOfficialMapTheme(
10765
11680
  streetsCityRoadPalette.primary,
10766
11681
  primaryRoadSurfaceColor
10767
11682
  ),
10768
- minZoom: 5,
11683
+ minZoom: 6,
11684
+ major: true,
10769
11685
  rampWidths: mapboxArterialRampWidthStops,
10770
11686
  tunnelCasingColor: mapboxRoadPalette.roadCasing,
10771
11687
  tunnelColor: mapboxRoadPalette.roadTunnel
@@ -10775,7 +11691,7 @@ var streets = bindOfficialMapTheme(
10775
11691
  secondaryRoadSurfaceColor,
10776
11692
  [
10777
11693
  [3, 0],
10778
- [12, 1.8],
11694
+ [12, 2.2],
10779
11695
  [18, 26],
10780
11696
  [22, 260]
10781
11697
  ],
@@ -10796,7 +11712,7 @@ var streets = bindOfficialMapTheme(
10796
11712
  tertiaryRoadSurfaceColor,
10797
11713
  [
10798
11714
  [3, 0],
10799
- [12, 1.2],
11715
+ [12, 2.2],
10800
11716
  [18, 26],
10801
11717
  [22, 260]
10802
11718
  ],
@@ -10817,13 +11733,12 @@ var streets = bindOfficialMapTheme(
10817
11733
  roadSurfaceColor,
10818
11734
  [
10819
11735
  [3, 0],
10820
- [12, 0.35],
11736
+ [12, 0.5],
10821
11737
  [18, 20],
10822
11738
  [22, 200]
10823
11739
  ],
10824
11740
  {
10825
11741
  casingColorStops: cityRoadCasingColorStops(12),
10826
- casingMinZoom: 14.5,
10827
11742
  colorStops: cityRoadColorStops(12, streetsCityRoadPalette.minor, roadSurfaceColor),
10828
11743
  minZoom: 12,
10829
11744
  tunnelCasingColor: mapboxRoadPalette.roadCasing,
@@ -10834,16 +11749,12 @@ var streets = bindOfficialMapTheme(
10834
11749
  roadSurfaceColor,
10835
11750
  [
10836
11751
  [3, 0],
10837
- [13, 0],
10838
- [13.5, 0.35],
10839
- [14, 0.8],
10840
- [15, 2.2],
10841
- [16, 3.8],
11752
+ [12, 0],
10842
11753
  [18, 10],
10843
11754
  [22, 100]
10844
11755
  ],
10845
11756
  {
10846
- casingMinZoom: 14.5,
11757
+ casingMinZoom: 16,
10847
11758
  casingColorStops: [
10848
11759
  [14.5, mapboxRoadPalette.roadCasing],
10849
11760
  [22, mapboxRoadPalette.roadCasing]
@@ -10852,24 +11763,21 @@ var streets = bindOfficialMapTheme(
10852
11763
  [13.5, roadSurfaceColor],
10853
11764
  [22, roadSurfaceColor]
10854
11765
  ],
10855
- minZoom: 13.5,
10856
- tunnelVisible: false
11766
+ minZoom: 15,
11767
+ tunnelCasingColor: mapboxRoadPalette.roadCasing,
11768
+ tunnelColor: mapboxRoadPalette.roadTunnel
10857
11769
  }
10858
11770
  ),
10859
11771
  track: cityRoadStyle(
10860
11772
  mapboxRoadPalette.road,
10861
11773
  [
10862
11774
  [3, 0],
10863
- [13, 0],
10864
- [13.5, 0.25],
10865
- [14, 0.6],
10866
- [15, 1.8],
10867
- [16, 3.2],
11775
+ [12, 0],
10868
11776
  [18, 10],
10869
11777
  [22, 100]
10870
11778
  ],
10871
11779
  {
10872
- casingMinZoom: 14.5,
11780
+ casingMinZoom: 16,
10873
11781
  casingColorStops: [
10874
11782
  [14.5, mapboxRoadPalette.roadCasing],
10875
11783
  [22, mapboxRoadPalette.roadCasing]
@@ -10878,32 +11786,28 @@ var streets = bindOfficialMapTheme(
10878
11786
  [13.5, mapboxRoadPalette.road],
10879
11787
  [22, mapboxRoadPalette.road]
10880
11788
  ],
10881
- minZoom: 13.5,
11789
+ minZoom: 15,
10882
11790
  tunnelCasingColor: mapboxRoadPalette.roadCasing,
10883
11791
  tunnelColor: mapboxRoadPalette.roadTunnel
10884
11792
  }
10885
11793
  ),
10886
- pathway: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
10887
- casingColor: streetsDetailPalette.parkPath,
10888
- casingWidth: 0,
11794
+ pathway: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10889
11795
  minZoom: 12
10890
11796
  }),
10891
- footway: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
10892
- casingColor: streetsDetailPalette.parkPath,
10893
- casingWidth: 0,
11797
+ footway: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10894
11798
  minZoom: 12
10895
11799
  }),
10896
11800
  cycleway: pathRoadStyle(mapboxRoadPalette.cycleway, mapboxPathWidthStops, {
10897
11801
  casingColor: mapboxRoadPalette.pathCasing,
10898
11802
  casingGapWidth: roadWidth(mapboxPathWidthStops, 1),
10899
- fillOpacity: zoom9.linear([
11803
+ fillOpacity: zoom10.linear([
10900
11804
  [15, 0],
10901
11805
  [16, 1]
10902
11806
  ]),
10903
11807
  minZoom: 15,
10904
11808
  underlay: {
10905
11809
  cap: pathLineCap,
10906
- color: zoom9.linear([
11810
+ color: zoom10.linear([
10907
11811
  [15, mapboxRoadPalette.pathAtZ15],
10908
11812
  [16, mapboxRoadPalette.pathFromZ16]
10909
11813
  ]),
@@ -10912,16 +11816,16 @@ var streets = bindOfficialMapTheme(
10912
11816
  opacity: 1,
10913
11817
  width: roadWidth(mapboxPathWidthStops, 1)
10914
11818
  },
10915
- width: zoom9.linear([
11819
+ width: zoom10.linear([
10916
11820
  [12, 0],
10917
11821
  [18, 2],
10918
11822
  [22, 20]
10919
11823
  ])
10920
11824
  }),
10921
- steps: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
11825
+ steps: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10922
11826
  casingMinZoom: 14,
10923
- casingColor: streetsDetailPalette.parkPath,
10924
- casingWidth: 0,
11827
+ casingWidth: contextualPathLineWidth,
11828
+ casingGapWidth: 0,
10925
11829
  // World V1 overzooms its native z15 tile above street level.
10926
11830
  // Keep this literal: a zoom-dependent dash is evaluated at the
10927
11831
  // source tile zoom and would remain a continuous line at z16+.
@@ -10931,18 +11835,35 @@ var streets = bindOfficialMapTheme(
10931
11835
  minZoom: 14,
10932
11836
  steps: true
10933
11837
  }),
10934
- pedestrian: pathRoadStyle(streetsDetailPalette.parkPath, googleParkPathWidthStops, {
11838
+ pedestrian: pathRoadStyle(mapboxRoadPalette.pathFromZ16, mapboxPathWidthStops, {
10935
11839
  casingMinZoom: 14,
10936
- casingColor: streetsDetailPalette.parkPath,
10937
- casingWidth: 0,
10938
11840
  minZoom: 12
10939
11841
  })
10940
11842
  }
10941
11843
  }),
10942
11844
  streetsRoadRenderStack()
10943
11845
  ),
10944
- transit: transit8(mapboxRailTransitStyle(mapboxRailColor)),
10945
- 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(
10946
11867
  buildings7({
10947
11868
  mode: "flat",
10948
11869
  // 'flat' | '3d'.
@@ -10957,7 +11878,7 @@ var streets = bindOfficialMapTheme(
10957
11878
  fill: {
10958
11879
  color: buildingFillColor,
10959
11880
  minZoom: 14.25,
10960
- opacity: zoom9.linear([
11881
+ opacity: zoom10.linear([
10961
11882
  [14.25, 0],
10962
11883
  [14.75, 0.5],
10963
11884
  [15, 1]
@@ -10966,14 +11887,14 @@ var streets = bindOfficialMapTheme(
10966
11887
  outline: {
10967
11888
  color: buildingOutlineColor,
10968
11889
  minZoom: 14.5,
10969
- opacity: zoom9.linear([
11890
+ opacity: zoom10.linear([
10970
11891
  [14.5, 0],
10971
11892
  [15, 0.6],
10972
11893
  [16, 0.82],
10973
11894
  [17, 0.96],
10974
11895
  [18, 1]
10975
11896
  ]),
10976
- width: zoom9.linear([
11897
+ width: zoom10.linear([
10977
11898
  [14.5, 0.25],
10978
11899
  [15, 0.4],
10979
11900
  [16, 0.65],
@@ -10985,15 +11906,15 @@ var streets = bindOfficialMapTheme(
10985
11906
  }),
10986
11907
  streetsBuildingRenderStack()
10987
11908
  ),
10988
- labels: withRenderStack8(
11909
+ labels: withRenderStack9(
10989
11910
  labels8({
10990
11911
  collisionPriority: "navigation",
10991
11912
  language: "local",
10992
11913
  // 'auto' | 'local' | 'en' | another language field suffix.
10993
11914
  places: "all",
10994
11915
  // 'none' | 'major' | 'all'.
10995
- roads: "all",
10996
- // 'none' | 'highways' | 'major' | 'streets' | 'all'.
11916
+ // Street names use the ground passes below; shields remain in the foreground.
11917
+ roads: "none",
10997
11918
  shields: "major",
10998
11919
  // 'none' | 'major' | 'all'.
10999
11920
  junctions: true,
@@ -11002,7 +11923,7 @@ var streets = bindOfficialMapTheme(
11002
11923
  // 'none' | 'major' | 'all'.
11003
11924
  styles: {
11004
11925
  places: {
11005
- // Mapbox Streets v12 hierarchy: continents disappear first, then
11926
+ // Standard overview hierarchy: continents disappear first, then
11006
11927
  // countries and administrative regions hand over to settlements.
11007
11928
  continent: {
11008
11929
  minZoom: 0.75,
@@ -11010,17 +11931,17 @@ var streets = bindOfficialMapTheme(
11010
11931
  priority: 100,
11011
11932
  text: {
11012
11933
  color: streetsOverviewPalette.label,
11013
- haloColor: streetsDetailPalette.halo,
11934
+ haloColor: streetsVisual.label.placeHalo,
11014
11935
  haloWidth: 1.5,
11015
11936
  letterSpacing: 0.05,
11016
11937
  lineHeight: 1.1,
11017
11938
  maxWidth: 6,
11018
- opacity: zoom9.linear([
11939
+ opacity: zoom10.linear([
11019
11940
  [0, 0.8],
11020
11941
  [1.5, 0.5],
11021
11942
  [2.5, 0.5]
11022
11943
  ]),
11023
- size: zoom9.exponential(0.5, [
11944
+ size: zoom10.exponential(0.5, [
11024
11945
  [0, 10],
11025
11946
  [2.5, 15]
11026
11947
  ]),
@@ -11032,46 +11953,33 @@ var streets = bindOfficialMapTheme(
11032
11953
  maxZoom: 10,
11033
11954
  priority: 95,
11034
11955
  text: {
11956
+ font: streetsVisual.font.default,
11035
11957
  color: streetsOverviewPalette.label,
11036
- haloColor: streetsDetailPalette.halo,
11958
+ haloColor: streetsVisual.label.placeHalo,
11037
11959
  haloWidth: 1.25,
11038
11960
  lineHeight: 1.1,
11039
11961
  maxWidth: 6,
11040
11962
  padding: 3,
11041
- radialOffset: zoom9.step([
11963
+ radialOffset: zoom10.step([
11042
11964
  [1, 0.6],
11043
11965
  [8, 0]
11044
11966
  ]),
11045
- size: expr9.interpolate(
11967
+ size: expr11.interpolate(
11046
11968
  { kind: "cubic-bezier", x1: 0.2, x2: 0.7, y1: 0, y2: 1 },
11047
- expr9.zoom(),
11969
+ expr11.zoom(),
11048
11970
  [
11049
11971
  [
11050
11972
  1,
11051
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 11, [
11973
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 11, [
11052
11974
  [4, 9],
11053
11975
  [5, 8]
11054
11976
  ])
11055
11977
  ],
11056
- [
11057
- 5,
11058
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 14, [
11059
- [3, 13],
11060
- [5, 11]
11061
- ])
11062
- ],
11063
- [
11064
- 7,
11065
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 16, [
11066
- [3, 15],
11067
- [5, 13]
11068
- ])
11069
- ],
11070
11978
  [
11071
11979
  9,
11072
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 18, [
11073
- [3, 17],
11074
- [5, 15]
11980
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 22, [
11981
+ [4, 19],
11982
+ [5, 17]
11075
11983
  ])
11076
11984
  ]
11077
11985
  ]
@@ -11084,26 +11992,27 @@ var streets = bindOfficialMapTheme(
11084
11992
  maxZoom: 9,
11085
11993
  priority: 86,
11086
11994
  text: {
11995
+ font: streetsVisual.font.places,
11087
11996
  color: streetsOverviewPalette.label,
11088
- haloColor: streetsDetailPalette.halo,
11997
+ haloColor: streetsVisual.label.placeHalo,
11089
11998
  haloWidth: 1,
11090
11999
  letterSpacing: 0.15,
11091
12000
  maxWidth: 6,
11092
12001
  opacity: 0.5,
11093
- size: expr9.interpolate(
12002
+ size: expr11.interpolate(
11094
12003
  { kind: "cubic-bezier", x1: 0.85, x2: 0.65, y1: 0.7, y2: 1 },
11095
- expr9.zoom(),
12004
+ expr11.zoom(),
11096
12005
  [
11097
12006
  [
11098
12007
  4,
11099
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 9, [
12008
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 9, [
11100
12009
  [6, 8],
11101
12010
  [7, 7]
11102
12011
  ])
11103
12012
  ],
11104
12013
  [
11105
12014
  9,
11106
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 21, [
12015
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 21, [
11107
12016
  [6, 16],
11108
12017
  [7, 14]
11109
12018
  ])
@@ -11115,67 +12024,46 @@ var streets = bindOfficialMapTheme(
11115
12024
  },
11116
12025
  city: {
11117
12026
  minZoom: 2,
11118
- maxZoom: 16,
11119
- 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)),
11120
12029
  text: {
11121
- color: zoom9.linear([
12030
+ color: zoom10.linear([
11122
12031
  [2, streetsOverviewPalette.label],
11123
12032
  [4, streetsOverviewPalette.label],
11124
12033
  [6, streetsVisual.label.settlement]
11125
12034
  ]),
11126
- haloColor: streetsDetailPalette.halo,
12035
+ haloColor: streetsVisual.label.placeHalo,
11127
12036
  haloBlur: 1,
11128
12037
  haloWidth: 1,
11129
12038
  lineHeight: 1.1,
11130
12039
  maxWidth: 7,
11131
12040
  padding: 1,
11132
- radialOffset: zoom9.step([
12041
+ radialOffset: zoom10.step([
11133
12042
  [2, 0.6],
11134
12043
  [8, 0]
11135
12044
  ]),
11136
- size: expr9.interpolate(
12045
+ size: expr11.interpolate(
11137
12046
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
11138
- expr9.zoom(),
12047
+ expr11.zoom(),
11139
12048
  [
11140
- [
11141
- 3,
11142
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 13, [
11143
- [3, 12],
11144
- [6, 10]
11145
- ])
11146
- ],
11147
- [
11148
- 5,
11149
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 15, [
11150
- [3, 13],
11151
- [4, 12],
11152
- [6, 11],
11153
- [8, 10],
11154
- [14, 9.5]
11155
- ])
11156
- ],
12049
+ [3, expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 13, [[6, 11]])],
11157
12050
  [
11158
12051
  6,
11159
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 17, [
11160
- [3, 15],
11161
- [4, 13],
11162
- [6, 12],
11163
- [8, 10.5],
11164
- [14, 10]
12052
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 18, [
12053
+ [6, 16],
12054
+ [7, 14]
11165
12055
  ])
11166
12056
  ],
11167
12057
  [
11168
12058
  8,
11169
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 20, [
11170
- [3, 18],
11171
- [6, 16],
11172
- [9, 14],
11173
- [12, 12]
12059
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 20, [
12060
+ [9, 16],
12061
+ [10, 14]
11174
12062
  ])
11175
12063
  ],
11176
12064
  [
11177
12065
  15,
11178
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 24, [
12066
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 24, [
11179
12067
  [9, 20],
11180
12068
  [12, 16],
11181
12069
  [15, 14]
@@ -11183,54 +12071,41 @@ var streets = bindOfficialMapTheme(
11183
12071
  ]
11184
12072
  ]
11185
12073
  ),
11186
- // Regular minor-city labels leave room for the denser
11187
- // regional label field used by Standard. Capital dots and
11188
- // rank-driven size still carry the major-city hierarchy.
11189
12074
  font: streetsVisual.font.default,
11190
- variableAnchors: [
11191
- "left",
11192
- "right",
11193
- "top",
11194
- "bottom",
11195
- "top-left",
11196
- "top-right",
11197
- "bottom-left",
11198
- "bottom-right"
11199
- ]
12075
+ variableAnchors: ["right"]
11200
12076
  }
11201
12077
  },
11202
12078
  town: {
11203
12079
  minZoom: 2,
11204
- maxZoom: 16,
11205
- 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)),
11206
12082
  text: {
11207
12083
  color: streetsVisual.label.settlement,
11208
- haloColor: streetsDetailPalette.halo,
12084
+ haloColor: streetsVisual.label.placeHalo,
11209
12085
  haloBlur: 1,
11210
12086
  haloWidth: 1,
11211
12087
  lineHeight: 1.1,
11212
12088
  maxWidth: 7,
11213
12089
  padding: 1,
11214
- radialOffset: zoom9.step([
12090
+ radialOffset: zoom10.step([
11215
12091
  [2, 0.55],
11216
- [8, 0.35],
11217
- [11, 0]
12092
+ [8, 0]
11218
12093
  ]),
11219
- size: expr9.interpolate(
12094
+ size: expr11.interpolate(
11220
12095
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
11221
- expr9.zoom(),
12096
+ expr11.zoom(),
11222
12097
  [
11223
- [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]])],
11224
12099
  [
11225
12100
  6,
11226
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 14, [
12101
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 14, [
11227
12102
  [9, 12],
11228
12103
  [12, 10]
11229
12104
  ])
11230
12105
  ],
11231
12106
  [
11232
12107
  8,
11233
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 16, [
12108
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 16, [
11234
12109
  [9, 14],
11235
12110
  [12, 12],
11236
12111
  [15, 10]
@@ -11238,7 +12113,7 @@ var streets = bindOfficialMapTheme(
11238
12113
  ],
11239
12114
  [
11240
12115
  13,
11241
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 22, [
12116
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 22, [
11242
12117
  [9, 20],
11243
12118
  [12, 16],
11244
12119
  [15, 14]
@@ -11246,7 +12121,7 @@ var streets = bindOfficialMapTheme(
11246
12121
  ]
11247
12122
  ]
11248
12123
  ),
11249
- font: streetsVisual.font.default,
12124
+ font: streetsVisual.font.regular,
11250
12125
  variableAnchors: [
11251
12126
  "left",
11252
12127
  "right",
@@ -11261,36 +12136,35 @@ var streets = bindOfficialMapTheme(
11261
12136
  },
11262
12137
  village: {
11263
12138
  minZoom: 2,
11264
- maxZoom: 16,
11265
- 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)),
11266
12141
  text: {
11267
12142
  color: streetsVisual.label.settlement,
11268
- haloColor: streetsDetailPalette.halo,
12143
+ haloColor: streetsVisual.label.placeHalo,
11269
12144
  haloBlur: 1,
11270
12145
  haloWidth: 1,
11271
12146
  lineHeight: 1.1,
11272
12147
  maxWidth: 7,
11273
12148
  padding: 1,
11274
- radialOffset: zoom9.step([
12149
+ radialOffset: zoom10.step([
11275
12150
  [2, 0.55],
11276
- [8, 0.35],
11277
- [11, 0]
12151
+ [8, 0]
11278
12152
  ]),
11279
- size: expr9.interpolate(
12153
+ size: expr11.interpolate(
11280
12154
  { kind: "cubic-bezier", x1: 0.2, x2: 0.9, y1: 0, y2: 1 },
11281
- expr9.zoom(),
12155
+ expr11.zoom(),
11282
12156
  [
11283
- [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]])],
11284
12158
  [
11285
12159
  6,
11286
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 14, [
12160
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 14, [
11287
12161
  [9, 12],
11288
12162
  [12, 10]
11289
12163
  ])
11290
12164
  ],
11291
12165
  [
11292
12166
  8,
11293
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 16, [
12167
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 16, [
11294
12168
  [9, 14],
11295
12169
  [12, 12],
11296
12170
  [15, 10]
@@ -11298,7 +12172,7 @@ var streets = bindOfficialMapTheme(
11298
12172
  ],
11299
12173
  [
11300
12174
  13,
11301
- expr9.step(expr9.coalesce(expr9.get(field8("rank")), 99), 22, [
12175
+ expr11.step(expr11.coalesce(expr11.get(field10("rank")), 99), 22, [
11302
12176
  [9, 20],
11303
12177
  [12, 16],
11304
12178
  [15, 14]
@@ -11306,7 +12180,7 @@ var streets = bindOfficialMapTheme(
11306
12180
  ]
11307
12181
  ]
11308
12182
  ),
11309
- font: streetsVisual.font.default,
12183
+ font: streetsVisual.font.regular,
11310
12184
  variableAnchors: [
11311
12185
  "left",
11312
12186
  "right",
@@ -11321,46 +12195,40 @@ var streets = bindOfficialMapTheme(
11321
12195
  },
11322
12196
  neighborhood: {
11323
12197
  minZoom: 10,
11324
- maxZoom: 16,
11325
- 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)),
11326
12200
  text: {
12201
+ font: streetsVisual.font.default,
11327
12202
  color: streetsVisual.label.neighborhood,
11328
- haloColor: streetsDetailPalette.halo,
11329
- haloBlur: 0.5,
12203
+ haloColor: streetsVisual.label.placeHalo,
12204
+ haloBlur: 0,
11330
12205
  haloWidth: 1.3,
11331
- letterSpacing: expr9.match(
11332
- expr9.get(field8("class")),
12206
+ letterSpacing: expr11.match(
12207
+ expr11.get(field10("class")),
11333
12208
  [{ labels: "suburb", value: 0.15 }],
11334
12209
  0.05
11335
12210
  ),
12211
+ lineHeight: 1.1,
11336
12212
  maxWidth: 7,
11337
- padding: 2,
11338
- size: expr9.interpolate(
12213
+ padding: 3,
12214
+ size: expr11.interpolate(
11339
12215
  { kind: "cubic-bezier", x1: 0.5, x2: 1, y1: 0, y2: 1 },
11340
- expr9.zoom(),
12216
+ expr11.zoom(),
11341
12217
  [
11342
12218
  [
11343
- 10,
11344
- expr9.match(
11345
- expr9.get(field8("class")),
11346
- [{ labels: "suburb", value: 10.5 }],
11347
- 10
11348
- )
11349
- ],
11350
- [
11351
- 12,
11352
- expr9.match(
11353
- expr9.get(field8("class")),
12219
+ 11,
12220
+ expr11.match(
12221
+ expr11.get(field10("class")),
11354
12222
  [{ labels: "suburb", value: 12 }],
11355
12223
  11.5
11356
12224
  )
11357
12225
  ],
11358
12226
  [
11359
12227
  15,
11360
- expr9.match(
11361
- expr9.get(field8("class")),
11362
- [{ labels: "suburb", value: 15 }],
11363
- 14
12228
+ expr11.match(
12229
+ expr11.get(field10("class")),
12230
+ [{ labels: "suburb", value: 16 }],
12231
+ 15
11364
12232
  )
11365
12233
  ]
11366
12234
  ]
@@ -11373,11 +12241,12 @@ var streets = bindOfficialMapTheme(
11373
12241
  maxZoom: 16,
11374
12242
  priority: 40,
11375
12243
  text: {
12244
+ font: streetsVisual.font.default,
11376
12245
  color: streetsVisual.label.neighborhood,
11377
- haloColor: streetsDetailPalette.halo,
12246
+ haloColor: streetsVisual.label.placeHalo,
11378
12247
  haloBlur: 0.5,
11379
12248
  haloWidth: 1,
11380
- size: zoom9.linear([
12249
+ size: zoom10.linear([
11381
12250
  [11, 10],
11382
12251
  [15, 14]
11383
12252
  ])
@@ -11385,32 +12254,17 @@ var streets = bindOfficialMapTheme(
11385
12254
  }
11386
12255
  },
11387
12256
  junctions: {
11388
- // Exit references are useful at street scale but overwhelm city overviews.
11389
- minZoom: 16,
12257
+ // Standard exit references start at z14 and use the shield weight.
12258
+ minZoom: 14,
11390
12259
  placement: "point",
11391
12260
  text: {
11392
12261
  color: streetsVisual.label.road,
11393
- font: streetsVisual.font.default,
12262
+ font: streetsVisual.font.places,
11394
12263
  haloColor: streetsDetailPalette.halo,
11395
- haloWidth: 2,
11396
- size: 10
12264
+ haloWidth: 1,
12265
+ size: 9
11397
12266
  }
11398
12267
  },
11399
- roads: {
11400
- motorway: { ...roadLabelStyle("major"), minZoom: 10 },
11401
- trunk: { ...roadLabelStyle("major"), minZoom: 10 },
11402
- primary: { ...roadLabelStyle("major"), minZoom: 12 },
11403
- secondary: { ...roadLabelStyle("major"), minZoom: 12 },
11404
- tertiary: { ...roadLabelStyle("major"), minZoom: 13 },
11405
- minor: { ...roadLabelStyle("street"), minZoom: 13 },
11406
- service: { ...roadLabelStyle("street"), minZoom: 15 },
11407
- track: { ...roadLabelStyle("path"), visible: false },
11408
- pathway: { ...roadLabelStyle("path"), minZoom: 15 },
11409
- footway: { ...roadLabelStyle("path"), minZoom: 15 },
11410
- cycleway: { ...roadLabelStyle("path"), minZoom: 15 },
11411
- steps: { ...roadLabelStyle("path"), minZoom: 15 },
11412
- pedestrian: { ...roadLabelStyle("pedestrian"), minZoom: 12 }
11413
- },
11414
12268
  shields: {
11415
12269
  default: {
11416
12270
  minZoom: 6,
@@ -11444,7 +12298,7 @@ var streets = bindOfficialMapTheme(
11444
12298
  detail: {
11445
12299
  // Core switches to line placement at street scale while retaining viewport
11446
12300
  // alignment, so each route reference remains horizontal during navigation.
11447
- spacing: zoom9.linear([
12301
+ spacing: zoom10.linear([
11448
12302
  [11, 400],
11449
12303
  [14, 600]
11450
12304
  ])
@@ -11469,11 +12323,12 @@ var streets = bindOfficialMapTheme(
11469
12323
  minZoom: 1,
11470
12324
  priority: 70,
11471
12325
  text: {
12326
+ font: streetsVisual.font.water,
11472
12327
  color: streetsDetailPalette.waterText,
11473
12328
  haloColor: streetsVisual.label.waterHalo,
11474
- haloWidth: 0.5,
11475
- letterSpacing: 0.2,
11476
- size: zoom9.linear([
12329
+ haloWidth: 0,
12330
+ letterSpacing: 0.25,
12331
+ size: zoom10.linear([
11477
12332
  [1, 12],
11478
12333
  [8, 18]
11479
12334
  ])
@@ -11484,10 +12339,11 @@ var streets = bindOfficialMapTheme(
11484
12339
  maxZoom: 15,
11485
12340
  priority: 60,
11486
12341
  text: {
12342
+ font: streetsVisual.font.water,
11487
12343
  color: streetsDetailPalette.waterText,
11488
12344
  haloColor: streetsVisual.label.waterHalo,
11489
- haloWidth: 0.5,
11490
- size: zoom9.linear([
12345
+ haloWidth: 0,
12346
+ size: zoom10.linear([
11491
12347
  [5, 11],
11492
12348
  [14, 16]
11493
12349
  ])
@@ -11498,12 +12354,20 @@ var streets = bindOfficialMapTheme(
11498
12354
  placement: "line-center",
11499
12355
  priority: 65,
11500
12356
  text: {
12357
+ font: streetsVisual.font.water,
11501
12358
  color: streetsDetailPalette.waterText,
11502
12359
  haloColor: streetsVisual.label.waterHalo,
11503
- haloWidth: 0.5,
11504
- 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
+ ),
11505
12369
  maxAngle: 30,
11506
- size: zoom9.linear([
12370
+ size: zoom10.linear([
11507
12371
  [1, 12],
11508
12372
  [8, 18]
11509
12373
  ])
@@ -11512,15 +12376,17 @@ var streets = bindOfficialMapTheme(
11512
12376
  waterway: {
11513
12377
  minZoom: 13,
11514
12378
  placement: "line",
11515
- spacing: zoom9.linear([
12379
+ spacing: zoom10.linear([
11516
12380
  [15, 250],
11517
12381
  [17, 400]
11518
12382
  ]),
11519
12383
  text: {
12384
+ font: streetsVisual.font.water,
11520
12385
  color: streetsDetailPalette.waterText,
11521
12386
  haloColor: streetsVisual.label.waterHalo,
12387
+ haloWidth: 0,
11522
12388
  maxAngle: 30,
11523
- size: zoom9.linear([
12389
+ size: zoom10.linear([
11524
12390
  [13, 12],
11525
12391
  [18, 18]
11526
12392
  ])
@@ -11531,13 +12397,14 @@ var streets = bindOfficialMapTheme(
11531
12397
  minZoom: 8,
11532
12398
  priority: 68,
11533
12399
  text: {
12400
+ font: streetsVisual.font.default,
11534
12401
  color: streetsDetailPalette.transit,
11535
12402
  haloColor: streetsDetailPalette.halo,
11536
12403
  haloWidth: 1,
11537
12404
  letterSpacing: 0.01,
11538
12405
  lineHeight: 1.1,
11539
12406
  maxWidth: 9,
11540
- size: zoom9.linear([
12407
+ size: zoom10.linear([
11541
12408
  [8, 12],
11542
12409
  [14, 15]
11543
12410
  ])
@@ -11548,9 +12415,9 @@ var streets = bindOfficialMapTheme(
11548
12415
  streetsLabelRenderStack()
11549
12416
  ),
11550
12417
  poi: poi4({
11551
- // World owns POI taxonomy, zoom eligibility and density tiers. Streets
11552
- // selects only the canonical categories and leaves final placement to
11553
- // 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.
11554
12421
  categories: [
11555
12422
  "transport",
11556
12423
  "food-drink",
@@ -11574,26 +12441,30 @@ var streets = bindOfficialMapTheme(
11574
12441
  icons: true,
11575
12442
  labels: true,
11576
12443
  placement: {
11577
- // One collision unit: the circular icon is required while its name is
11578
- // 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.
11579
12446
  coupleIconAndLabel: true,
11580
- iconPadding: 10,
11581
- 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
11582
12453
  },
11583
12454
  styles: {
11584
- "arts-entertainment": sparseStreetsPoiStyle,
11585
- education: deferredStreetsPoiStyle,
11586
- "food-drink": streetsPoiStyle,
11587
- landmark: deferredStreetsPoiStyle,
11588
- lodging: sparseStreetsPoiStyle,
11589
- medical: deferredStreetsPoiStyle,
11590
- "park-nature": deferredStreetsPoiStyle,
11591
- "public-services": deferredStreetsPoiStyle,
11592
- religion: deferredStreetsPoiStyle,
11593
- retail: streetsPoiStyle,
11594
- "sport-leisure": streetsPoiStyle,
11595
- transport: streetsPoiStyle,
11596
- "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")
11597
12468
  }
11598
12469
  })
11599
12470
  },
@@ -11634,5 +12505,6 @@ export {
11634
12505
  soundingsIcons,
11635
12506
  streets2 as streets,
11636
12507
  streetsIcons,
12508
+ streetsModels,
11637
12509
  streetsThemes
11638
12510
  };