diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -46,7 +46,7 @@ android:label="@string/app_name" android:networkSecurityConfig="@xml/networks_security_config" android:roundIcon="@mipmap/ic_launcher_round" - android:theme="@style/AppTheme.NoActionBar"> + android:theme="@style/AppThemeDayNight.NoActionBar"> + android:theme="@style/AppThemeDayNight.NoActionBar"> diff --git a/app/src/main/assets/versatiles_eclipse_modif.json b/app/src/main/assets/versatiles_eclipse_modif.json new file mode 100644 --- /dev/null +++ b/app/src/main/assets/versatiles_eclipse_modif.json @@ -0,0 +1,6266 @@ +{ + "version": 8, + "name": "versatiles-eclipse", + "metadata": { + "license": "https://creativecommons.org/publicdomain/zero/1.0/", + "maputnik:renderer": "mlgljs" + }, + "sources": { + "versatiles-shortbread": { + "attribution": "© OpenStreetMap contributors", + "tiles": ["https://tiles.versatiles.org/tiles/osm/{z}/{x}/{y}"], + "type": "vector", + "scheme": "xyz", + "bounds": [-180, -85.0511287798066, 180, 85.0511287798066], + "minzoom": 0, + "maxzoom": 14 + } + }, + "sprite": [ + { + "id": "basics", + "url": "https://tiles.versatiles.org/assets/sprites/basics/sprites" + } + ], + "glyphs": "https://tiles.versatiles.org/assets/glyphs/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": {"background-color": "hsl(33,48%,5%)"} + }, + { + "id": "water-ocean", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "ocean", + "paint": {"fill-color": "hsl(205,69%,15%)"} + }, + { + "id": "land-glacier", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "water_polygons", + "filter": ["all", ["==", "kind", "glacier"]], + "paint": {"fill-color": "hsl(0,0%,0%)"} + }, + { + "id": "land-commercial", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "commercial", "retail"]], + "paint": { + "fill-color": "hsla(324,61%,8%,0.251)", + "fill-opacity": {"stops": [[10, 0], [11, 1]]} + } + }, + { + "id": "land-industrial", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "industrial", "quarry", "railway"]], + "paint": { + "fill-color": "hsla(49,100%,12%,0.333)", + "fill-opacity": {"stops": [[10, 0], [11, 1]]} + } + }, + { + "id": "land-residential", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "garages", "residential"]], + "paint": { + "fill-color": "hsla(33,18%,10%,0.2)", + "fill-opacity": {"stops": [[10, 0], [11, 1]]} + } + }, + { + "id": "land-agriculture", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": [ + "all", + [ + "in", + "kind", + "brownfield", + "farmland", + "farmyard", + "greenfield", + "greenhouse_horticulture", + "orchard", + "plant_nursery", + "vineyard" + ] + ], + "paint": { + "fill-color": "hsl(43,51%,12%)", + "fill-opacity": {"stops": [[10, 0], [11, 1]]} + } + }, + { + "id": "land-waste", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "landfill"]], + "paint": { + "fill-color": "hsl(50,29%,20%)", + "fill-opacity": {"stops": [[10, 0], [11, 1]]} + } + }, + { + "id": "land-park", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": [ + "all", + ["in", "kind", "park", "village_green", "recreation_ground"] + ], + "paint": { + "fill-color": "hsl(60,41%,25%)", + "fill-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "land-garden", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "allotments", "garden"]], + "paint": { + "fill-color": "hsl(60,41%,25%)", + "fill-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "land-burial", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "cemetery", "grave_yard"]], + "paint": { + "fill-color": "hsl(54,22%,17%)", + "fill-opacity": {"stops": [[13, 0], [14, 1]]} + } + }, + { + "id": "land-leisure", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": [ + "all", + ["in", "kind", "miniature_golf", "playground", "golf_course"] + ], + "paint": {"fill-color": "hsl(84,29%,10%)"} + }, + { + "id": "land-rock", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "bare_rock", "scree", "shingle"]], + "paint": {"fill-color": "hsl(192,9%,11%)"} + }, + { + "id": "land-forest", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "forest"]], + "paint": { + "fill-color": "hsl(100,43%,53%)", + "fill-opacity": {"stops": [[7, 0], [8, 0.1]]} + } + }, + { + "id": "land-grass", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": [ + "all", + ["in", "kind", "grass", "grassland", "meadow", "wet_meadow"] + ], + "paint": { + "fill-color": "hsl(90,41%,15%)", + "fill-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "land-vegetation", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "heath", "scrub"]], + "paint": { + "fill-color": "hsl(60,41%,25%)", + "fill-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "land-sand", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "beach", "sand"]], + "paint": {"fill-color": "hsl(60,57%,5%)"} + }, + { + "id": "land-wetland", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "land", + "filter": ["all", ["in", "kind", "bog", "marsh", "string_bog", "swamp"]], + "paint": {"fill-color": "hsl(145,28%,14%)"} + }, + { + "id": "water-river", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "water_lines", + "filter": [ + "all", + ["in", "kind", "river"], + ["!=", "tunnel", true], + ["!=", "bridge", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(205,69%,15%)", + "line-width": { + "stops": [[9, 0], [10, 3], [15, 5], [17, 9], [18, 20], [20, 60]] + } + } + }, + { + "id": "water-canal", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "water_lines", + "filter": [ + "all", + ["in", "kind", "canal"], + ["!=", "tunnel", true], + ["!=", "bridge", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(205,69%,15%)", + "line-width": { + "stops": [[9, 0], [10, 2], [15, 4], [17, 8], [18, 17], [20, 50]] + } + } + }, + { + "id": "water-stream", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "water_lines", + "filter": [ + "all", + ["in", "kind", "stream"], + ["!=", "tunnel", true], + ["!=", "bridge", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(205,69%,15%)", + "line-width": { + "stops": [[13, 0], [14, 1], [15, 2], [17, 6], [18, 12], [20, 30]] + } + } + }, + { + "id": "water-ditch", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "water_lines", + "filter": [ + "all", + ["in", "kind", "ditch"], + ["!=", "tunnel", true], + ["!=", "bridge", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(205,69%,15%)", + "line-width": {"stops": [[14, 0], [15, 1], [17, 4], [18, 8], [20, 20]]} + } + }, + { + "id": "water-area", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "water_polygons", + "filter": ["==", "kind", "water"], + "paint": { + "fill-color": "hsl(205,69%,15%)", + "fill-opacity": {"stops": [[4, 0], [6, 1]]} + } + }, + { + "id": "water-area-river", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "water_polygons", + "filter": ["==", "kind", "river"], + "paint": { + "fill-color": "hsl(205,69%,15%)", + "fill-opacity": {"stops": [[4, 0], [6, 1]]} + } + }, + { + "id": "water-area-small", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "water_polygons", + "filter": ["in", "kind", "reservoir", "basin", "dock"], + "paint": { + "fill-color": "hsl(205,69%,15%)", + "fill-opacity": {"stops": [[4, 0], [6, 1]]} + } + }, + { + "id": "water-dam-area", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "dam_polygons", + "filter": ["==", "kind", "dam"], + "paint": { + "fill-color": "hsl(33,48%,5%)", + "fill-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "water-dam", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "dam_lines", + "filter": ["==", "kind", "dam"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": {"line-color": "hsl(205,69%,15%)"} + }, + { + "id": "water-pier-area", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "pier_polygons", + "filter": ["in", "kind", "pier", "breakwater", "groyne"], + "paint": { + "fill-color": "hsl(33,48%,5%)", + "fill-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "water-pier", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "pier_lines", + "filter": ["in", "kind", "pier", "breakwater", "groyne"], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": {"line-color": "hsl(33,48%,5%)"} + }, + { + "id": "site-dangerarea", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "danger_area"], + "paint": { + "fill-color": "hsl(0,100%,50%)", + "fill-outline-color": "hsl(0,100%,50%)", + "fill-opacity": 0.3, + "fill-pattern": "basics:pattern-warning" + } + }, + { + "id": "site-university", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "university"], + "paint": {"fill-color": "hsl(60,100%,25%)", "fill-opacity": 0.1} + }, + { + "id": "site-college", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "college"], + "paint": {"fill-color": "hsl(60,100%,25%)", "fill-opacity": 0.1} + }, + { + "id": "site-school", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "school"], + "paint": {"fill-color": "hsl(60,100%,25%)", "fill-opacity": 0.1} + }, + { + "id": "site-hospital", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "hospital"], + "paint": {"fill-color": "hsl(0,100%,30%)", "fill-opacity": 0.1} + }, + { + "id": "site-prison", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "prison"], + "paint": { + "fill-color": "hsl(305,73%,3%)", + "fill-pattern": "basics:pattern-striped", + "fill-opacity": 0.1 + } + }, + { + "id": "site-parking", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "parking"], + "paint": {"fill-color": "hsl(24,11%,9%)"} + }, + { + "id": "site-bicycleparking", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "bicycle_parking"], + "paint": {"fill-color": "hsl(24,11%,9%)"} + }, + { + "id": "site-construction", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "sites", + "filter": ["in", "kind", "construction"], + "paint": { + "fill-color": "hsl(0,0%,34%)", + "fill-pattern": "basics:pattern-hatched_thin", + "fill-opacity": 0.1 + } + }, + { + "id": "airport-area", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "street_polygons", + "filter": ["in", "kind", "runway", "taxiway"], + "paint": {"fill-color": "hsl(0,0%,0%)", "fill-opacity": 0.5} + }, + { + "id": "airport-taxiway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["==", "kind", "taxiway"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[13, 0], [14, 2], [15, 10], [16, 14], [18, 20], [20, 40]] + } + } + }, + { + "id": "airport-runway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["==", "kind", "runway"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [ + [11, 0], + [12, 6], + [13, 9], + [14, 16], + [15, 24], + [16, 40], + [17, 100], + [18, 160], + [20, 300] + ] + } + } + }, + { + "id": "airport-taxiway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["==", "kind", "taxiway"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[13, 0], [14, 1], [15, 8], [16, 12], [18, 18], [20, 36]] + }, + "line-opacity": {"stops": [[13, 0], [14, 1]]} + } + }, + { + "id": "airport-runway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["==", "kind", "runway"], + "layout": {"line-join": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [ + [11, 0], + [12, 5], + [13, 8], + [14, 14], + [15, 22], + [16, 38], + [17, 98], + [18, 158], + [20, 298] + ] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "building:outline", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "buildings", + "paint": { + "fill-color": "hsl(30,11%,14%)", + "fill-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "building", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "buildings", + "paint": { + "fill-color": "hsl(30,38%,8%)", + "fill-opacity": {"stops": [[14, 0], [15, 1]]}, + "fill-translate": [-2, -2] + } + }, + { + "id": "tunnel-street-pedestrian-zone", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "street_polygons", + "filter": ["all", ["==", "tunnel", true], ["==", "kind", "pedestrian"]], + "paint": { + "fill-color": "rgb(8,8,8)", + "fill-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-way-footway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "footway"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "hsl(288,13%,14%)" + } + }, + { + "id": "tunnel-way-steps:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "steps"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "hsl(288,13%,14%)" + } + }, + { + "id": "tunnel-way-path:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "path"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "hsl(288,13%,14%)" + } + }, + { + "id": "tunnel-way-cycleway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "cycleway"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "hsl(203,11%,13%)" + } + }, + { + "id": "tunnel-street-track:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "track"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[14, 2], [16, 4], [18, 18], [19, 48], [20, 96]] + }, + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "tunnel-street-pedestrian:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "pedestrian"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "service"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "tunnel-street-livingstreet:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-residential:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "residential"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-unclassified:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "unclassified"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-busway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "busway"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "tunnel-street-busguideway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "bus_guideway"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "tunnel-street-tertiary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-secondary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "tunnel-street-primary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "tunnel-street-trunk-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "tunnel-street-motorway-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "tunnel-street-tertiary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(33,33,33)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-secondary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": { + "stops": [[11, 2], [14, 5], [16, 8], [18, 30], [19, 68], [20, 138]] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "tunnel-street-primary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": { + "stops": [ + [8, 0], + [9, 1], + [10, 4], + [14, 6], + [16, 12], + [18, 36], + [19, 74], + [20, 144] + ] + } + } + }, + { + "id": "tunnel-street-trunk:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": { + "stops": [ + [6, 0], + [7, 2], + [10, 4], + [14, 6], + [16, 12], + [18, 36], + [19, 74], + [20, 144] + ] + } + } + }, + { + "id": "tunnel-street-motorway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(129,71,21)", + "line-dasharray": [1, 0.3], + "line-width": { + "stops": [ + [5, 0], + [6, 2], + [10, 5], + [14, 5], + [16, 14], + [18, 38], + [19, 84], + [20, 168] + ] + } + } + }, + { + "id": "tunnel-way-footway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "footway"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "hsl(288,33%,6%)", + "line-dasharray": [1, 0.2] + } + }, + { + "id": "tunnel-way-steps", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "steps"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "hsl(288,33%,6%)", + "line-dasharray": [1, 0.2] + } + }, + { + "id": "tunnel-way-path", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "path"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "hsl(288,33%,6%)", + "line-dasharray": [1, 0.2] + } + }, + { + "id": "tunnel-way-cycleway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "tunnel", true], ["in", "kind", "cycleway"]], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "hsl(203,30%,5%)", + "line-dasharray": [1, 0.2] + } + }, + { + "id": "tunnel-street-track", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "track"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 16], [19, 44], [20, 88]] + }, + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "tunnel-street-pedestrian", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "pedestrian"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "service"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "tunnel-street-livingstreet", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-residential", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "residential"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-unclassified", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "unclassified"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-busway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "busway"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "tunnel-street-busguideway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "bus_guideway"], ["==", "tunnel", true]], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "tunnel-street-track-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "track"], + ["==", "bicycle", "designated"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": {"line-color": "rgb(8,8,8)"} + }, + { + "id": "tunnel-street-pedestrian-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "pedestrian"], + ["==", "bicycle", "designated"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-service-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "service"], + ["==", "bicycle", "designated"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": {"line-color": "rgb(8,8,8)"} + }, + { + "id": "tunnel-street-livingstreet-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "bicycle", "designated"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-residential-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "residential"], + ["==", "bicycle", "designated"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-unclassified-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "unclassified"], + ["==", "bicycle", "designated"], + ["==", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-tertiary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-secondary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(77,61,0)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "tunnel-street-primary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(77,61,0)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "tunnel-street-trunk-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(77,61,0)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "tunnel-street-motorway-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(107,61,0)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "tunnel-street-tertiary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "tunnel-street-secondary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(77,61,0)", + "line-width": { + "stops": [[11, 1], [14, 4], [16, 6], [18, 28], [19, 64], [20, 130]] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "tunnel-street-primary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(77,61,0)", + "line-width": { + "stops": [ + [8, 0], + [9, 2], + [10, 3], + [14, 5], + [16, 10], + [18, 34], + [19, 70], + [20, 140] + ] + }, + "line-opacity": {"stops": [[8, 0], [9, 1]]} + } + }, + { + "id": "tunnel-street-trunk", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(77,61,0)", + "line-width": { + "stops": [ + [6, 0], + [7, 1], + [10, 3], + [14, 5], + [16, 10], + [18, 34], + [19, 70], + [20, 140] + ] + }, + "line-opacity": {"stops": [[6, 0], [7, 1]]} + } + }, + { + "id": "tunnel-street-motorway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "tunnel", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(107,61,0)", + "line-width": { + "stops": [ + [5, 0], + [6, 1], + [10, 4], + [14, 4], + [16, 12], + [18, 36], + [19, 80], + [20, 160] + ] + }, + "line-opacity": {"stops": [[5, 0], [6, 1]]} + } + }, + { + "id": "tunnel-transport-tram:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "tram"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "tunnel-transport-narrowgauge:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "narrow_gauge"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "tunnel-transport-subway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["in", "kind", "subway"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(207,23%,28%)", + "line-width": { + "stops": [ + [11, 0], + [12, 1], + [15, 3], + [16, 3], + [18, 6], + [19, 8], + [20, 10] + ] + }, + "line-opacity": {"stops": [[11, 0], [12, 0.5]]} + } + }, + { + "id": "tunnel-transport-lightrail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 8, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[8, 1], [13, 1], [15, 1], [20, 14]]}, + "line-opacity": {"stops": [[11, 0], [12, 0.5]]} + } + }, + { + "id": "tunnel-transport-lightrail-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[14, 0], [15, 1], [16, 1], [20, 14]]} + } + }, + { + "id": "tunnel-transport-rail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 8, + "filter": [ + "all", + ["in", "kind", "rail"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[8, 1], [13, 1], [15, 1], [20, 14]]}, + "line-opacity": {"stops": [[8, 0], [9, 0.3]]} + } + }, + { + "id": "tunnel-transport-rail-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "rail"], + ["has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[14, 0], [15, 1], [16, 1], [20, 14]]} + } + }, + { + "id": "tunnel-transport-monorail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["in", "kind", "monorail"], ["==", "tunnel", true]], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "tunnel-transport-funicular:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["in", "kind", "funicular"], ["==", "tunnel", true]], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "tunnel-transport-tram", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "tram"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "tunnel-transport-narrowgauge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "narrow_gauge"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "tunnel-transport-subway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["in", "kind", "subway"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "rgb(42,55,67)", + "line-width": { + "stops": [ + [11, 0], + [12, 1], + [15, 2], + [16, 2], + [18, 5], + [19, 6], + [20, 8] + ] + }, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "tunnel-transport-lightrail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[14, 0], [15, 1], [20, 10]]}, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "tunnel-transport-lightrail-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[15, 0], [16, 1], [20, 10]]}, + "line-dasharray": [2, 2] + } + }, + { + "id": "tunnel-transport-rail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "rail"], + ["!has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[14, 0], [15, 1], [20, 10]]}, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 0.3]]} + } + }, + { + "id": "tunnel-transport-rail-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "rail"], + ["has", "service"], + ["==", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[15, 0], [16, 1], [20, 10]]}, + "line-dasharray": [2, 2] + } + }, + { + "id": "tunnel-transport-monorail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": ["all", ["in", "kind", "monorail"], ["==", "tunnel", true]], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "tunnel-transport-funicular", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": ["all", ["in", "kind", "funicular"], ["==", "tunnel", true]], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "bridge", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "bridges", + "paint": { + "fill-color": "rgb(22,17,11)", + "fill-antialias": true, + "fill-opacity": 0.8 + } + }, + { + "id": "street-pedestrian-zone", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "street_polygons", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["==", "kind", "pedestrian"] + ], + "paint": { + "fill-color": "rgba(16,0,20,0.25)", + "fill-opacity": {"stops": [[12, 0], [13, 1], [14, 0], [15, 1]]} + } + }, + { + "id": "way-footway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "footway"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(40,26,44)" + } + }, + { + "id": "way-steps:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "steps"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(40,26,44)" + } + }, + { + "id": "way-path:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "path"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(40,26,44)" + } + }, + { + "id": "way-cycleway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "cycleway"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(26,34,40)" + } + }, + { + "id": "street-track:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "track"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[14, 2], [16, 4], [18, 18], [19, 48], [20, 96]] + }, + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "street-pedestrian:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "pedestrian"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "street-livingstreet:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-residential:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "residential"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-unclassified:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "unclassified"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-busway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "busway"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "street-busguideway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "bus_guideway"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "street-tertiary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-secondary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "street-primary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "street-trunk-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "street-motorway-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "street-tertiary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(36,5%,20%)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-secondary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [[11, 2], [14, 5], [16, 8], [18, 30], [19, 68], [20, 138]] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "street-primary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [ + [8, 0], + [9, 1], + [10, 4], + [14, 6], + [16, 12], + [18, 36], + [19, 74], + [20, 144] + ] + } + } + }, + { + "id": "street-trunk:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [ + [6, 0], + [7, 2], + [10, 4], + [14, 6], + [16, 12], + [18, 36], + [19, 74], + [20, 144] + ] + } + } + }, + { + "id": "street-motorway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [ + [5, 0], + [6, 2], + [10, 5], + [14, 5], + [16, 14], + [18, 38], + [19, 84], + [20, 168] + ] + } + } + }, + { + "id": "way-footway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "footway"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "rgb(16,0,20)" + } + }, + { + "id": "way-steps", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "steps"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "rgb(16,0,20)" + } + }, + { + "id": "way-path", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "path"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "rgb(16,0,20)" + } + }, + { + "id": "way-cycleway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "cycleway"] + ], + "layout": {"line-cap": "round"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "hsl(203,100%,3%)" + } + }, + { + "id": "street-track", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "track"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 16], [19, 44], [20, 88]] + }, + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "street-pedestrian", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "pedestrian"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(288,100%,4%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 0], [14, 1]]} + } + }, + { + "id": "street-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "street-livingstreet", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-residential", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "residential"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-unclassified", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "unclassified"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-busway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "busway"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "street-busguideway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "bus_guideway"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "street-track-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "track"], + ["==", "bicycle", "designated"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": {"line-color": "hsl(0,0%,0%)"} + }, + { + "id": "street-pedestrian-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "pedestrian"], + ["==", "bicycle", "designated"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-service-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "service"], + ["==", "bicycle", "designated"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": {"line-color": "hsl(0,0%,0%)"} + }, + { + "id": "street-livingstreet-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "bicycle", "designated"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-residential-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "residential"], + ["==", "bicycle", "designated"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-unclassified-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "unclassified"], + ["==", "bicycle", "designated"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-tertiary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-secondary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "street-primary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "street-trunk-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "street-motorway-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(34,100%,23%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "street-tertiary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "street-secondary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": { + "stops": [[11, 1], [14, 4], [16, 6], [18, 28], [19, 64], [20, 130]] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "street-primary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": { + "stops": [ + [8, 0], + [9, 2], + [10, 3], + [14, 5], + [16, 10], + [18, 34], + [19, 70], + [20, 140] + ] + }, + "line-opacity": {"stops": [[8, 0], [9, 1]]} + } + }, + { + "id": "street-trunk", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": { + "stops": [ + [6, 0], + [7, 1], + [10, 3], + [14, 5], + [16, 10], + [18, 34], + [19, 70], + [20, 140] + ] + }, + "line-opacity": {"stops": [[6, 0], [7, 1]]} + } + }, + { + "id": "street-motorway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["!=", "bridge", true], + ["!=", "tunnel", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(34,100%,23%)", + "line-width": { + "stops": [ + [5, 0], + [6, 1], + [10, 4], + [14, 4], + [16, 12], + [18, 36], + [19, 80], + [20, 160] + ] + }, + "line-opacity": {"stops": [[5, 0], [6, 1]]} + } + }, + { + "id": "transport-tram:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "tram"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "transport-narrowgauge:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "narrow_gauge"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "transport-subway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["in", "kind", "subway"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(207,23%,28%)", + "line-width": { + "stops": [ + [11, 0], + [12, 1], + [15, 3], + [16, 3], + [18, 6], + [19, 8], + [20, 10] + ] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "transport-lightrail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 8, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[8, 1], [13, 1], [15, 1], [20, 14]]}, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "transport-lightrail-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[14, 0], [15, 1], [16, 1], [20, 14]]} + } + }, + { + "id": "transport-rail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 8, + "filter": [ + "all", + ["in", "kind", "rail"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[8, 1], [13, 1], [15, 1], [20, 14]]}, + "line-opacity": {"stops": [[8, 0], [9, 1]]} + } + }, + { + "id": "transport-rail-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "rail"], + ["has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[14, 0], [15, 1], [16, 1], [20, 14]]} + } + }, + { + "id": "transport-monorail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "monorail"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "transport-funicular:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "funicular"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "transport-tram", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "tram"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "transport-narrowgauge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "narrow_gauge"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "transport-subway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["in", "kind", "subway"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "rgb(42,55,67)", + "line-width": { + "stops": [ + [11, 0], + [12, 1], + [15, 2], + [16, 2], + [18, 5], + [19, 6], + [20, 8] + ] + }, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "transport-lightrail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[14, 0], [15, 1], [20, 10]]}, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "transport-lightrail-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[15, 0], [16, 1], [20, 10]]}, + "line-dasharray": [2, 2] + } + }, + { + "id": "transport-rail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "rail"], + ["!has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[14, 0], [15, 1], [20, 10]]}, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "transport-rail-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "rail"], + ["has", "service"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[15, 0], [16, 1], [20, 10]]}, + "line-dasharray": [2, 2] + } + }, + { + "id": "transport-monorail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "monorail"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "transport-funicular", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "funicular"], + ["!=", "bridge", true], + ["!=", "tunnel", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "transport-ferry", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "ferries", + "minzoom": 10, + "paint": { + "line-color": "rgb(36,64,84)", + "line-width": {"stops": [[10, 1], [13, 2], [14, 3], [16, 4], [17, 6]]}, + "line-opacity": {"stops": [[10, 0], [11, 1]]}, + "line-dasharray": [1, 1] + } + }, + { + "id": "bridge-way-footway:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "footway"]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[15, 0], [16, 7], [18, 10], [19, 17], [20, 31]] + } + } + }, + { + "id": "bridge-way-steps:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "steps"]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[15, 0], [16, 7], [18, 10], [19, 17], [20, 31]] + } + } + }, + { + "id": "bridge-way-path:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "path"]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[15, 0], [16, 7], [18, 10], [19, 17], [20, 31]] + } + } + }, + { + "id": "bridge-way-cycleway:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "cycleway"]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[15, 0], [16, 7], [18, 10], [19, 17], [20, 31]] + } + } + }, + { + "id": "bridge-street-track:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "track"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[14, 0], [15, 1]]}, + "line-width": { + "stops": [[14, 3], [16, 6], [18, 25], [19, 67], [20, 134]] + } + } + }, + { + "id": "bridge-street-pedestrian:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "pedestrian"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[12, 0], [13, 1]]}, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 8], [18, 36], [19, 90], [20, 179]] + } + } + }, + { + "id": "bridge-street-service:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "service"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[14, 0], [15, 1]]}, + "line-width": { + "stops": [[14, 3], [16, 6], [18, 25], [19, 67], [20, 134]] + } + } + }, + { + "id": "bridge-street-livingstreet:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "bridge", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[12, 0], [13, 1]]}, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 8], [18, 36], [19, 90], [20, 179]] + } + } + }, + { + "id": "bridge-street-residential:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "residential"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[12, 0], [13, 1]]}, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 8], [18, 36], [19, 90], [20, 179]] + } + } + }, + { + "id": "bridge-street-unclassified:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "unclassified"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[12, 0], [13, 1]]}, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 8], [18, 36], [19, 90], [20, 179]] + } + } + }, + { + "id": "bridge-street-busway:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "busway"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": {"line-color": "rgb(22,17,11)", "line-opacity": 0.5} + }, + { + "id": "bridge-street-busguideway:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "bus_guideway"], ["==", "bridge", true]], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": {"line-color": "rgb(22,17,11)", "line-opacity": 0.5} + }, + { + "id": "bridge-street-tertiary-link:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[12, 0], [13, 1]]}, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 8], [18, 36], [19, 90], [20, 179]] + } + } + }, + { + "id": "bridge-street-secondary-link:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 10], [18, 20], [20, 56]] + } + } + }, + { + "id": "bridge-street-primary-link:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 10], [18, 20], [20, 56]] + } + } + }, + { + "id": "bridge-street-trunk-link:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 10], [18, 20], [20, 56]] + } + } + }, + { + "id": "bridge-street-motorway-link:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 10], [18, 20], [20, 56]] + } + } + }, + { + "id": "bridge-street-tertiary:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[12, 0], [13, 1]]}, + "line-width": { + "stops": [[12, 3], [14, 4], [16, 8], [18, 36], [19, 90], [20, 179]] + } + } + }, + { + "id": "bridge-street-secondary:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": {"stops": [[11, 0], [12, 1]]}, + "line-width": { + "stops": [[11, 3], [14, 7], [16, 11], [18, 42], [19, 95], [20, 193]] + } + } + }, + { + "id": "bridge-street-primary:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [ + [8, 0], + [9, 1], + [10, 6], + [14, 8], + [16, 17], + [18, 50], + [19, 104], + [20, 202] + ] + } + } + }, + { + "id": "bridge-street-trunk:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [ + [7, 0], + [8, 3], + [10, 6], + [14, 8], + [16, 17], + [18, 50], + [19, 104], + [20, 202] + ] + } + } + }, + { + "id": "bridge-street-motorway:bridge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-cap": "butt", "line-join": "round"}, + "paint": { + "line-color": "rgb(22,17,11)", + "line-opacity": 0.5, + "line-width": { + "stops": [ + [5, 0], + [6, 3], + [10, 7], + [14, 7], + [16, 20], + [18, 53], + [19, 118], + [20, 235] + ] + } + } + }, + { + "id": "bridge-street-pedestrian-zone", + "type": "fill", + "source": "versatiles-shortbread", + "source-layer": "street_polygons", + "filter": ["all", ["==", "bridge", true], ["==", "kind", "pedestrian"]], + "paint": { + "fill-color": "hsl(0,0%,0%)", + "fill-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-way-footway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "footway"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(40,26,44)" + } + }, + { + "id": "bridge-way-steps:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "steps"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(40,26,44)" + } + }, + { + "id": "bridge-way-path:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "path"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(40,26,44)" + } + }, + { + "id": "bridge-way-cycleway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "cycleway"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 5], [18, 7], [19, 12], [20, 22]] + }, + "line-color": "rgb(26,34,40)" + } + }, + { + "id": "bridge-street-track:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "track"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[14, 2], [16, 4], [18, 18], [19, 48], [20, 96]] + }, + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "bridge-street-pedestrian:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "pedestrian"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "service"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "bridge-street-livingstreet:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-residential:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "residential"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-unclassified:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "unclassified"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-busway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "busway"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "bridge-street-busguideway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "bus_guideway"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(37,36,34)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 12], [19, 32], [20, 48]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "bridge-street-tertiary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-secondary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "bridge-street-primary-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "bridge-street-trunk-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "bridge-street-motorway-link:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": {"stops": [[12, 2], [14, 3], [16, 7], [18, 14], [20, 40]]} + } + }, + { + "id": "bridge-street-tertiary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(38,38,38)", + "line-width": { + "stops": [[12, 2], [14, 3], [16, 6], [18, 26], [19, 64], [20, 128]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-secondary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [[11, 2], [14, 5], [16, 8], [18, 30], [19, 68], [20, 138]] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "bridge-street-primary:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [ + [8, 0], + [9, 1], + [10, 4], + [14, 6], + [16, 12], + [18, 36], + [19, 74], + [20, 144] + ] + } + } + }, + { + "id": "bridge-street-trunk:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [ + [6, 0], + [7, 2], + [10, 4], + [14, 6], + [16, 12], + [18, 36], + [19, 74], + [20, 144] + ] + } + } + }, + { + "id": "bridge-street-motorway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(28,72%,31%)", + "line-width": { + "stops": [ + [5, 0], + [6, 2], + [10, 5], + [14, 5], + [16, 14], + [18, 38], + [19, 84], + [20, 168] + ] + } + } + }, + { + "id": "bridge-way-footway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "footway"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "rgb(16,0,20)" + } + }, + { + "id": "bridge-way-steps", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "steps"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "rgb(16,0,20)" + } + }, + { + "id": "bridge-way-path", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "path"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "rgb(16,0,20)" + } + }, + { + "id": "bridge-way-cycleway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["==", "bridge", true], ["in", "kind", "cycleway"]], + "layout": {"line-cap": "butt"}, + "paint": { + "line-width": { + "stops": [[15, 0], [16, 4], [18, 6], [19, 10], [20, 20]] + }, + "line-color": "hsl(203,100%,3%)" + } + }, + { + "id": "bridge-street-track", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "track"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[14, 1], [16, 3], [18, 16], [19, 44], [20, 88]] + }, + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "bridge-street-pedestrian", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "pedestrian"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "service"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "bridge-street-livingstreet", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-residential", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "residential"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-unclassified", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "unclassified"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-busway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "busway"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "bridge-street-busguideway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": ["all", ["==", "kind", "bus_guideway"], ["==", "bridge", true]], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "rgb(8,8,8)", + "line-width": { + "stops": [[14, 1], [16, 2], [18, 10], [19, 28], [20, 40]] + }, + "line-opacity": {"stops": [[15, 0], [16, 1]]} + } + }, + { + "id": "bridge-street-track-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "track"], + ["==", "bicycle", "designated"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": {"line-color": "hsl(0,0%,0%)"} + }, + { + "id": "bridge-street-pedestrian-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "pedestrian"], + ["==", "bicycle", "designated"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-service-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "service"], + ["==", "bicycle", "designated"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": {"line-color": "hsl(0,0%,0%)"} + }, + { + "id": "bridge-street-livingstreet-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "living_street"], + ["==", "bicycle", "designated"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-residential-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "residential"], + ["==", "bicycle", "designated"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-unclassified-bicycle", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "kind", "unclassified"], + ["==", "bicycle", "designated"], + ["==", "bridge", true] + ], + "layout": {"line-join": "round", "line-cap": "round"}, + "paint": { + "line-color": "hsl(203,100%,3%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-tertiary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "tertiary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-secondary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "secondary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "bridge-street-primary-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "primary"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "bridge-street-trunk-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "trunk"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "bridge-street-motorway-link", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 12, + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "motorway"], + ["==", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(34,100%,23%)", + "line-width": {"stops": [[12, 1], [14, 2], [16, 5], [18, 12], [20, 38]]} + } + }, + { + "id": "bridge-street-tertiary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "tertiary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(0,0%,0%)", + "line-width": { + "stops": [[12, 1], [14, 2], [16, 5], [18, 24], [19, 60], [20, 120]] + }, + "line-opacity": {"stops": [[12, 0], [13, 1]]} + } + }, + { + "id": "bridge-street-secondary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "secondary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": { + "stops": [[11, 1], [14, 4], [16, 6], [18, 28], [19, 64], [20, 130]] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "bridge-street-primary", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "primary"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": { + "stops": [ + [8, 0], + [9, 2], + [10, 3], + [14, 5], + [16, 10], + [18, 34], + [19, 70], + [20, 140] + ] + }, + "line-opacity": {"stops": [[8, 0], [9, 1]]} + } + }, + { + "id": "bridge-street-trunk", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "trunk"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(48,100%,17%)", + "line-width": { + "stops": [ + [6, 0], + [7, 1], + [10, 3], + [14, 5], + [16, 10], + [18, 34], + [19, 70], + [20, 140] + ] + }, + "line-opacity": {"stops": [[6, 0], [7, 1]]} + } + }, + { + "id": "bridge-street-motorway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["==", "bridge", true], + ["in", "kind", "motorway"], + ["!=", "link", true] + ], + "layout": {"line-join": "round", "line-cap": "butt"}, + "paint": { + "line-color": "hsl(34,100%,23%)", + "line-width": { + "stops": [ + [5, 0], + [6, 1], + [10, 4], + [14, 4], + [16, 12], + [18, 36], + [19, 80], + [20, 160] + ] + }, + "line-opacity": {"stops": [[5, 0], [6, 1]]} + } + }, + { + "id": "bridge-transport-tram:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "tram"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "bridge-transport-narrowgauge:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "narrow_gauge"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "bridge-transport-subway:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["in", "kind", "subway"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(207,23%,28%)", + "line-width": { + "stops": [ + [11, 0], + [12, 1], + [15, 3], + [16, 3], + [18, 6], + [19, 8], + [20, 10] + ] + }, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "bridge-transport-lightrail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 8, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[8, 1], [13, 1], [15, 1], [20, 14]]}, + "line-opacity": {"stops": [[11, 0], [12, 1]]} + } + }, + { + "id": "bridge-transport-lightrail-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[14, 0], [15, 1], [16, 1], [20, 14]]} + } + }, + { + "id": "bridge-transport-rail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 8, + "filter": [ + "all", + ["in", "kind", "rail"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[8, 1], [13, 1], [15, 1], [20, 14]]}, + "line-opacity": {"stops": [[8, 0], [9, 1]]} + } + }, + { + "id": "bridge-transport-rail-service:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "rail"], + ["has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[14, 0], [15, 1], [16, 1], [20, 14]]} + } + }, + { + "id": "bridge-transport-monorail:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["in", "kind", "monorail"], ["==", "bridge", true]], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "bridge-transport-funicular:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": ["all", ["in", "kind", "funicular"], ["==", "bridge", true]], + "paint": { + "line-color": "hsl(208,14%,27%)", + "line-width": {"stops": [[15, 0], [16, 5], [18, 7], [20, 20]]}, + "line-dasharray": [0.1, 0.5] + } + }, + { + "id": "bridge-transport-tram", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "tram"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "bridge-transport-narrowgauge", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "narrow_gauge"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "bridge-transport-subway", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "filter": [ + "all", + ["in", "kind", "subway"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "rgb(42,55,67)", + "line-width": { + "stops": [ + [11, 0], + [12, 1], + [15, 2], + [16, 2], + [18, 5], + [19, 6], + [20, 8] + ] + }, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "bridge-transport-lightrail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[14, 0], [15, 1], [20, 10]]}, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "bridge-transport-lightrail-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "light_rail"], + ["has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[15, 0], [16, 1], [20, 10]]}, + "line-dasharray": [2, 2] + } + }, + { + "id": "bridge-transport-rail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 14, + "filter": [ + "all", + ["in", "kind", "rail"], + ["!has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[14, 0], [15, 1], [20, 10]]}, + "line-dasharray": [2, 2], + "line-opacity": {"stops": [[14, 0], [15, 1]]} + } + }, + { + "id": "bridge-transport-rail-service", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 15, + "filter": [ + "all", + ["in", "kind", "rail"], + ["has", "service"], + ["==", "bridge", true] + ], + "paint": { + "line-color": "rgb(44,52,59)", + "line-width": {"stops": [[15, 0], [16, 1], [20, 10]]}, + "line-dasharray": [2, 2] + } + }, + { + "id": "bridge-transport-monorail", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": ["all", ["in", "kind", "monorail"], ["==", "bridge", true]], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "bridge-transport-funicular", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 13, + "filter": ["all", ["in", "kind", "funicular"], ["==", "bridge", true]], + "paint": { + "line-width": {"stops": [[13, 0], [16, 1], [17, 2], [18, 3], [20, 5]]}, + "line-color": "hsl(208,14%,27%)" + } + }, + { + "id": "poi-amenity", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "amenity"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "amenity"], + "arts_centre", + "basics:icon-art_gallery", + "atm", + "basics:icon-atm", + "bank", + "basics:icon-bank", + "bar", + "basics:icon-bar", + "bench", + "basics:icon-bench", + "bicycle_rental", + "basics:icon-bicycle_share", + "biergarten", + "basics:icon-beergarden", + "cafe", + "basics:icon-cafe", + "car_rental", + "basics:icon-car_rental", + "car_sharing", + "basics:icon-car_rental", + "car_wash", + "basics:icon-car_wash", + "cinema", + "basics:icon-cinema", + "college", + "basics:icon-college", + "community_centre", + "basics:icon-community", + "dentist", + "basics:icon-dentist", + "doctors", + "basics:icon-doctor", + "dog_park", + "basics:icon-dog_park", + "drinking_water", + "basics:icon-drinking_water", + "embassy", + "basics:icon-embassy", + "fast_food", + "basics:icon-fast_food", + "fire_station", + "basics:icon-fire_station", + "fountain", + "basics:icon-fountain", + "grave_yard", + "basics:icon-cemetery", + "hospital", + "basics:icon-hospital", + "hunting_stand", + "basics:icon-huntingstand", + "library", + "basics:icon-library", + "marketplace", + "basics:icon-marketplace", + "nightclub", + "basics:icon-nightclub", + "nursing_home", + "basics:icon-nursinghome", + "pharmacy", + "basics:icon-pharmacy", + "place_of_worship", + "basics:icon-place_of_worship", + "playground", + "basics:icon-playground", + "police", + "basics:icon-police", + "post_box", + "basics:icon-postbox", + "post_office", + "basics:icon-post", + "prison", + "basics:icon-prison", + "pub", + "basics:icon-beer", + "recycling", + "basics:icon-recycling", + "restaurant", + "basics:icon-restaurant", + "school", + "basics:icon-school", + "shelter", + "basics:icon-shelter", + "telephone", + "basics:icon-telephone", + "theatre", + "basics:icon-theatre", + "toilets", + "basics:icon-toilet", + "townhall", + "basics:icon-town_hall", + "vending_machine", + "basics:icon-vendingmachine", + "veterinary", + "basics:icon-veterinary", + "waste_basket", + "basics:icon-waste_basket", + "" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-leisure", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "leisure"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "leisure"], + "golf_course", + "basics:icon-golf", + "ice_rink", + "basics:icon-icerink", + "pitch", + "basics:icon-pitch", + "stadium", + "basics:icon-stadium", + "swimming_pool", + "basics:icon-swimming", + "water_park", + "basics:icon-waterpark", + "basics:icon-sports" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-tourism", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "tourism"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "tourism"], + "chalet", + "basics:icon-chalet", + "information", + "basics:transport-information", + "picnic_site", + "basics:icon-picnic_site", + "viewpoint", + "basics:icon-viewpoint", + "zoo", + "basics:icon-zoo", + "" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-shop", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "shop"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "shop"], + "alcohol", + "basics:icon-alcohol_shop", + "bakery", + "basics:icon-bakery", + "beauty", + "basics:icon-beauty", + "beverages", + "basics:icon-beverages", + "books", + "basics:icon-books", + "butcher", + "basics:icon-butcher", + "chemist", + "basics:icon-chemist", + "clothes", + "basics:icon-clothes", + "doityourself", + "basics:icon-doityourself", + "dry_cleaning", + "basics:icon-drycleaning", + "florist", + "basics:icon-florist", + "furniture", + "basics:icon-furniture", + "garden_centre", + "basics:icon-garden_centre", + "general", + "basics:icon-shop", + "gift", + "basics:icon-gift", + "greengrocer", + "basics:icon-greengrocer", + "hairdresser", + "basics:icon-hairdresser", + "hardware", + "basics:icon-hardware", + "jewelry", + "basics:icon-jewelry_store", + "kiosk", + "basics:icon-kiosk", + "laundry", + "basics:icon-laundry", + "newsagent", + "basics:icon-newsagent", + "optican", + "basics:icon-optician", + "outdoor", + "basics:icon-outdoor", + "shoes", + "basics:icon-shoes", + "sports", + "basics:icon-sports", + "stationery", + "basics:icon-stationery", + "toys", + "basics:icon-toys", + "travel_agency", + "basics:icon-travel_agent", + "video", + "basics:icon-video", + "basics:icon-shop" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-man_made", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "man_made"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "man_made"], + "lighthouse", + "basics:icon-lighthouse", + "surveillance", + "basics:icon-surveillance", + "tower", + "basics:icon-observation_tower", + "watermill", + "basics:icon-watermill", + "windmill", + "basics:icon-windmill", + "" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-historic", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "historic"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "historic"], + "artwork", + "basics:icon-artwork", + "castle", + "basics:icon-castle", + "monument", + "basics:icon-monument", + "wayside_shrine", + "basics:icon-shrine", + "basics:icon-historic" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-emergency", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "emergency"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"], + "icon-image": [ + "match", + ["get", "emergency"], + "defibrillator", + "basics:icon-defibrillator", + "fire_hydrant", + "basics:icon-hydrant", + "phone", + "basics:icon-emergency_phone", + "" + ] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-highway", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "highway"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "poi-office", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "pois", + "minzoom": 16, + "filter": ["to-boolean", ["get", "office"]], + "layout": { + "icon-size": {"stops": [[16, 0.5], [19, 0.5], [20, 1]]}, + "symbol-placement": "point", + "icon-optional": true, + "text-font": ["noto_sans_regular"] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4]]}, + "icon-color": "hsl(0,0%,67%)", + "text-color": "hsl(0,0%,67%)" + } + }, + { + "id": "boundary-country:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "boundaries", + "filter": [ + "all", + ["==", "admin_level", 2], + ["!=", "maritime", true], + ["!=", "disputed", true], + ["!=", "coastline", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "rgb(16,11,6)", + "line-blur": 1, + "line-width": {"stops": [[2, 0], [3, 2], [10, 8]]}, + "line-opacity": 0.75 + } + }, + { + "id": "boundary-country-disputed:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "boundaries", + "filter": [ + "all", + ["==", "admin_level", 2], + ["==", "disputed", true], + ["!=", "maritime", true], + ["!=", "coastline", true] + ], + "paint": { + "line-width": {"stops": [[2, 0], [3, 2], [10, 8]]}, + "line-opacity": 0.75, + "line-color": "rgb(16,11,6)" + } + }, + { + "id": "boundary-state:outline", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "boundaries", + "filter": [ + "all", + ["==", "admin_level", 4], + ["!=", "maritime", true], + ["!=", "disputed", true], + ["!=", "coastline", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "rgb(15,11,5)", + "line-blur": 1, + "line-width": {"stops": [[7, 0], [8, 2], [10, 4]]}, + "line-opacity": 0.75 + } + }, + { + "id": "boundary-country", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "boundaries", + "filter": [ + "all", + ["==", "admin_level", 2], + ["!=", "maritime", true], + ["!=", "disputed", true], + ["!=", "coastline", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(240,24%,28%)", + "line-width": {"stops": [[2, 0], [3, 1], [10, 4]]} + } + }, + { + "id": "boundary-country-disputed", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "boundaries", + "filter": [ + "all", + ["==", "admin_level", 2], + ["==", "disputed", true], + ["!=", "maritime", true], + ["!=", "coastline", true] + ], + "layout": {"line-cap": "square"}, + "paint": { + "line-width": {"stops": [[2, 0], [3, 1], [10, 4]]}, + "line-color": "hsl(246,17%,23%)", + "line-dasharray": [2, 1] + } + }, + { + "id": "boundary-state", + "type": "line", + "source": "versatiles-shortbread", + "source-layer": "boundaries", + "filter": [ + "all", + ["==", "admin_level", 4], + ["!=", "maritime", true], + ["!=", "disputed", true], + ["!=", "coastline", true] + ], + "layout": {"line-cap": "round", "line-join": "round"}, + "paint": { + "line-color": "hsl(240,24%,28%)", + "line-width": {"stops": [[7, 0], [8, 1], [10, 2]]} + } + }, + { + "id": "label-address-housenumber", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "addresses", + "minzoom": 17, + "filter": ["has", "housenumber"], + "layout": { + "text-field": "{housenumber}", + "text-font": ["noto_sans_regular"], + "symbol-placement": "point", + "text-anchor": "center", + "text-size": {"stops": [[17, 8], [19, 10]]} + }, + "paint": { + "icon-color": "rgb(95,88,81)", + "text-color": "rgb(95,88,81)", + "text-halo-color": "rgb(23,17,10)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-motorway-shield", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 14, + "filter": ["==", "kind", "motorway"], + "layout": { + "text-field": "{ref}", + "text-font": ["noto_sans_bold"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[14, 10], [18, 12], [20, 16]]} + }, + "paint": { + "icon-color": "hsl(0,0%,0%)", + "text-color": "hsl(0,0%,0%)", + "text-halo-color": "hsl(34,100%,23%)", + "text-halo-width": 0.1, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-pedestrian", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "pedestrian"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-livingstreet", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "living_street"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-residential", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "residential"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-unclassified", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "unclassified"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-tertiary", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "tertiary"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-secondary", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "secondary"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-primary", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "primary"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-trunk", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "trunk"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-street-track", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "street_labels", + "minzoom": 12, + "filter": ["==", "kind", "track"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "symbol-placement": "line", + "text-anchor": "center", + "text-size": {"stops": [[12, 10], [15, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-neighbourhood", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 14, + "filter": ["==", "kind", "neighbourhood"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[14, 12]]}, + "text-transform": "uppercase" + }, + "paint": { + "icon-color": "rgb(182,209,215)", + "text-color": "rgb(182,209,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-quarter", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 13, + "filter": ["==", "kind", "quarter"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[13, 13]]}, + "text-transform": "uppercase" + }, + "paint": { + "icon-color": "rgb(182,204,215)", + "text-color": "rgb(182,204,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-suburb", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 11, + "filter": ["==", "kind", "suburb"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[11, 11], [13, 14]]}, + "text-transform": "uppercase" + }, + "paint": { + "icon-color": "rgb(182,198,215)", + "text-color": "rgb(182,198,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-hamlet", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 13, + "filter": ["==", "kind", "hamlet"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[10, 11], [12, 14]]} + }, + "paint": { + "icon-color": "rgb(182,190,215)", + "text-color": "rgb(182,190,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-village", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 11, + "filter": ["==", "kind", "village"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[9, 11], [12, 14]]} + }, + "paint": { + "icon-color": "rgb(182,190,215)", + "text-color": "rgb(182,190,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-town", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 9, + "filter": ["==", "kind", "town"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[8, 11], [12, 14]]} + }, + "paint": { + "icon-color": "rgb(182,190,215)", + "text-color": "rgb(182,190,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-boundary-state", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "boundary_labels", + "minzoom": 5, + "filter": ["in", "admin_level", 4, "4"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "text-transform": "uppercase", + "text-anchor": "top", + "text-offset": [0, 0.2], + "text-padding": 0, + "text-optional": true, + "text-size": {"stops": [[5, 8], [8, 12]]} + }, + "paint": { + "icon-color": "rgb(178,178,194)", + "text-color": "rgb(178,178,194)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-city", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 7, + "filter": ["==", "kind", "city"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[7, 11], [10, 14]]} + }, + "paint": { + "icon-color": "rgb(182,190,215)", + "text-color": "rgb(182,190,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-statecapital", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 6, + "filter": ["==", "kind", "state_capital"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[6, 11], [10, 15]]} + }, + "paint": { + "icon-color": "rgb(182,190,215)", + "text-color": "rgb(182,190,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-place-capital", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "place_labels", + "minzoom": 5, + "filter": ["==", "kind", "capital"], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "symbol-sort-key": ["-", ["to-number", ["get", "population"], 0]], + "text-font": ["noto_sans_regular"], + "text-size": {"stops": [[5, 12], [10, 16]]} + }, + "paint": { + "icon-color": "rgb(182,190,215)", + "text-color": "rgb(182,190,215)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-boundary-country-small", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "boundary_labels", + "minzoom": 4, + "filter": [ + "all", + ["in", "admin_level", 2, "2"], + ["<=", "way_area", 10000000] + ], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "text-transform": "uppercase", + "text-anchor": "top", + "text-offset": [0, 0.2], + "text-padding": 0, + "text-optional": true, + "text-size": {"stops": [[4, 8], [5, 11]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-boundary-country-medium", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "boundary_labels", + "minzoom": 3, + "filter": [ + "all", + ["in", "admin_level", 2, "2"], + ["<", "way_area", 90000000], + [">", "way_area", 10000000] + ], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "text-transform": "uppercase", + "text-anchor": "top", + "text-offset": [0, 0.2], + "text-padding": 0, + "text-optional": true, + "text-size": {"stops": [[3, 8], [5, 12]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "label-boundary-country-large", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "boundary_labels", + "minzoom": 2, + "filter": [ + "all", + ["in", "admin_level", 2, "2"], + [">=", "way_area", 90000000] + ], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "text-font": ["noto_sans_regular"], + "text-transform": "uppercase", + "text-anchor": "top", + "text-offset": [0, 0.2], + "text-padding": 0, + "text-optional": true, + "text-size": {"stops": [[2, 8], [5, 13]]} + }, + "paint": { + "icon-color": "hsl(240,14%,77%)", + "text-color": "hsl(240,14%,77%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "marking-oneway", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 16, + "filter": [ + "all", + ["==", "oneway", true], + [ + "in", + "kind", + "trunk", + "primary", + "secondary", + "tertiary", + "unclassified", + "residential", + "living_street" + ] + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 175, + "icon-rotate": 90, + "icon-rotation-alignment": "map", + "icon-padding": 5, + "symbol-avoid-edges": true, + "icon-image": "basics:marking-arrow", + "text-font": ["noto_sans_regular"] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4], [20, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4], [20, 0.4]]} + } + }, + { + "id": "marking-oneway-reverse", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "streets", + "minzoom": 16, + "filter": [ + "all", + ["==", "oneway_reverse", true], + [ + "in", + "kind", + "trunk", + "primary", + "secondary", + "tertiary", + "unclassified", + "residential", + "living_street" + ] + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 75, + "icon-rotate": -90, + "icon-rotation-alignment": "map", + "icon-padding": 5, + "symbol-avoid-edges": true, + "icon-image": "basics:marking-arrow", + "text-font": ["noto_sans_regular"] + }, + "paint": { + "icon-opacity": {"stops": [[16, 0], [17, 0.4], [20, 0.4]]}, + "text-opacity": {"stops": [[16, 0], [17, 0.4], [20, 0.4]]} + } + }, + { + "id": "symbol-transit-station", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "public_transport", + "minzoom": 13, + "filter": [ + "all", + ["in", "kind", "station", "halt"], + ["!in", "station", "light_rail", "subway"] + ], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "icon-size": {"stops": [[13, 0.5], [15, 1]]}, + "symbol-placement": "point", + "icon-keep-upright": true, + "text-font": ["noto_sans_regular"], + "text-size": 10, + "icon-anchor": "bottom", + "text-anchor": "top", + "icon-image": "basics:icon-rail" + }, + "paint": { + "icon-opacity": 0.7, + "icon-color": "hsl(270,4%,60%)", + "text-color": "hsl(270,4%,60%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "symbol-transit-airfield", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "public_transport", + "minzoom": 13, + "filter": ["all", ["==", "kind", "aerodrome"], ["!has", "iata"]], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "icon-size": {"stops": [[13, 0.5], [15, 1]]}, + "symbol-placement": "point", + "icon-keep-upright": true, + "text-font": ["noto_sans_regular"], + "text-size": 10, + "icon-anchor": "bottom", + "text-anchor": "top", + "icon-image": "basics:icon-airfield" + }, + "paint": { + "icon-opacity": 0.7, + "icon-color": "hsl(270,4%,60%)", + "text-color": "hsl(270,4%,60%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + }, + { + "id": "symbol-transit-airport", + "type": "symbol", + "source": "versatiles-shortbread", + "source-layer": "public_transport", + "minzoom": 12, + "filter": ["all", ["==", "kind", "aerodrome"], ["has", "iata"]], + "layout": { + "text-field": [ + "coalesce", + ["get", "name"], + ["get", "name_en"], + ["get", "name_de"] + ], + "icon-size": {"stops": [[12, 0.5], [14, 1]]}, + "symbol-placement": "point", + "icon-keep-upright": true, + "text-font": ["noto_sans_regular"], + "text-size": 10, + "icon-anchor": "bottom", + "text-anchor": "top", + "icon-image": "basics:icon-airport" + }, + "paint": { + "icon-opacity": 0.7, + "icon-color": "hsl(270,4%,60%)", + "text-color": "hsl(270,4%,60%)", + "text-halo-color": "hsla(0,0%,0%,0.8)", + "text-halo-width": 2, + "text-halo-blur": 1 + } + } + ], + "id": "80klscq" +} \ No newline at end of file diff --git a/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt b/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt --- a/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt +++ b/app/src/main/java/it/reyboz/bustorino/ActivityIntro.kt @@ -32,8 +32,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_intro) - //check default settings and apply them - checkApplyDefaultSettingsValues() viewPager = findViewById(R.id.viewPager) btnBackward = findViewById(R.id.btnPrevious) btnForward = findViewById(R.id.btnNext) diff --git a/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java b/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java --- a/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java +++ b/app/src/main/java/it/reyboz/bustorino/ActivityPrincipal.java @@ -33,6 +33,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; import androidx.core.graphics.Insets; import androidx.core.view.*; @@ -49,6 +50,7 @@ import java.util.Arrays; import java.util.Map; +import java.util.Objects; import java.util.concurrent.LinkedBlockingDeque; import java.util.function.Consumer; @@ -72,6 +74,7 @@ private final static String TAG_FAVORITES="favorites_frag"; private Snackbar snackbar; + private ServiceAlertsViewModel serviceAlertsViewModel; //private FragmentKind showingFragmentKind; @@ -116,6 +119,8 @@ } }; + + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -123,10 +128,6 @@ setContentView(R.layout.activity_principal); serviceAlertsViewModel = new ViewModelProvider(this).get(ServiceAlertsViewModel.class); //Use LiveModel to sync fragment state - /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - getWindow().setNavigationBarContrastEnforced(false); - } - */ //onBackPressed solution required from Android 16 backPressedCallback.setEnabled(true); @@ -282,8 +283,8 @@ } //boolean onCreateComplete = true; - //last but not least, set the good default values - checkApplyDefaultSettingsValues(); + //default values are set in the BustoApp + //checkApplyDefaultSettingsValues(); // handle the device "insets" /* ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.rootRelativeLayout), (v, windowInsets) -> { diff --git a/app/src/main/java/it/reyboz/bustorino/BustoApp.java b/app/src/main/java/it/reyboz/bustorino/BustoApp.java --- a/app/src/main/java/it/reyboz/bustorino/BustoApp.java +++ b/app/src/main/java/it/reyboz/bustorino/BustoApp.java @@ -19,7 +19,13 @@ import android.content.Context; +import android.content.SharedPreferences; +import androidx.appcompat.app.AppCompatDelegate; import androidx.multidex.MultiDexApplication; +import androidx.preference.PreferenceManager; +import it.reyboz.bustorino.backend.utils; +import it.reyboz.bustorino.data.PreferencesHolder; +import it.reyboz.bustorino.fragments.SettingsFragment; import org.acra.ACRA; import org.acra.BuildConfig; import org.acra.ReportField; @@ -29,8 +35,7 @@ import org.acra.data.StringFormat; import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import static org.acra.ReportField.*; @@ -41,6 +46,7 @@ IS_SILENT, STACK_TRACE, INITIAL_CONFIGURATION, CRASH_CONFIGURATION, DISPLAY, USER_COMMENT, USER_APP_START_DATE, USER_CRASH_DATE, LOGCAT, SHARED_PREFERENCES); + @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); @@ -72,4 +78,62 @@ } + @Override + public void onCreate() { + super.onCreate(); + checkApplyDefaultSettingsValues(); + + var dayorNight = PreferencesHolder.getAppThemeDayNight(this); + AppCompatDelegate.setDefaultNightMode(dayorNight); + + } + + /** + * Adjust setting to match the default ones + */ + protected void checkApplyDefaultSettingsValues(){ + SharedPreferences mainSharedPref = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = mainSharedPref.edit(); + boolean edit = false; + + //Day or night theme + var str = mainSharedPref.getString(PreferencesHolder.PREF_THEME_DAY_NIGHT, ""); + if(str.isEmpty()){ + editor.putString(PreferencesHolder.PREF_THEME_DAY_NIGHT, "system"); + edit = true; + } + + //Main fragment to show + String screen = mainSharedPref.getString(SettingsFragment.PREF_KEY_STARTUP_SCREEN, ""); + if (screen.isEmpty()){ + editor.putString(SettingsFragment.PREF_KEY_STARTUP_SCREEN, "arrivals"); + edit=true; + } + //Fetchers + final Set setSelected = mainSharedPref.getStringSet(SettingsFragment.KEY_ARRIVALS_FETCHERS_USE, new HashSet<>()); + if (setSelected.isEmpty()){ + String[] defaultVals = getResources().getStringArray(R.array.arrivals_sources_values_default); + editor.putStringSet(SettingsFragment.KEY_ARRIVALS_FETCHERS_USE, utils.convertArrayToSet(defaultVals)); + edit=true; + } + //Live bus positions + final String keySourcePositions=getString(R.string.pref_positions_source); + final String positionsSource = mainSharedPref.getString(keySourcePositions, ""); + if(positionsSource.isEmpty()){ + String[] defaultVals = getResources().getStringArray(R.array.positions_source_values); + editor.putString(keySourcePositions, defaultVals[0]); + edit=true; + } + //Map style + final String mapStylePref = mainSharedPref.getString(SettingsFragment.LIBREMAP_STYLE_PREF_KEY, ""); + if(mapStylePref.isEmpty()){ + final String[] defaultVals = getResources().getStringArray(R.array.map_style_pref_values); + editor.putString(SettingsFragment.LIBREMAP_STYLE_PREF_KEY, defaultVals[0]); + edit=true; + } + if (edit){ + editor.apply(); + } + + } } diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/ArrivalsStopAdapter.java b/app/src/main/java/it/reyboz/bustorino/adapters/ArrivalsStopAdapter.java --- a/app/src/main/java/it/reyboz/bustorino/adapters/ArrivalsStopAdapter.java +++ b/app/src/main/java/it/reyboz/bustorino/adapters/ArrivalsStopAdapter.java @@ -19,7 +19,6 @@ import android.content.Context; import android.content.SharedPreferences; -import android.location.Location; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Pair; @@ -39,7 +38,7 @@ import java.util.*; public class ArrivalsStopAdapter extends RecyclerView.Adapter implements SharedPreferences.OnSharedPreferenceChangeListener { - private final static int layoutRes = R.layout.arrivals_nearby_card; + private final static int layoutRes = R.layout.item_arrivals_nearby_card; //private List stops; private @NonNull GPSPoint userPosition; private FragmentListenerMain listener; @@ -51,7 +50,7 @@ private NameCapitalize capit; - public ArrivalsStopAdapter(@Nullable List< RouteWithStop > routesPairList, FragmentListenerMain fragmentListener, Context con, @NonNull GPSPoint pos) { + public ArrivalsStopAdapter(@Nullable List< RouteWithStop > routesPairList,@NonNull FragmentListenerMain fragmentListener, @NonNull Context con, @NonNull GPSPoint pos) { listener = fragmentListener; userPosition = pos; this.routesPairList = routesPairList; diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/PalinaAdapter.java b/app/src/main/java/it/reyboz/bustorino/adapters/PalinaAdapter.java --- a/app/src/main/java/it/reyboz/bustorino/adapters/PalinaAdapter.java +++ b/app/src/main/java/it/reyboz/bustorino/adapters/PalinaAdapter.java @@ -19,6 +19,8 @@ import android.content.Context; import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.cardview.widget.CardView; import androidx.core.content.res.ResourcesCompat; @@ -63,9 +65,9 @@ private static final int busBg = R.drawable.route_background_bus; private static final int extraurbanoBg = R.drawable.route_background_bus_long_distance; - private static final int busIcon = R.drawable.bus; - private static final int trainIcon = R.drawable.subway; - private static final int tramIcon = R.drawable.tram; + private static final int busIcon = R.drawable.ic_bus; + private static final int trainIcon = R.drawable.ic_subway_filled; + private static final int tramIcon = R.drawable.ic_tram_filled_24; private final String KEY_CAPITALIZE; private Capitalize capit; @@ -123,7 +125,8 @@ } vh.rowRouteDestination.setText(dest); } - + Drawable drawable = null; + final var resources = con.getResources(); switch (route.type) { //UNKNOWN = BUS for the moment case UNKNOWN: @@ -131,28 +134,36 @@ default: // convertView could contain another background, reset it //vh.rowStopIcon.setBackgroundResource(busBg); - - vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(busIcon, 0, 0, 0); + //drawable = ResourcesCompat.getDrawable(con.getResources(), busIcon, con.getTheme()); + //vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(busIcon, 0, 0, 0); + vh.busIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, busIcon, con.getTheme())); break; case LONG_DISTANCE_BUS: //vh.rowStopIcon.setBackgroundResource(extraurbanoBg); vh.routeCard.setCardBackgroundColor(ResourcesCompat.getColor(res, R.color.extraurban_bus_bg, null)); - vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(busIcon, 0, 0, 0); + vh.busIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, extraurbanoBg, con.getTheme())); break; case METRO: //vh.rowStopIcon.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); //vh.rowStopIcon.setBackgroundResource(metroBg); vh.routeIDTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); vh.routeCard.setCardBackgroundColor(ResourcesCompat.getColor(res, R.color.metro_bg, null)); - vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(trainIcon, 0, 0, 0); + // vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(trainIcon, 0, 0, 0); + vh.busIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, trainIcon, con.getTheme())); break; case RAILWAY: //vh.rowStopIcon.setBackgroundResource(busBg); - vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(trainIcon, 0, 0, 0); + //vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(trainIcon, 0, 0, 0); + vh.busIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, trainIcon, con.getTheme())); break; case TRAM: // never used but whatever. //vh.rowStopIcon.setBackgroundResource(busBg); - vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(tramIcon, 0, 0, 0); + drawable = ResourcesCompat.getDrawable(resources, trainIcon, con.getTheme()); + assert drawable != null; + drawable.setTint(resources.getColor(R.color.black_icon_text, con.getTheme()) ); + //vh.rowRouteDestination.setCompoundDrawablesWithIntrinsicBounds(tramIcon, 0, 0, 0); + vh.busIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, tramIcon, con.getTheme())); + break; } @@ -181,19 +192,15 @@ final CardView routeCard; final TextView rowRouteDestination; final TextView rowRouteTimetable; + final ImageView busIcon; public PalinaViewHolder(@NonNull @NotNull View view) { super(view); - /* - convertView.findViewById(R.id.routeID); - vh.rowRouteDestination = (TextView) convertView.findViewById(R.id.routeDestination); - vh.rowRouteTimetable = (TextView) convertView.findViewById(R.id.routesThatStopHere); - */ - //rowStopIcon = view.findViewById(R.id.routeID); routeIDTextView = view.findViewById(R.id.routeNameTextView); routeCard = view.findViewById(R.id.routeCard); rowRouteDestination = view.findViewById(R.id.routeDestination); rowRouteTimetable = view.findViewById(R.id.routesThatStopHere); + busIcon = view.findViewById(R.id.arrivalsBusIcon); } } private static Capitalize getCapitalize(SharedPreferences shPr, String key){ diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/SquareStopAdapter.java b/app/src/main/java/it/reyboz/bustorino/adapters/SquareStopAdapter.java --- a/app/src/main/java/it/reyboz/bustorino/adapters/SquareStopAdapter.java +++ b/app/src/main/java/it/reyboz/bustorino/adapters/SquareStopAdapter.java @@ -17,7 +17,6 @@ */ package it.reyboz.bustorino.adapters; -import android.location.Location; import androidx.annotation.Nullable; import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; @@ -28,7 +27,6 @@ import android.widget.TextView; import it.reyboz.bustorino.R; import it.reyboz.bustorino.backend.GPSPoint; -import it.reyboz.bustorino.backend.RouteWithStop; import it.reyboz.bustorino.backend.Stop; import it.reyboz.bustorino.util.StopSorterByDistance; import it.reyboz.bustorino.fragments.FragmentListenerMain; @@ -37,7 +35,7 @@ import java.util.List; public class SquareStopAdapter extends RecyclerView.Adapter { - private final static int layoutRes = R.layout.stop_card; + private final static int layoutRes = R.layout.item_stop_nearby_card; //private List stops; private @Nullable GPSPoint userPosition; private FragmentListenerMain listener; diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/StopAdapter.java b/app/src/main/java/it/reyboz/bustorino/adapters/StopAdapter.java --- a/app/src/main/java/it/reyboz/bustorino/adapters/StopAdapter.java +++ b/app/src/main/java/it/reyboz/bustorino/adapters/StopAdapter.java @@ -18,6 +18,7 @@ package it.reyboz.bustorino.adapters; import android.content.Context; +import android.widget.ImageView; import androidx.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; @@ -36,18 +37,25 @@ public class StopAdapter extends ArrayAdapter { private LayoutInflater li; private static final int row_layout = R.layout.entry_bus_stop; - private static final int busIcon = R.drawable.bus; - private static final int trainIcon = R.drawable.subway; - private static final int tramIcon = R.drawable.tram; + private static final int busIcon = R.drawable.ic_bus; + private static final int trainIcon = R.drawable.ic_subway_filled; + private static final int tramIcon = R.drawable.ic_tram_filled_24; private static final int cityIcon = R.drawable.city; private static class ViewHolder { - TextView busStopIDTextView; - TextView busStopNameTextView; + final TextView busStopIDTextView; + final TextView busStopNameTextView; //TextView busLineVehicleIcon; - TextView busStopLinesTextView; - TextView busStopLocaLityTextView; + final TextView busStopLinesTextView; + final TextView busStopLocaLityTextView; + + ViewHolder(View view) { + busStopIDTextView = view.findViewById(R.id.busStopID); + busStopNameTextView = view.findViewById(R.id.busStopName); + busStopLinesTextView = view.findViewById(R.id.routesThatStopHere); + busStopLocaLityTextView = view.findViewById(R.id.busStopLocality); + } } public StopAdapter(Context context, List stops) { @@ -62,11 +70,7 @@ if(convertView == null) { convertView = li.inflate(row_layout, null); - vh = new ViewHolder(); - vh.busStopIDTextView = (TextView) convertView.findViewById(R.id.busStopID); - vh.busStopNameTextView = (TextView) convertView.findViewById(R.id.busStopName); - vh.busStopLinesTextView = (TextView) convertView.findViewById(R.id.routesThatStopHere); - vh.busStopLocaLityTextView = (TextView) convertView.findViewById(R.id.busStopLocality); + vh = new ViewHolder(convertView); convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); @@ -85,8 +89,10 @@ vh.busStopLinesTextView.setVisibility(View.VISIBLE); // might be GONE due to View Holder Pattern } + /* + // DEPRECATED CODE: ALWAYS USE BUS STOP ICON if(stop.type == null) { - vh.busStopLinesTextView.setCompoundDrawablesWithIntrinsicBounds(busIcon, 0, 0, 0); + //vh.busStopLinesTextView.setCompoundDrawablesWithIntrinsicBounds(busIcon, 0, 0, 0); } else { switch(stop.type) { case BUS: @@ -106,6 +112,8 @@ } } + */ + if (stop.location == null) { vh.busStopLocaLityTextView.setVisibility(View.GONE); } else { diff --git a/app/src/main/java/it/reyboz/bustorino/adapters/StopRecyclerAdapter.java b/app/src/main/java/it/reyboz/bustorino/adapters/StopRecyclerAdapter.java --- a/app/src/main/java/it/reyboz/bustorino/adapters/StopRecyclerAdapter.java +++ b/app/src/main/java/it/reyboz/bustorino/adapters/StopRecyclerAdapter.java @@ -37,9 +37,9 @@ private List stops; private static final int ITEM_LAYOUT_FAVORITES = R.layout.entry_bus_stop; private static final int ITEM_LAYOUT_LINES = R.layout.stop_line_element; - private static final int busIcon = R.drawable.bus; - private static final int trainIcon = R.drawable.subway; - private static final int tramIcon = R.drawable.tram; + private static final int busIcon = R.drawable.ic_bus; + private static final int trainIcon = R.drawable.ic_subway_filled; + private static final int tramIcon = R.drawable.ic_tram_filled_24; private static final int cityIcon = R.drawable.city; private NameCapitalize capitalizeLocation = NameCapitalize.DO_NOTHING; @@ -174,6 +174,8 @@ vh.busStopLinesTextView.setText(whatStopsHere); vh.busStopLinesTextView.setVisibility(View.VISIBLE); // might be GONE due to View Holder Pattern } + /* + //This is deprecated, always showing a bus if(stop.type == null) { vh.busStopLinesTextView.setCompoundDrawablesWithIntrinsicBounds(busIcon, 0, 0, 0); @@ -196,6 +198,8 @@ } } + */ + if (stop.location == null || stop.location.toLowerCase(Locale.ROOT).equals("null")) { vh.busStopLocaLityTextView.setVisibility(View.GONE); } else { diff --git a/app/src/main/java/it/reyboz/bustorino/backend/KotlinUtils.kt b/app/src/main/java/it/reyboz/bustorino/backend/KotlinUtils.kt new file mode 100644 --- /dev/null +++ b/app/src/main/java/it/reyboz/bustorino/backend/KotlinUtils.kt @@ -0,0 +1,13 @@ +package it.reyboz.bustorino.backend + +import android.content.Context +import android.content.res.Configuration + +object KotlinUtils { + + @JvmStatic + fun isDarkTheme(context: Context): Boolean { + val uiMode = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK + return uiMode == Configuration.UI_MODE_NIGHT_YES + } +} \ No newline at end of file diff --git a/app/src/main/java/it/reyboz/bustorino/backend/VehicleUtils.kt b/app/src/main/java/it/reyboz/bustorino/backend/VehicleUtils.kt --- a/app/src/main/java/it/reyboz/bustorino/backend/VehicleUtils.kt +++ b/app/src/main/java/it/reyboz/bustorino/backend/VehicleUtils.kt @@ -17,39 +17,41 @@ } object VehicleUtils { - private val items = listOf( - VehicleClassInfo(2800, "Arancio", "Tram", 2801, 2857), - VehicleClassInfo(2800, "Arancio", "Tram", 2858, 2902), - VehicleClassInfo(5000, "5000", "Tram", 5000, 5053), - VehicleClassInfo(6000, "6000", "Tram", 6000, 6005), - VehicleClassInfo(6000, "6000", "Tram", 6006, 6054), - VehicleClassInfo(8000, "Hitachi", "Tram", 8000, 8099), - VehicleClassInfo(800, "Citelis 18m", "Bus 18m", 790, 797), - VehicleClassInfo(800, "Citelis 18m", "Bus 18m", 800, 869), - VehicleClassInfo(800, "Citelis 18m", "Bus 18m", 870, 874), - VehicleClassInfo(800, "Citelis 18m", "Bus 18m", 1310, 1313), - VehicleClassInfo(1350, "Conecto 18m", "Bus 18m", 1350, 1396), - VehicleClassInfo(9300, "UrbanWay 18m", "Bus 18m", 9300, 9318), - VehicleClassInfo(9300, "UrbanWay 18m", "Bus 18m", 9320, 9356), - VehicleClassInfo(30, "BYD K9", "E-Bus", 30, 49), + val items = listOf( + VehicleClassInfo(30, "BYD K9UB", "E-Bus", 30, 49), VehicleClassInfo(50, "BYD K7", "E-Bus", 50, 57), - VehicleClassInfo(60, "MiniBusE", "E-Bus", 60, 81), - VehicleClassInfo(110, "Neocity", "Bus", 110, 115), - VehicleClassInfo(2300, "Cityclass", "Bus", 2300, 2349), - VehicleClassInfo(3400, "Conecto", "Bus", 2400, 2447), - VehicleClassInfo(2300, "Cityclass", "Bus", 2700, 2787), - VehicleClassInfo(3000, "Citelis", "Bus", 3000, 3099), - VehicleClassInfo(3000, "Citelis", "Bus", 3300, 3380), - VehicleClassInfo(3400, "Conecto", "Bus", 3400, 3440), - VehicleClassInfo(9000, "BYD K9", "E-Bus", 9000, 9059), - VehicleClassInfo(9000, "BYD K9", "E-Bus", 9060, 9119), - VehicleClassInfo(9000, "BYD K9", "E-Bus", 9120, 9121), - VehicleClassInfo(9200, "Citymood", "Bus", 9200, 9251), - VehicleClassInfo(9200, "Citymood", "Bus", 9252, 9261), + VehicleClassInfo(60, "Indcar BlueBus", "E-Bus", 60, 88), + VehicleClassInfo(110, "BMC Neocity", "Bus", 110, 115), + VehicleClassInfo(800, "Irisbus Citelis 18m", "Bus 18m", 790, 797), + VehicleClassInfo(800, "Irisbus Citelis 18m", "Bus 18m", 800, 869), + VehicleClassInfo(800, "Irisbus Citelis 18m ", "Bus 18m", 870, 874), + VehicleClassInfo(800, "Irisbus Citelis CNG 18m", "Bus 18m", 1310, 1313), + VehicleClassInfo(1350, "Mercedes Conecto 18m", "Bus 18m", 1350, 1396), + VehicleClassInfo(2300, "Irisbus CityClass", "Bus", 2300, 2349), + VehicleClassInfo(3400, "Mercedes Conecto", "Bus", 2400, 2447), + VehicleClassInfo(2300, "Irisbus CityClass", "Bus", 2700, 2787), + VehicleClassInfo(2800, "2800 (prima serie)", "Tram", 2801, 2857), + VehicleClassInfo(2800, "2800 (seconda serie)", "Tram", 2858, 2902), + VehicleClassInfo(3000, "Irisbus Citelis", "Bus", 3000, 3099), + VehicleClassInfo(3000, "Irisbus Citelis", "Bus", 3300, 3380), + VehicleClassInfo(3400, "Mercedes Conecto", "Bus", 3400, 3440), + VehicleClassInfo(5000, "P.R. (5000)", "Tram", 5000, 5053), + VehicleClassInfo(6000, "CityWay (6000) monodir.", "Tram", 6000, 6005), + VehicleClassInfo(6000, "CityWay (6000) bidir.", "Tram", 6006, 6054), + VehicleClassInfo(8000, "Hitachi (8000)", "Tram", 8000, 8099), + VehicleClassInfo(9000, "BYD K9UB", "E-Bus", 9000, 9059), + VehicleClassInfo(9000, "BYD K9UB", "E-Bus", 9060, 9119), + VehicleClassInfo(9000, "BYD K9UB", "E-Bus", 9120, 9121), + VehicleClassInfo(9200, "Menarini Citymood", "Bus", 9200, 9251), + VehicleClassInfo(9200, "Menarini Citymood", "Bus", 9252, 9261), + VehicleClassInfo(9300, "Iveco Urbanway 18m", "Bus 18m", 9300, 9318), + VehicleClassInfo(9300, "Iveco Urbanway 18m", "Bus 18m", 9320, 9356), VehicleClassInfo(9400, "Iveco E-Way", "E-Bus", 9400, 9599), - VehicleClassInfo(9600, "Iveco E-Way 18m", "E-Bus", 9600, 9699) + VehicleClassInfo(9600, "Iveco E-Way 18m", "E-Bus", 9600, 9699), + VehicleClassInfo(9700, "Iveco E-Way 18m BRT", "E-Bus", 9700, 9799) ) + fun getTypeForLabel(label: String): VehicleClassInfo? { try { val matricola = Integer.parseInt(label) diff --git a/app/src/main/java/it/reyboz/bustorino/data/GtfsMaintenanceWorker.kt b/app/src/main/java/it/reyboz/bustorino/data/GtfsMaintenanceWorker.kt --- a/app/src/main/java/it/reyboz/bustorino/data/GtfsMaintenanceWorker.kt +++ b/app/src/main/java/it/reyboz/bustorino/data/GtfsMaintenanceWorker.kt @@ -32,7 +32,7 @@ val notification = NotificationCompat.Builder(context, Notifications.DB_UPDATE_CHANNELS_ID) //.setContentIntent(PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), Constants.PENDING_INTENT_FLAG_IMMUTABLE)) - .setSmallIcon(R.drawable.bus) + .setSmallIcon(R.drawable.ic_bus) .setOngoing(true) .setAutoCancel(true) .setOnlyAlertOnce(true) diff --git a/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java b/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java --- a/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java +++ b/app/src/main/java/it/reyboz/bustorino/data/PreferencesHolder.java @@ -20,11 +20,13 @@ import android.content.Context; import android.content.SharedPreferences; import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatDelegate; import it.reyboz.bustorino.R; import static android.content.Context.MODE_PRIVATE; import androidx.preference.PreferenceManager; +import it.reyboz.bustorino.backend.KotlinUtils; import it.reyboz.bustorino.fragments.SettingsFragment; import it.reyboz.bustorino.map.MapLibreUtils; @@ -42,6 +44,9 @@ public static final String DB_LAST_UPDATE_KEY = "NextGenDB.LastDBUpdate"; public static final String PREF_FAVORITE_LINES = "pref_favorite_lines"; + // match the one in preferences.xml + public static final String PREF_THEME_DAY_NIGHT = "app_theme_day_night"; + public static final Set KEYS_MERGE_SET = Set.of(PREF_FAVORITE_LINES); public static final Set IGNORE_KEYS_LOAD_MAIN = Set.of(PREF_GTFS_DB_VERSION, PREF_INTRO_ACTIVITY_RUN, DB_GTT_VERSION_KEY, DB_LAST_UPDATE_KEY); @@ -98,11 +103,31 @@ public static String getMapLibreStyleFile(Context con){ final SharedPreferences pref = getAppPreferences(con); final String mapStyle_val = pref.getString(SettingsFragment.LIBREMAP_STYLE_PREF_KEY, ""); - return switch (mapStyle_val) { + final boolean isNightMode = KotlinUtils.isDarkTheme(con); + String styleFile; + switch (mapStyle_val) { //MUST MATCH IN keys.xml -> map_style_pref_values - case "versatiles_c" -> MapLibreUtils.STYLE_VERSATILES_COLORFUL_JSON; - case "osm_legacy" -> MapLibreUtils.STYLE_OSM_RASTER; - default -> MapLibreUtils.getDefaultStyleJson(); + case "osm_legacy": + styleFile = MapLibreUtils.STYLE_OSM_RASTER; + break; + case "versatiles_c": + default: + styleFile = (isNightMode) ? MapLibreUtils.STYLE_VERSATILES_ECLIPSE_JSON : MapLibreUtils.STYLE_VERSATILES_COLORFUL_JSON; + } + return styleFile; + } + + public static Integer getAppThemeDayNight(Context context){ + final SharedPreferences pref = getAppPreferences(context); + final var value = pref.getString(PREF_THEME_DAY_NIGHT, ""); + return getAppThemeDayNight(value); + } + public static Integer getAppThemeDayNight(String prefValue){ + return switch (prefValue){ + case "day" -> AppCompatDelegate.MODE_NIGHT_NO; + case "night" -> AppCompatDelegate.MODE_NIGHT_YES; + case "system" -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; + default -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM; }; } } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt --- a/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt +++ b/app/src/main/java/it/reyboz/bustorino/fragments/GeneralMapLibreFragment.kt @@ -29,6 +29,7 @@ import android.location.LocationManager import android.os.Bundle import android.util.Log +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -170,6 +171,7 @@ protected lateinit var stopNumberTextView: TextView protected lateinit var linesPassingTextView: TextView protected lateinit var extraBottomTextView: TextView + protected lateinit var linesBottomTextView: TextView protected lateinit var arrivalsCard: CardView protected lateinit var directionsCard: CardView protected lateinit var bottomrightImage: ImageView @@ -271,6 +273,8 @@ arrivalsCard = view.findViewById(R.id.arrivalsCardButton) directionsCard = view.findViewById(R.id.directionsCardButton) vehicleIcon = view.findViewById(R.id.vehicleIcon) + linesBottomTextView = view.findViewById(R.id.linesBottomTextView) + linesBottomTextView.text = getString(R.string.lines_fill, "") bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet) bottomSheetBehavior.state = BottomSheetBehavior.STATE_HIDDEN @@ -682,9 +686,11 @@ ResourcesCompat.getDrawable(resources, R.drawable.ic_magnifying_glass, activity?.theme) ) // if you change this, remember to change the color of the vehicleIcon - val colorBlue = ResourcesCompat.getColor(resources, R.color.blue_500, activity?.theme) + val colorBlue = ResourcesCompat.getColor(resources, R.color.bus_marker_color_selected, activity?.theme) ViewCompat.setBackgroundTintList(directionsCard, ColorStateList.valueOf(colorBlue)) linesPassingTextView.text = getString(R.string.vehicle_fill, data.posUpdate.vehicle) + linesPassingTextView.gravity = Gravity.CENTER_VERTICAL + linesBottomTextView.visibility = View.GONE arrivalsCard.visibility = View.GONE extraBottomTextView.text = getString(R.string.updated_fill, utils.unixTimestampToLocalTime(data.posUpdate.timestamp)) @@ -695,21 +701,21 @@ vehicleIcon.visibility = View.GONE } else{ val ico = when(vehInfo.type){ - VehicleUtils.VehicleType.BUS -> R.drawable.ic_bus_small - VehicleUtils.VehicleType.ELECTRIC_BUS -> R.drawable.ic_bus_electric_small - VehicleUtils.VehicleType.TRAM -> R.drawable.ic_tram_24 + VehicleUtils.VehicleType.BUS -> R.drawable.ic_bus + VehicleUtils.VehicleType.ELECTRIC_BUS -> R.drawable.ic_bus_electric_filled + VehicleUtils.VehicleType.TRAM -> R.drawable.ic_tram_material } vehicleIcon.setImageDrawable(ResourcesCompat.getDrawable(resources, ico, activity?.theme)) vehicleIcon.visibility = View.VISIBLE vehicleIcon.setOnClickListener { - val print = "${vehInfo.type.getName()} ${vehInfo.name}" + val print = "${vehInfo.type.getName()}: ${vehInfo.name}" makeToast(print) } } } - vehShowing = null + vehShowing = veh bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED updatePositionsIcons(true) Log.d(DEBUG_TAG, "Shown vehicle $veh in bottom sheet") @@ -726,7 +732,11 @@ val isStarted = (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) if(forced){ // if we're running a forced update, cancel the pending one - jobUpdate?.cancel() + jobUpdate?.apply{ + cancel() + //Log.d(DEBUG_TAG, "Cancelled update") + } + } else if (currentTime - lastUpdateTime < 100) { // Schedule delayed update @@ -734,8 +744,10 @@ jobUpdate?.cancel() jobUpdate = viewLifecycleOwner.lifecycleScope.launch { delay(100.milliseconds) + //Log.d(DEBUG_TAG, "Running update from delayed") updatePositionsIcons(false) } + //Log.d(DEBUG_TAG, "Cancelled previous job, delaying update") } return } @@ -763,6 +775,8 @@ // Separate selected vehicle from others if (vehShowing?.isNotEmpty() == true && vehShowing == dat.posUpdate.vehicle) { selectedBusFeatures.add(newFeature) + //Log.d(DEBUG_TAG, "Update position for bus $vehShowing") + //TODO: Recenter the map on the vehicle } else { busFeatures.add(newFeature) } @@ -849,9 +863,11 @@ stopTitleTextView.visibility = View.VISIBLE val string_show = if (stop.numRoutesStopping==0) "" - else requireContext().getString(R.string.lines_fill, stop.routesThatStopHereToString()) + else stop.routesThatStopHereToString() //requireContext().getString(R.string.lines_fill, stop.routesThatStopHereToString()) linesPassingTextView.text = string_show linesPassingTextView.visibility = View.VISIBLE + linesPassingTextView.gravity = Gravity.TOP + linesBottomTextView.visibility =View.VISIBLE //SET ON CLICK LISTENER arrivalsCard.setOnClickListener{ @@ -865,7 +881,7 @@ ViewUtils.openStopInOutsideApp(stop, context) } context?.let { - val colorIcon = ViewUtils.getColorFromTheme(it, android.R.attr.colorAccent)//ResourcesCompat.getColor(resources,R.attr.colorAccent,activity?.theme) + val colorIcon = ViewUtils.getColorFromTheme(it, R.attr.colorAccent)//ResourcesCompat.getColor(resources,R.attr.colorAccent,activity?.theme) ViewCompat.setBackgroundTintList(directionsCard, ColorStateList.valueOf(colorIcon)) } @@ -924,12 +940,17 @@ protected fun initStopsLayer(style: Style, stopsFeatures: FeatureCollection?){ //determine default layer - var layerAbove = "" - if (lastMapStyle == MapLibreUtils.STYLE_OSM_RASTER){ - layerAbove = "osm-raster" - } else if (lastMapStyle == MapLibreUtils.STYLE_VECTOR){ - layerAbove = "symbol-transit-airfield" + + val layerAbove = if (lastMapStyle == MapLibreUtils.STYLE_OSM_RASTER){ + "osm-raster" + } else// if (lastMapStyle == MapLibreUtils.STYLE_VERSATILES_ECLIPSE_JSON){ + "symbol-transit-airfield" + /*} else { + // + "poi_park" } + + */ initStopsLayer(style, stopsFeatures, layerAbove) } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/LivePositionsDialogFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/LivePositionsDialogFragment.kt --- a/app/src/main/java/it/reyboz/bustorino/fragments/LivePositionsDialogFragment.kt +++ b/app/src/main/java/it/reyboz/bustorino/fragments/LivePositionsDialogFragment.kt @@ -70,7 +70,7 @@ builder.setView(view) val res = builder.create() - res.window?.setBackgroundDrawableResource(R.color.grey_100) + res.window?.setBackgroundDrawableResource(R.color.card_background) return res } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.kt b/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.kt --- a/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.kt +++ b/app/src/main/java/it/reyboz/bustorino/fragments/NearbyStopsFragment.kt @@ -17,7 +17,6 @@ */ package it.reyboz.bustorino.fragments -import android.annotation.SuppressLint import android.content.Context import android.location.Location import android.os.Bundle @@ -33,6 +32,7 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.work.WorkInfo +import com.google.android.material.button.MaterialButton import it.reyboz.bustorino.BuildConfig import it.reyboz.bustorino.R import it.reyboz.bustorino.adapters.ArrivalsStopAdapter @@ -42,12 +42,11 @@ import it.reyboz.bustorino.middleware.AutoFitGridLayoutManager import it.reyboz.bustorino.middleware.FusedNativeLocationProvider import it.reyboz.bustorino.middleware.FusedNativeLocationProvider.LocationUpdateListener -import it.reyboz.bustorino.util.Permissions.Companion.anyLocationPermissionsGranted +import it.reyboz.bustorino.util.Permissions import it.reyboz.bustorino.util.Permissions.Companion.bothLocationPermissionsGranted import it.reyboz.bustorino.util.StopSorterByDistance import it.reyboz.bustorino.viewmodels.NearbyStopsViewModel import java.util.* -import kotlin.math.min class NearbyStopsFragment : ScreenBaseFragment() { override fun getBaseViewForSnackBar(): View? { @@ -70,7 +69,7 @@ } private enum class LocationShowingStatus { - SEARCHING, FIRST_FIX, DISABLED, NO_PERMISSION + SEARCHING, POSITION_FOUND, DISABLED, NO_PERMISSION } private var mListener: FragmentListenerMain? = null @@ -88,6 +87,7 @@ //protected SharedPreferences globalSharedPref; //private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener; private var messageTextView: TextView? = null + private lateinit var enableLocationButton : MaterialButton private var titleTextView: TextView? = null private var loadingTextView: TextView? = null private var scrollListener: CommonScrollListener? = null @@ -120,6 +120,11 @@ } } } + + private val locationPermissionLauncher = getPositionRequestLauncher(){ granted -> + startLocationUpdatesByType() + setShowingStatus(LocationShowingStatus.SEARCHING) + } // Two different settings for the location provider private val locationOptionsArrivals = FusedNativeLocationProvider.Options(5 * 1000L, 25f) private val locationOptionsStops = FusedNativeLocationProvider.Options(1000L, 5f) @@ -176,18 +181,19 @@ savedInstanceState: Bundle? ): View { // Inflate the layout for this fragment - if (getContext() == null) throw RuntimeException() + val context = requireContext() val root = inflater.inflate(R.layout.fragment_nearby_stops, container, false) gridRecyclerView = root.findViewById(R.id.stopGridRecyclerView) gridLayoutManager = AutoFitGridLayoutManager( - requireContext().getApplicationContext(), - utils.convertDipToPixels(getContext(), COLUMN_WIDTH_DP.toFloat()).toInt() + context.getApplicationContext(), + utils.convertDipToPixels(context, COLUMN_WIDTH_DP.toFloat()).toInt() ) gridRecyclerView.setLayoutManager(gridLayoutManager) gridRecyclerView.setHasFixedSize(false) circlingProgressBar = root.findViewById(R.id.circularProgressBar) flatProgressBar = root.findViewById(R.id.horizontalProgressBar) messageTextView = root.findViewById(R.id.messageTextView) + enableLocationButton = root.findViewById(R.id.grantLocationButton) titleTextView = root.findViewById(R.id.titleTextView) loadingTextView = root.findViewById(R.id.positionLoadingTextView) switchButton = root.findViewById(R.id.switchButton) @@ -209,32 +215,35 @@ viewModel.setDBUpdateRunning(true) } else { //start the request - if (bothLocationPermissionsGranted(requireContext())) { - if (!locationProvider!!.isRunning()) { - startLocationUpdatesByType() - } - } else { - setShowingStatus(LocationShowingStatus.NO_PERMISSION) - } - + checkPermissionLocationStart() viewModel.setDBUpdateRunning(false) //actually restart request } } - - if (anyLocationPermissionsGranted(appContext)) { - setShowingStatus(LocationShowingStatus.SEARCHING) - } else { - setShowingStatus(LocationShowingStatus.NO_PERMISSION) - } //add location listener locationProvider!!.addListener(locationUpdateListener) + enableLocationButton.setOnClickListener { + locationPermissionLauncher.launch(Permissions.LOCATION_PERMISSIONS) + } + return root } + private fun checkPermissionLocationStart(){ + Log.d(DEBUG_TAG, "Check permission and start location updates") + if (bothLocationPermissionsGranted(requireContext())) { + if (!locationProvider!!.isRunning()) { + startLocationUpdatesByType() + setShowingStatus(LocationShowingStatus.SEARCHING) + } + } else { + setShowingStatus(LocationShowingStatus.NO_PERMISSION) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) gridRecyclerView.setVisibility(View.INVISIBLE) @@ -256,6 +265,7 @@ } if (!stops.isEmpty()) { currentNearbyStops = stops + setShowingStatus(LocationShowingStatus.POSITION_FOUND) showStopsInViews(currentNearbyStops, lastPosition) } } @@ -280,18 +290,29 @@ Log.e(DEBUG_TAG, "Trying to show arrivals in Recycler but we're not attached") return@observe } + val context = requireContext() if (firstLocForArrivals) { - arrivalsStopAdapter = ArrivalsStopAdapter(stoprouteList, mListener, context, lastPosition!!) - gridRecyclerView.setAdapter(arrivalsStopAdapter) - firstLocForArrivals = false + mListener?.let{ + lastPosition?.let{ pos -> + arrivalsStopAdapter = ArrivalsStopAdapter(stoprouteList, it, context, pos) + gridRecyclerView.setAdapter(arrivalsStopAdapter) + firstLocForArrivals = false + } + } } else { - arrivalsStopAdapter!!.setRoutesPairListAndPosition(stoprouteList, lastPosition) + lastPosition?.let{ pos -> + arrivalsStopAdapter?.setRoutesPairListAndPosition(stoprouteList, pos) + } } //arrivalsStopAdapter.notifyDataSetChanged(); + setShowingStatus(LocationShowingStatus.POSITION_FOUND) showRecyclerHidingLoadMessage() //if (mListener != null) mListener!!.readyGUIfor(FragmentKind.NEARBY_ARRIVALS) } + + //added + checkPermissionLocationStart() } @@ -343,28 +364,32 @@ private fun setShowingStatus(newStatus: LocationShowingStatus) { var newStatus = newStatus - if (BuildConfig.DEBUG) Log.d(DEBUG_TAG, "Asked to set showing status : $newStatus") if (newStatus == showingStatus) { return } + if (BuildConfig.DEBUG) Log.d(DEBUG_TAG, "Changing showing status from $showingStatus to $newStatus") + if (!isLocationEnabled && newStatus != LocationShowingStatus.NO_PERMISSION) { Log.d(DEBUG_TAG, "asked to show status: $newStatus but the position is disabled") newStatus = LocationShowingStatus.DISABLED } when (newStatus) { - LocationShowingStatus.FIRST_FIX -> { + LocationShowingStatus.POSITION_FOUND -> { circlingProgressBar!!.setVisibility(View.GONE) loadingTextView!!.setVisibility(View.GONE) gridRecyclerView.setVisibility(View.VISIBLE) messageTextView!!.setVisibility(View.GONE) + enableLocationButton.setVisibility(View.GONE) + } LocationShowingStatus.NO_PERMISSION -> { - circlingProgressBar!!.setVisibility(View.GONE) - loadingTextView!!.setVisibility(View.GONE) - messageTextView!!.setText(R.string.enable_position_message_nearby) - messageTextView!!.setVisibility(View.VISIBLE) + circlingProgressBar?.setVisibility(View.GONE) + loadingTextView?.setVisibility(View.GONE) + messageTextView?.setText(R.string.enable_position_message_nearby) + messageTextView?.setVisibility(View.VISIBLE) + enableLocationButton.setVisibility(View.VISIBLE) } LocationShowingStatus.DISABLED -> { @@ -374,6 +399,7 @@ //} messageTextView!!.setText(R.string.enable_location_message) messageTextView!!.setVisibility(View.VISIBLE) + enableLocationButton.setVisibility(View.GONE) } LocationShowingStatus.SEARCHING -> { @@ -381,6 +407,7 @@ loadingTextView!!.setVisibility(View.VISIBLE) gridRecyclerView.setVisibility(View.GONE) messageTextView!!.setVisibility(View.GONE) + enableLocationButton.setVisibility(View.GONE) } } showingStatus = newStatus @@ -456,9 +483,7 @@ "Max distance for stops: $stopsMaxDistance, Min number of stops: $stopsMinNumber" ) - if (!locationProvider!!.isRunning()) { - startLocationUpdatesByType() - } + //checkPermissionLocationStart() } @@ -470,6 +495,12 @@ //if (arrivalsManager != null) arrivalsManager!!.cancelAllRequests() } + override fun onStart() { + super.onStart() + if(BuildConfig.DEBUG) Log.d(DEBUG_TAG, "onStart called") + //checkPermissionLocationStart() + } + /** * Display the stops, or run new set of requests for arrivals */ @@ -542,7 +573,9 @@ switchButton!!.text = getString(R.string.show_arrivals) titleTextView!!.text = getString(R.string.nearby_stops_message) - dataAdapter?.let{ gridRecyclerView.adapter = it} + dataAdapter?.let{ gridRecyclerView.adapter = it + + } mListener?.readyGUIfor(FragmentKind.NEARBY_STOPS) @@ -552,7 +585,7 @@ val arrivalsSorted = viewModel.arrivalsDecoupled.value arrivalsSorted?.let{ lastPosition?.let{pos -> - arrivalsStopAdapter = ArrivalsStopAdapter(it,mListener,requireContext(), pos ) + arrivalsStopAdapter = ArrivalsStopAdapter(it,mListener!!,requireContext(), pos ) } } arrivalsStopAdapter?.let{ diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/ScreenBaseFragment.java @@ -44,6 +44,7 @@ import it.reyboz.bustorino.BuildConfig; import java.util.Map; +import java.util.function.Consumer; import static android.content.Context.MODE_PRIVATE; @@ -122,7 +123,7 @@ editor.putBoolean(optionName, value); editor.apply(); } - public ActivityResultLauncher getPositionRequestLauncher(LocationRequestListener listener){ + public ActivityResultLauncher getPositionRequestLauncher(Consumer listener){ return registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<>() { @Override public void onActivityResult(Map result) { @@ -138,7 +139,7 @@ coarseGranted +", fineGranted "+fineGranted); } - listener.onPermissionResult(coarseGranted || fineGranted); + listener.accept(coarseGranted && fineGranted); } }); } diff --git a/app/src/main/java/it/reyboz/bustorino/fragments/SettingsFragment.java b/app/src/main/java/it/reyboz/bustorino/fragments/SettingsFragment.java --- a/app/src/main/java/it/reyboz/bustorino/fragments/SettingsFragment.java +++ b/app/src/main/java/it/reyboz/bustorino/fragments/SettingsFragment.java @@ -29,6 +29,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatDelegate; import androidx.lifecycle.Observer; import androidx.preference.*; import androidx.work.OneTimeWorkRequest; @@ -38,6 +39,7 @@ import it.reyboz.bustorino.R; import it.reyboz.bustorino.data.DBUpdateWorker; import it.reyboz.bustorino.data.GtfsMaintenanceWorker; +import it.reyboz.bustorino.data.PreferencesHolder; import org.jetbrains.annotations.NotNull; import java.lang.ref.WeakReference; @@ -70,8 +72,10 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { //getPreferenceManager().setSharedPreferencesName(getString(R.string.mainSharedPreferences)); convertStringPrefToIntIfNeeded(getString(R.string.pref_key_num_recents), getContext()); - - getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + var sharedPrefs = getPreferenceManager().getSharedPreferences(); + if(sharedPrefs!=null) { + sharedPrefs.registerOnSharedPreferenceChangeListener(this); + } setPreferencesFromResource(R.xml.preferences,rootKey); /*EditTextPreference editPref = findPreference(getString(R.string.pref_key_num_recents)); editPref.setOnBindEditTextListener(editText -> { @@ -160,6 +164,17 @@ ListPreference listPref = (ListPreference) pref; pref.setSummary(listPref.getEntry()); } + + if(key.equals(PreferencesHolder.PREF_THEME_DAY_NIGHT)){ + String value = sharedPreferences.getString(key, ""); + Log.d(TAG, "New value is: "+ value); + if(!value.isEmpty()){ + var state = PreferencesHolder.getAppThemeDayNight(value); + AppCompatDelegate.setDefaultNightMode(state); + + } + + } /* THIS CODE STAYS COMMENTED FOR FUTURE REFERENCES if (key.equals(getString(R.string.pref_key_num_recents))){ diff --git a/app/src/main/java/it/reyboz/bustorino/map/MapLibreUtils.kt b/app/src/main/java/it/reyboz/bustorino/map/MapLibreUtils.kt --- a/app/src/main/java/it/reyboz/bustorino/map/MapLibreUtils.kt +++ b/app/src/main/java/it/reyboz/bustorino/map/MapLibreUtils.kt @@ -18,13 +18,21 @@ companion object{ //const val STYLE_BRIGHT_DEFAULT_JSON = "map_style_good_noshops.json" const val STYLE_VERSATILES_COLORFUL_JSON = "versatiles_colorful_light.json" + const val STYLE_VERSATILES_ECLIPSE_JSON = "versatiles_eclipse_modif.json" //"versatiles_eclipse.json" const val STYLE_OSM_RASTER="openstreetmap_raster.json" - const val STYLE_VECTOR = STYLE_VERSATILES_COLORFUL_JSON private const val DEBUG_TAG ="BusTO-MapLibreUtils" @JvmStatic - fun getDefaultStyleJson() = STYLE_VECTOR + fun isStyleVector(styleFile: String): Boolean { + return when(styleFile){ + //be careful to include all the style cases + STYLE_OSM_RASTER -> false + STYLE_VERSATILES_COLORFUL_JSON -> true + STYLE_VERSATILES_ECLIPSE_JSON -> true + else -> true + } + } @JvmStatic fun shortestRotation(from: Float, to: Float): Float { diff --git a/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java b/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java --- a/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java +++ b/app/src/main/java/it/reyboz/bustorino/middleware/GeneralActivity.java @@ -231,44 +231,4 @@ return WindowInsetsCompat.CONSUMED; }; - /** - * Adjust setting to match the default ones - */ - protected void checkApplyDefaultSettingsValues(){ - SharedPreferences mainSharedPref = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = mainSharedPref.edit(); - //Main fragment to show - String screen = mainSharedPref.getString(SettingsFragment.PREF_KEY_STARTUP_SCREEN, ""); - boolean edit = false; - if (screen.isEmpty()){ - editor.putString(SettingsFragment.PREF_KEY_STARTUP_SCREEN, "arrivals"); - edit=true; - } - //Fetchers - final Set setSelected = mainSharedPref.getStringSet(SettingsFragment.KEY_ARRIVALS_FETCHERS_USE, new HashSet<>()); - if (setSelected.isEmpty()){ - String[] defaultVals = getResources().getStringArray(R.array.arrivals_sources_values_default); - editor.putStringSet(SettingsFragment.KEY_ARRIVALS_FETCHERS_USE, utils.convertArrayToSet(defaultVals)); - edit=true; - } - //Live bus positions - final String keySourcePositions=getString(R.string.pref_positions_source); - final String positionsSource = mainSharedPref.getString(keySourcePositions, ""); - if(positionsSource.isEmpty()){ - String[] defaultVals = getResources().getStringArray(R.array.positions_source_values); - editor.putString(keySourcePositions, defaultVals[0]); - edit=true; - } - //Map style - final String mapStylePref = mainSharedPref.getString(SettingsFragment.LIBREMAP_STYLE_PREF_KEY, ""); - if(mapStylePref.isEmpty()){ - final String[] defaultVals = getResources().getStringArray(R.array.map_style_pref_values); - editor.putString(SettingsFragment.LIBREMAP_STYLE_PREF_KEY, defaultVals[0]); - edit=true; - } - if (edit){ - editor.commit(); - } - - } } diff --git a/app/src/main/res/drawable-hdpi/ic_center_map.png b/app/src/main/res/drawable-hdpi/ic_center_map.png deleted file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/bus_stop_new.xml b/app/src/main/res/drawable/bus_stop_new.xml --- a/app/src/main/res/drawable/bus_stop_new.xml +++ b/app/src/main/res/drawable/bus_stop_new.xml @@ -12,10 +12,10 @@ + android:fillColor="@color/white"/> diff --git a/app/src/main/res/drawable/bus_stop_new_highlight.xml b/app/src/main/res/drawable/bus_stop_new_highlight.xml --- a/app/src/main/res/drawable/bus_stop_new_highlight.xml +++ b/app/src/main/res/drawable/bus_stop_new_highlight.xml @@ -9,13 +9,14 @@ android:strokeWidth="0.0936408" android:fillColor="?colorAccent" android:strokeColor="#00000000"/> + + android:fillColor="@color/white"/> diff --git a/app/src/main/res/drawable/ic_bus.xml b/app/src/main/res/drawable/ic_bus.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_bus.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bus_electric_filled.xml b/app/src/main/res/drawable/ic_bus_electric_filled.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_bus_electric_filled.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_bus_electric_small.xml b/app/src/main/res/drawable/ic_bus_electric_small.xml deleted file mode 100644 --- a/app/src/main/res/drawable/ic_bus_electric_small.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_bus_material.xml b/app/src/main/res/drawable/ic_bus_material.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_bus_material.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bus_stilized.xml b/app/src/main/res/drawable/ic_bus_stilized.xml --- a/app/src/main/res/drawable/ic_bus_stilized.xml +++ b/app/src/main/res/drawable/ic_bus_stilized.xml @@ -4,6 +4,6 @@ android:viewportWidth="48" android:viewportHeight="48"> diff --git a/app/src/main/res/drawable/ic_subway_filled.xml b/app/src/main/res/drawable/ic_subway_filled.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_subway_filled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_tram_filled_24.xml b/app/src/main/res/drawable/ic_tram_filled_24.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_tram_filled_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_tram_material.xml b/app/src/main/res/drawable/ic_tram_material.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/drawable/ic_tram_material.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/magnifying_glass_larger.xml b/app/src/main/res/drawable/magnifying_glass_larger.xml --- a/app/src/main/res/drawable/magnifying_glass_larger.xml +++ b/app/src/main/res/drawable/magnifying_glass_larger.xml @@ -6,5 +6,5 @@ + android:fillColor="@color/white"/> diff --git a/app/src/main/res/drawable/map_bus_position_icon_sel.xml b/app/src/main/res/drawable/map_bus_position_icon_sel.xml --- a/app/src/main/res/drawable/map_bus_position_icon_sel.xml +++ b/app/src/main/res/drawable/map_bus_position_icon_sel.xml @@ -1,7 +1,7 @@ - diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -46,7 +46,7 @@ app:layout_constraintBottom_toTopOf="@id/openTutorialButton" android:autoLink="web" android:fontFamily="@font/nevermind_compact" - android:textColor="@color/grey_700" + android:textColor="@color/color_text_grey" /> @@ -17,7 +17,7 @@ android:textStyle="bold" android:textSize="18sp" android:fontFamily="@font/lato_bold" - android:textColor="@color/black_900" + android:textColor="?android:textColorPrimary" app:layout_constraintHorizontal_bias="0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -39,7 +39,7 @@ android:layout_marginTop="5dp" android:layout_marginEnd="5dp" android:layout_marginStart="4dp" - android:textColor="@color/black" + android:textColor="?android:textColorPrimary" android:fontFamily="@font/lato_regular" android:textAppearance="@style/TextAppearance.AppCompat.Display3"/> @@ -59,7 +59,7 @@ app:cardElevation="1dp" app:strokeWidth="1dp" android:layout_marginBottom="16dp" - android:backgroundTint="@color/grey_200" + android:backgroundTint="@color/message_background_on_black" app:strokeColor="@color/grey_050"> diff --git a/app/src/main/res/layout/fragment_intro.xml b/app/src/main/res/layout/fragment_intro.xml --- a/app/src/main/res/layout/fragment_intro.xml +++ b/app/src/main/res/layout/fragment_intro.xml @@ -34,8 +34,8 @@ android:maxWidth="280dp" android:textSize="18sp" android:textAlignment="center" - android:textColor="@color/grey_900" - android:fontFamily="@font/pitagon_medium" + android:textColor="?android:textColorPrimary" + android:fontFamily="@font/pitagon_regular" app:layout_constraintBottom_toTopOf="@id/closeAllButton" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginBottom="5dp" diff --git a/app/src/main/res/layout/fragment_lines_detail.xml b/app/src/main/res/layout/fragment_lines_detail.xml --- a/app/src/main/res/layout/fragment_lines_detail.xml +++ b/app/src/main/res/layout/fragment_lines_detail.xml @@ -69,7 +69,7 @@ app:layout_constraintTop_toBottomOf="@id/switchImageButton" app:layout_constraintEnd_toStartOf="@id/lineInfoWarningButton" app:layout_constraintStart_toStartOf="parent" - android:textColor="@color/grey_700" + android:textColor="@color/black_icon_text" android:fontFamily="@font/lato_regular" android:textSize="18sp" android:gravity="center" diff --git a/app/src/main/res/layout/fragment_lines_grid.xml b/app/src/main/res/layout/fragment_lines_grid.xml --- a/app/src/main/res/layout/fragment_lines_grid.xml +++ b/app/src/main/res/layout/fragment_lines_grid.xml @@ -43,6 +43,8 @@ android:layout_margin="4dp" android:layout_marginStart="16dp" android:rotation="90" + app:tint="?android:textColorPrimary" + /> - + + + diff --git a/app/src/main/res/layout/include_map_bottom_sheet.xml b/app/src/main/res/layout/include_map_bottom_sheet.xml --- a/app/src/main/res/layout/include_map_bottom_sheet.xml +++ b/app/src/main/res/layout/include_map_bottom_sheet.xml @@ -32,6 +32,7 @@ android:fontFamily="@font/lato_regular" /> + - - - + + + + + + + + @@ -145,6 +158,7 @@ android:layout_width="30sp" android:layout_height="30sp" android:layout_gravity="center" + app:tint="@android:color/white" app:srcCompat="@drawable/navigation_right" /> diff --git a/app/src/main/res/layout/arrivals_nearby_card.xml b/app/src/main/res/layout/item_arrivals_nearby_card.xml rename from app/src/main/res/layout/arrivals_nearby_card.xml rename to app/src/main/res/layout/item_arrivals_nearby_card.xml --- a/app/src/main/res/layout/arrivals_nearby_card.xml +++ b/app/src/main/res/layout/item_arrivals_nearby_card.xml @@ -1,6 +1,6 @@ - - + android:text="10" + android:textSize="22sp" + android:textColor="@color/orange_700_display" + android:layout_marginStart="8dp" + android:gravity="center" + android:textStyle="normal" + android:layout_marginTop="10dp" + android:layout_alignParentTop="true" + android:layout_alignParentStart="true" + android:layout_alignBottom="@id/lineDirectionTextView" + + /> - + android:layout_margin="8dp" + android:layout_alignParentStart="true" + /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/item_card_button.xml b/app/src/main/res/layout/item_card_button.xml --- a/app/src/main/res/layout/item_card_button.xml +++ b/app/src/main/res/layout/item_card_button.xml @@ -43,7 +43,7 @@ android:contentDescription="@null" app:tint="@color/grey_100" app:layout_constraintVertical_bias="1.0" - android:layout_marginTop="12dp" + android:layout_marginTop="10dp" /> diff --git a/app/src/main/res/layout/stop_card.xml b/app/src/main/res/layout/item_stop_nearby_card.xml rename from app/src/main/res/layout/stop_card.xml rename to app/src/main/res/layout/item_stop_nearby_card.xml --- a/app/src/main/res/layout/stop_card.xml +++ b/app/src/main/res/layout/item_stop_nearby_card.xml @@ -26,8 +26,11 @@ android:id="@+id/stop_nameText" style="@style/TextAppearance.AppCompat.Medium" android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" android:paddingLeft="6dp" - android:textColor="@color/primary_material_dark" android:layout_marginBottom="6dp" + android:layout_alignParentStart="true" + android:paddingLeft="6dp" + android:textSize="20sp" + android:textColor="?android:textColorPrimary" + android:layout_marginBottom="6dp" android:layout_marginTop="6dp" android:layout_marginLeft="6dp" android:layout_marginStart="6dp" android:layout_marginRight="6dp" android:layout_marginEnd="6dp"/> @@ -101,7 +105,7 @@ \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -257,4 +257,11 @@ Per usare questa funzionalità, l\'app necessita dell\'accesso alla posizione, che ora può essere dato solo dalle impostazioni di sistema. Apri le impostazioni Premi ancora \"indietro\" per uscire dall\'app + + + Chiaro + Scuro + Segui il sistema + + Imposta tema scuro o chiaro diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,31 @@ + + + #ababab + + #0b6fc1 + #bfbfbf + + #1a4db2 + + + + #3770e2 + + #c34322 + + #861313 + + #3657b0 + #2270c3F + @color/grey_900 + @color/grey_900 + + @color/orange_700_night + #666666 + + + + @color/grey_400 + + \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -13,6 +13,12 @@ #2060dd #8A4247 #FFF3E0 + #fff5e5 + + #e08700 + + + #d16900 #2378e8 #0079f5 @@ -25,7 +31,10 @@ #228b22 #0ABA34 - #009688 + #009688 + #00a38d + #009480 + #00a887 #4DB6AC #80cbc4 #008175 @@ -39,6 +48,8 @@ #353535 #303030 + #f2f2f2 + #DE0908 @@ -59,14 +70,20 @@ @color/red_dark @color/blue_extra + #3089e8 #FF039BE5 #FF01579B #FF40C4FF #FF00B0FF #66000000 + #555 + #cccccc - + @color/grey_500 #00000000 + @color/orange_700 + @color/grey_200 + @color/grey_050 @color/orange_500 @color/blue_extraurbano @@ -74,4 +91,6 @@ @color/orange_icons_10light @color/grey_400 @color/orange_750_l45 + @color/grey_700 + @color/blue_700 \ No newline at end of file diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -40,4 +40,17 @@ osm_legacy + + + day + night + system + + + + @string/day_night_theme_set_light + @string/day_night_theme_set_dark + @string/day_night_theme_keep_system + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -156,7 +156,7 @@ Near me Nearby stops - Nearby connections + Nearby arrivals App version The number of stops to show in the recent stops is invalid Invalid value, put a valid number @@ -299,6 +299,14 @@ @string/nav_map_text @string/lines + + + Light + Dark + Change it with the system + + + Set dark or light theme Source of real time positions for buses and trams MaTO (updated more frequently, might have errors) GTFS RT (less frequently updated, more accurate) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -71,7 +71,23 @@ + - -