diff --git a/apps/backend/src/schema/schema.ts b/apps/backend/src/schema/schema.ts index a74ce23..9043923 100644 --- a/apps/backend/src/schema/schema.ts +++ b/apps/backend/src/schema/schema.ts @@ -4,7 +4,6 @@ import type { OpeningHoursNote, PriceSighting, } from '@t09-project-2/db' -import type { OpeningHours, PriceSighting } from '@t09-project-2/db' import { GraphQLError } from 'graphql' import { builder } from '../builder.js' diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 1ba874c..952b795 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -15,6 +15,7 @@ "typecheck": "tsc --noEmit" }, "dependencies": { + "@maplibre/maplibre-gl-leaflet": "^0.1.4", "@tailwindcss/vite": "^4.3.3", "@tanstack/react-devtools": "latest", "@tanstack/react-query": "latest", @@ -24,6 +25,7 @@ "@tanstack/react-router-ssr-query": "latest", "@tanstack/react-start": "latest", "leaflet": "^1.9.4", + "maplibre-gl": "^5.24.0", "nitro": "3.0.260610-beta", "react": "^19.3.0", "react-dom": "^19.3.0", diff --git a/apps/frontend/public/map-styles/osm-carto.json b/apps/frontend/public/map-styles/osm-carto.json new file mode 100644 index 0000000..77dbf91 --- /dev/null +++ b/apps/frontend/public/map-styles/osm-carto.json @@ -0,0 +1,6242 @@ +{ + "version": 8, + "name": "G-Spotter OSM Carto", + "metadata": { + "maputnik:renderer": "mlgljs" + }, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://tiles.openfreemap.org/planet", + "attribution": "© OpenFreeMap © OpenMapTiles Data from OpenStreetMap" + } + }, + "glyphs": "https://tiles.openfreemap.org/fonts/{fontstack}/{range}.pbf", + "sprite": "https://tiles.openfreemap.org/sprites/ofm_f384/ofm", + "layers": [ + { + "id": "Background", + "type": "background", + "layout": { + "visibility": "visible" + }, + "paint": { + "background-color": "hsl(40, 26%, 93%)" + } + }, + { + "id": "Residential", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 6, + "filter": [ + "all", + ["in", "class", "residential", "suburbs", "neighbourhood"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": { + "stops": [ + [7, "hsl(0, 0%, 82%)"], + [11, "hsl(0, 0%, 87%)"], + [12, "hsl(0, 2%, 88%)"] + ] + } + } + }, + { + "id": "Cemetery", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + ["==", "class", "cemetery"], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(129, 24%, 73%)", + "fill-opacity": 1 + } + }, + { + "id": "Military", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + ["==", "class", "military"], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(0, 75%, 95%)", + "fill-opacity": 1 + } + }, + { + "id": "Railway", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": ["all", ["==", "class", "railway"], ["==", "$type", "Polygon"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(311, 29%, 89%)", + "fill-opacity": 1 + } + }, + { + "id": "Garage", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": ["all", ["==", "class", "garages"], ["==", "$type", "Polygon"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(53, 21%, 84%)", + "fill-opacity": 1 + } + }, + { + "id": "Dam", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": ["all", ["==", "class", "dam"], ["==", "$type", "Polygon"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(0, 0%, 68%)", + "fill-opacity": 1 + } + }, + { + "id": "Quarry", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": ["all", ["==", "class", "quarry"], ["==", "$type", "Polygon"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(0, 0%, 83%)", + "fill-opacity": 1 + } + }, + { + "id": "Industrial", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + ["==", "class", "industrial"], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(311, 29%, 89%)", + "fill-opacity": 1, + "fill-outline-color": "hsl(309, 14%, 74%)" + } + }, + { + "id": "Retail", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": ["all", ["==", "class", "retail"], ["==", "$type", "Polygon"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(7, 100%, 91%)", + "fill-opacity": 1 + } + }, + { + "id": "Commercial", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + ["==", "class", "commercial"], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(2, 49%, 90%)", + "fill-opacity": 1, + "fill-outline-color": "hsl(2, 49%, 90%)" + } + }, + { + "id": "Education and Health", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + [ + "in", + "class", + "school", + "university", + "kindergarten", + "college", + "hospital" + ], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(60, 100%, 95%)", + "fill-opacity": 1 + } + }, + { + "id": "Wetland (medium scale)", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "maxzoom": 13, + "filter": ["all", ["==", "class", "wetland"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsl(102, 36%, 72%)", + "fill-opacity": { + "stops": [ + [7, 0.5], + [10, 1] + ] + } + } + }, + { + "id": "Sand (medium scale)", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "maxzoom": 13, + "filter": ["all", ["==", "class", "sand"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsl(45, 70%, 87%)", + "fill-opacity": { + "stops": [ + [7, 0.5], + [10, 1] + ] + } + } + }, + { + "id": "Grass (medium scale)", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "maxzoom": 13, + "filter": ["all", ["==", "class", "grass"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsl(91, 60%, 81%)", + "fill-opacity": { + "stops": [ + [7, 0.5], + [10, 1] + ] + } + } + }, + { + "id": "Rock (medium scale)", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "maxzoom": 13, + "filter": ["all", ["==", "class", "rock"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsl(30, 35%, 90%)", + "fill-opacity": { + "stops": [ + [7, 0.5], + [10, 1] + ] + } + } + }, + { + "id": "Wood (medium scale)", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "maxzoom": 13, + "filter": ["all", ["==", "class", "wood"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsl(102, 36%, 72%)", + "fill-opacity": { + "stops": [ + [7, 0.5], + [10, 1] + ] + } + } + }, + { + "id": "Farmland (medium scale)", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "maxzoom": 13, + "filter": ["all", ["==", "class", "farmland"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": false, + "fill-color": "hsl(64, 47%, 89%)", + "fill-opacity": { + "stops": [ + [7, 0.5], + [10, 1] + ] + } + } + }, + { + "id": "Marsh", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["in", "subclass", "marsh"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(60, 100%, 50%)" + } + }, + { + "id": "Park", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 13, + "filter": ["all", ["==", "subclass", "park"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(125, 83%, 88%)" + } + }, + { + "id": "Stadium", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + ["in", "class", "stadium", "playground"], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(126, 100%, 92%)", + "fill-opacity": 1 + } + }, + { + "id": "Pitch", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 7, + "filter": [ + "all", + ["in", "class", "pitch", "track"], + ["==", "$type", "Polygon"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(157, 47%, 77%)", + "fill-opacity": 1 + } + }, + { + "id": "Garden", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "garden"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(91, 60%, 81%)" + } + }, + { + "id": "Wood", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "wood"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(102, 36%, 72%)" + } + }, + { + "id": "Tidalflat", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "tidalflat"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(28, 19%, 84%)" + } + }, + { + "id": "Wetland and swamp", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["in", "subclass", "swamp", "wetland"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(102, 36%, 72%)" + } + }, + { + "id": "Scree", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "scree"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(30, 35%, 90%)" + } + }, + { + "id": "Sand", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "sand"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(45, 70%, 87%)" + } + }, + { + "id": "Recreation ground", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "recreation_ground"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(126, 100%, 92%)" + } + }, + { + "id": "Orchard and vineyard", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": [ + "all", + ["in", "subclass", "orchard", "plant_nursery", "vineyard"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(109, 48%, 76%)" + } + }, + { + "id": "Meadow", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": [ + "all", + ["in", "subclass", "meadow", "reedbed", "saltmarsh", "village_green"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(91, 60%, 81%)" + } + }, + { + "id": "Mangrove", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "mangrove"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(80, 35%, 76%)" + } + }, + { + "id": "Heath", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["in", "subclass", "heath"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(63, 43%, 74%)" + } + }, + { + "id": "Forest", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "forest"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(102, 36%, 72%)" + } + }, + { + "id": "Farmland", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "farmland"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(64, 47%, 89%)" + } + }, + { + "id": "Farm", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "farm"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(35, 75%, 85%)" + } + }, + { + "id": "Scrub", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "scrub"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(80, 35%, 76%)" + } + }, + { + "id": "Dune", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "dune"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(45, 70%, 87%)" + } + }, + { + "id": "Beach", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "beach"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(48, 100%, 86%)" + } + }, + { + "id": "Bare rock", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "bare_rock"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(30, 35%, 90%)" + } + }, + { + "id": "Allotments", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": ["all", ["==", "subclass", "allotments"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(102, 36%, 82%)" + } + }, + { + "id": "Grass", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 9, + "filter": [ + "all", + ["in", "subclass", "grass", "grassland", "golf_course"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(91, 60%, 81%)" + } + }, + { + "id": "Landcover outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 15, + "filter": [ + "all", + [ + "in", + "subclass", + "allotments", + "farm", + "farmland", + "recreation_ground" + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "match", + ["get", "subclass"], + "allotments", + "hsl(102, 21%, 72%)", + "farm", + "hsl(35, 43%, 68%)", + "farmland", + "hsl(64, 20%, 74%)", + "recreation_ground", + "hsl(126, 26%, 32%)", + "hsl(0, 0%, 0%)" + ], + "line-opacity": 1, + "line-width": [ + "match", + ["get", "subclass"], + "recreation_ground", + 0.3, + 0.5 + ] + } + }, + { + "id": "Glacier", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 5, + "filter": ["all", ["in", "class", "ice"]], + "paint": { + "fill-antialias": false, + "fill-color": "hsl(180, 28%, 90%)" + } + }, + { + "id": "Glacier outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 5, + "filter": ["all", ["in", "class", "ice"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(210, 100%, 80%)", + "line-dasharray": { + "stops": [ + [5, [1, 0]], + [10, [4, 2]] + ] + }, + "line-width": { + "stops": [ + [5, 1], + [10, 1.5] + ] + } + } + }, + { + "id": "River tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 14, + "filter": ["all", ["==", "brunnel", "tunnel"]], + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(210, 73%, 78%)", + "line-dasharray": [2, 4], + "line-width": { + "base": 1.3, + "stops": [ + [13, 0.5], + [20, 6] + ] + } + } + }, + { + "id": "River", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["!=", "intermittent", 1] + ], + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(210, 73%, 78%)", + "line-width": { + "base": 1.2, + "stops": [ + [11, 0.5], + [20, 20] + ] + } + } + }, + { + "id": "River intermittent", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 1] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(210, 73%, 78%)", + "line-dasharray": [3, 2], + "line-width": { + "base": 1.2, + "stops": [ + [11, 0.5], + [20, 20] + ] + } + } + }, + { + "id": "Other waterway", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["!=", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["!=", "intermittent", 1] + ], + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(210, 73%, 78%)", + "line-width": { + "base": 1.3, + "stops": [ + [13, 0.5], + [20, 6] + ] + } + } + }, + { + "id": "Other waterway intermittent", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["!=", "class", "river"], + ["!=", "brunnel", "tunnel"], + ["==", "intermittent", 1] + ], + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(210, 73%, 78%)", + "line-dasharray": [4, 3], + "line-width": { + "base": 1.3, + "stops": [ + [13, 0.5], + [20, 6] + ] + } + } + }, + { + "id": "Water intermittent", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "filter": ["all", ["==", "intermittent", 1]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(205, 91%, 83%)", + "fill-opacity": 0.85 + } + }, + { + "id": "Water", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "filter": ["all", ["!=", "intermittent", 1], ["!=", "brunnel", "tunnel"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(194, 45%, 77%)" + } + }, + { + "id": "National parks", + "type": "line", + "source": "openmaptiles", + "source-layer": "park", + "minzoom": 8, + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(103, 36%, 66%)", + "line-offset": 1, + "line-opacity": 0.8, + "line-width": { + "base": 1, + "stops": [ + [8, 1.2], + [9, 1.5], + [10, 3.6], + [24, 3.6] + ] + } + } + }, + { + "id": "National park outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "park", + "minzoom": 14, + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(107, 34%, 45%)", + "line-width": 1.5 + } + }, + { + "id": "Landuse outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 13, + "filter": [ + "all", + [ + "in", + "class", + "railway", + "military", + "residential", + "commercial", + "industrial", + "retail", + "school", + "university", + "kindergarten", + "college", + "hospital", + "stadium", + "pitch", + "playground", + "track", + "theme_park", + "zoo", + "dam" + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": [ + "match", + ["get", "class"], + "railway", + "hsl(309, 14%, 74%)", + "military", + "hsl(0, 100%, 67%)", + "residential", + "hsl(0, 0%, 73%)", + "commercial", + "hsl(2, 49%, 90%)", + "industrial", + "hsl(309, 14%, 74%)", + "retail", + "hsl(6, 47%, 72%)", + "school", + "hsl(60, 13%, 60%)", + "university", + "hsl(60, 13%, 60%)", + "kindergarten", + "hsl(60, 13%, 60%)", + "college", + "hsl(60, 13%, 60%)", + "hospital", + "hsl(60, 13%, 60%)", + "stadium", + "hsl(126, 19%, 57%)", + "pitch", + "hsl(156, 22%, 57%)", + "playground", + "hsl(126, 26%, 32%)", + "track", + "hsl(155, 22%, 57%)", + "theme_park", + "hsl(330, 100%, 20%)", + "zoo", + "hsl(330, 100%, 20%)", + "dam", + "hsl(0, 0%, 27%)", + "hsl(0, 0%, 0%)" + ], + "line-offset": ["match", ["get", "class"], "military", 1, 0], + "line-opacity": ["match", ["get", "class"], "military", 0.24, 1], + "line-width": [ + "match", + ["get", "class"], + "railway", + 0.7, + "military", + 2, + "residential", + 0.5, + "commercial", + 0.5, + "industrial", + 0.5, + "retail", + 0.5, + "school", + 0.3, + "university", + 0.3, + "kindergarten", + 0.3, + "college", + 0.3, + "hospital", + 0.3, + "stadium", + 0.3, + "pitch", + 0.5, + "playground", + 0.3, + "track", + 0.5, + "theme_park", + 1, + "zoo", + 1, + "dam", + 2, + 1 + ] + } + }, + { + "id": "Theme park", + "type": "line", + "source": "openmaptiles", + "source-layer": "landuse", + "minzoom": 13, + "filter": ["all", ["in", "class", "theme_park", "zoo"]], + "layout": { + "line-cap": "square", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(330, 100%, 20%)", + "line-offset": 2, + "line-opacity": { + "stops": [ + [9, 0.1], + [12, 0.3] + ] + }, + "line-width": { + "stops": [ + [9, 3.5], + [14, 5.5] + ] + } + } + }, + { + "id": "Building", + "type": "fill", + "source": "openmaptiles", + "source-layer": "building", + "minzoom": 13, + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": { + "stops": [ + [13, "hsl(24, 19%, 84%)"], + [16, "hsl(26, 17%, 82%)"] + ] + }, + "fill-outline-color": { + "base": 1, + "stops": [ + [13, "hsl(26, 7%, 57%)"], + [16, "hsl(26, 8%, 62%)"] + ] + } + } + }, + { + "id": "Highway link tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "class", "motorway_link"], + ["==", "ramp", 1], + ["==", "brunnel", "tunnel"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(345, 49%, 53%)"], + [12, "hsl(339, 72%, 51%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.5], + [12, 4], + [14, 7.8], + [16, 12], + [17, 13], + [18, 16], + [19, 17] + ] + } + } + }, + { + "id": "Service tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(36, 5%, 80%)", + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [ + [15, 1], + [16, 4], + [20, 11] + ] + } + } + }, + { + "id": "Link tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "ramp", "1"], + ["==", "brunnel", "tunnel"], + [">", "layer", 0] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(28, 72%, 69%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [12, 1], + [13, 3], + [14, 4], + [20, 15] + ] + } + } + }, + { + "id": "Street tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "street", "street_limited"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(36, 5%, 80%)", + "line-opacity": { + "stops": [ + [12, 0], + [12.5, 1] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [12, 0.5], + [13, 1], + [14, 4], + [20, 15] + ] + } + } + }, + { + "id": "Tertiary tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "tertiary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 56%)", + "line-dasharray": [0.5, 0.25], + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 2.5], + [12, 5], + [13, 5], + [14, 9], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Secondary tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(67, 92%, 25%)", + "line-dasharray": [0.5, 0.25], + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 3.5], + [12, 5], + [13, 5], + [14, 9], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Trunk tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": ["all", ["==", "brunnel", "tunnel"], ["in", "class", "trunk"]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(13, 58%, 55%)"], + [12, "hsl(12, 62%, 48%)"] + ] + }, + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [ + [11, 3.5], + [12, 6], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Trunk tunnel under construction outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "trunk_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 0], + "line-width": { + "base": 1.2, + "stops": [ + [11, 3.5], + [12, 6], + [15, 10], + [16, 18], + [17, 21], + [18, 25] + ] + } + } + }, + { + "id": "Primary tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(40, 100%, 31%)"], + [10, "hsl(44, 100%, 31%)"] + ] + }, + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [ + [11, 3.5], + [12, 6], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Highway tunnel under construction outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway_construction"], + ["==", "brunnel", "tunnel"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(339, 72%, 51%)"], + [10, "hsl(345, 49%, 53%)"] + ] + }, + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1.75], + [18, 27] + ] + } + } + }, + { + "id": "Highway tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "brunnel", "tunnel"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(339, 72%, 51%)"], + [10, "hsl(345, 49%, 53%)"] + ] + }, + "line-dasharray": [0.5, 0.25], + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1.75], + [18, 27] + ] + } + } + }, + { + "id": "Path tunnel second outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "tunnel"], + ["==", "class", "path"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 20%)", + "line-dasharray": [1, 0.5], + "line-width": { + "base": 1.2, + "stops": [ + [13, 3.7], + [14, 4], + [15, 4.3], + [17, 4.3], + [18, 4.6] + ] + } + } + }, + { + "id": "Path tunnel outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "tunnel"], + ["==", "class", "path"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 0], + "line-width": { + "base": 1.2, + "stops": [ + [13, 2.7], + [14, 3], + [15, 3.3], + [17, 3.3], + [18, 3.6] + ] + } + } + }, + { + "id": "Cycleway path tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "tunnel"], + ["in", "class", "path"], + ["any", ["==", "subclass", "cycleway"], ["==", "bicycle", "designated"]] + ], + "paint": { + "line-color": "hsl(240, 100%, 50%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.8], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Bridleway path tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "tunnel"], + ["in", "class", "path"], + ["any", ["==", "subclass", "bridleway"], ["==", "horse", "designated"]], + ["!=", "bicycle", "designated"] + ], + "paint": { + "line-color": "hsl(120, 100%, 25%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.8], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Footway path tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "tunnel"], + ["in", "class", "path"], + ["in", "subclass", "footway", "path"], + ["!=", "bicycle", "designated"], + ["!=", "horse", "designated"] + ], + "paint": { + "line-color": "hsl(6, 93%, 71%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.8], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Highway link tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "ramp", 1], + ["==", "brunnel", "tunnel"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(349, 65%, 84%)", + "line-dasharray": [0.5, 0.25], + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [8, 0.7], + [11, 0.9], + [12, 3], + [14, 6.6], + [16, 10.4], + [17, 11.4], + [18, 14.4], + [19, 15.4] + ] + } + } + }, + { + "id": "Service tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 95%)", + "line-width": { + "base": 1.2, + "stops": [ + [15, 0.8], + [16, 1.9], + [17, 3.1], + [18, 3.9], + [19, 6.9] + ] + } + } + }, + { + "id": "Service tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "service_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [15, 0.8], + [16, 1.9], + [17, 3.1], + [18, 3.9], + [19, 6.9] + ] + } + } + }, + { + "id": "Link tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "ramp", "1"], + ["==", "brunnel", "tunnel"], + [">", "layer", 0] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(48, 100%, 89%)", + "line-width": { + "base": 1.2, + "stops": [ + [12.5, 0], + [13, 1.5], + [14, 2.5], + [20, 11.5] + ] + } + } + }, + { + "id": "Minor tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["in", "class", "minor"]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [13.5, 0], + [14, 2.5], + [20, 11.5] + ] + } + } + }, + { + "id": "Minor tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "minor_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [2, 2], + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [13.5, 0], + [14, 2.5], + [20, 11.5] + ] + } + } + }, + { + "id": "Tertiary tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "tertiary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.9], + [12, 3], + [13, 3.9], + [14, 7.8], + [15, 8.8], + [16, 16.4], + [17, 19.4], + [18, 25.4] + ] + } + } + }, + { + "id": "Tertiary tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "tertiary_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.9], + [12, 3], + [13, 3.9], + [14, 7.8], + [15, 8.8], + [16, 16.4], + [17, 19.4], + [18, 25.4] + ] + } + } + }, + { + "id": "Secondary tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(63, 86%, 92%)", + "line-width": { + "base": 1.2, + "stops": [ + [8, 1], + [9, 1.1], + [10, 1.1], + [11, 2.9], + [12, 4.3], + [12, 4.3], + [14, 7.6], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Secondary tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "secondary_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(63, 86%, 92%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [8, 1], + [9, 1.1], + [10, 1.1], + [11, 2.9], + [12, 4.3], + [12, 4.3], + [14, 7.6], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Primary tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(34, 95%, 92%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0.4], + [6, 0.6], + [7, 1], + [8, 1.4], + [9, 1.9], + [10, 1.9], + [11, 4.5], + [12, 5], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Primary tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "primary_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(34, 95%, 92%)", + "line-dasharray": [2, 2], + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0.4], + [6, 0.6], + [7, 1], + [8, 1.4], + [9, 1.9], + [10, 1.9], + [11, 4.5], + [12, 5], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Trunk tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["in", "class", "trunk"]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [5, "hsl(14, 86%, 72%)"], + [11, "hsl(14, 89%, 89%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0.4], + [6, 0.6], + [7, 1], + [8, 1.4], + [9, 1.9], + [10, 1.9], + [11, 4.5], + [12, 5], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Trunk tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "tunnel"], + ["in", "class", "trunk_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(14, 89%, 79%)", + "line-dasharray": [2, 2], + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0.4], + [6, 0.6], + [7, 1], + [8, 1.4], + [9, 1.9], + [10, 1.9], + [11, 4.5], + [12, 5], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Highway tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "brunnel", "tunnel"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [5, "hsl(347, 71%, 67%)"], + [11, "hsl(349, 65%, 84%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1], + [18, 25] + ] + } + } + }, + { + "id": "Highway tunnel under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway_construction"], + ["==", "brunnel", "tunnel"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [5, "hsl(347, 71%, 67%)"], + [11, "hsl(349, 65%, 84%)"] + ] + }, + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1], + [18, 25] + ] + } + } + }, + { + "id": "Major rail tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "tunnel"], ["in", "class", "rail"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 65%)", + "line-width": { + "base": 1.4, + "stops": [ + [8, 0.8], + [15, 3], + [20, 5.4] + ] + } + } + }, + { + "id": "Major rail tunnel hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 9, + "filter": [ + "all", + ["in", "brunnel", "bridge", "tunnel"], + ["==", "class", "rail"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [8, "hsla(0, 0%, 45%, 0.44)"], + [10, "hsl(0, 0%, 78%)"] + ] + }, + "line-dasharray": [2, 2], + "line-width": { + "base": 1.4, + "stops": [ + [8, 0], + [15, 2], + [20, 4] + ] + } + } + }, + { + "id": "Pier", + "type": "fill", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "Polygon"], ["==", "class", "pier"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(42, 49%, 93%)" + } + }, + { + "id": "Pier road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "$type", "LineString"], ["==", "class", "pier"]], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(42, 49%, 93%)", + "line-width": { + "base": 1.2, + "stops": [ + [15, 1], + [17, 4] + ] + } + } + }, + { + "id": "Bridge area", + "type": "fill", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": ["all", ["==", "$type", "Polygon"], ["==", "class", "bridge"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-antialias": true, + "fill-color": "hsl(0, 0%, 72%)" + } + }, + { + "id": "Platform area", + "type": "fill", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["!has", "brunnel"], + ["==", "class", "path"], + ["==", "subclass", "platform"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(0, 0%, 73%)", + "fill-outline-color": "hsl(0, 0%, 50%)" + } + }, + { + "id": "Pedestrian area", + "type": "fill", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "Polygon"], + ["!has", "brunnel"], + ["!in", "class", "bridge", "pier"], + ["!in", "subclass", "platform"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(240, 19%, 89%)" + } + }, + { + "id": "Service road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "service"] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 73%)", + "line-width": { + "base": 1.2, + "stops": [ + [13, 2], + [15, 3.5], + [16, 7], + [17, 8.5], + [18, 11], + [19, 12] + ] + } + } + }, + { + "id": "Track road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "track"] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsla(0, 0%, 100%, 0.5)"], + [22, "hsla(0, 0%, 100%, 0.7)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [13, 2], + [17, 3.5], + [19, 4.5] + ] + } + } + }, + { + "id": "Tertiary road link outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "tertiary"], + ["==", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 56%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.6], + [12, 3], + [13, 4], + [14, 6.2], + [15, 8.2], + [16, 12.6], + [17, 15.6], + [18, 17.6] + ] + } + } + }, + { + "id": "Secondary road link outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary"], + ["==", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(67, 67%, 41%)"], + [12, "hsl(67, 92%, 25%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 2.6], + [12, 3.7], + [13, 4.2], + [14, 6.4], + [15, 8.4], + [16, 12], + [17, 14], + [18, 16.5] + ] + } + } + }, + { + "id": "Primary road link outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "ramp", 1], + ["in", "class", "primary"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(38, 67%, 46%)"], + [12, "hsl(40, 100%, 31%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.5], + [12, 4], + [13, 4], + [14, 7.8], + [16, 12], + [17, 13], + [18, 16] + ] + } + } + }, + { + "id": "Trunk road link outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "ramp", 1], + ["in", "class", "trunk"] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(13, 58%, 55%)"], + [12, "hsl(12, 62%, 48%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.5], + [12, 4], + [14, 7.8], + [16, 12], + [17, 13], + [18, 16] + ] + } + } + }, + { + "id": "Highway link outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"], + ["==", "ramp", 1] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(345, 49%, 53%)"], + [12, "hsl(339, 72%, 51%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.5], + [12, 4], + [14, 7.8], + [16, 12], + [17, 13], + [18, 16], + [19, 17] + ] + } + } + }, + { + "id": "Minor road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "minor"], + ["!=", "ramp", "1"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 73%)", + "line-opacity": { + "stops": [ + [10, 0], + [12.5, 1] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [13, 3], + [14, 5], + [15, 6], + [16, 12], + [17, 13], + [18, 17] + ] + } + } + }, + { + "id": "Tertiary road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "tertiary"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 56%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 2.5], + [12, 4], + [13, 5], + [14, 9], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Secondary road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(67, 67%, 41%)"], + [12, "hsl(67, 92%, 25%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [11, 3.5], + [12, 5], + [13, 5], + [14, 9], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Trunk road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "trunk"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(44, 100%, 31%)"], + [12, "hsl(12, 62%, 48%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [9, 6], + [11, 3.5], + [12, 5], + [13, 5], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Primary road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 9, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "primary"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [10.9, "hsla(46, 100%, 96%, 0.47)"], + [11, "hsl(44, 100%, 31%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [9, 6], + [11, 3.5], + [12, 5], + [13, 5], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Highway road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(345, 49%, 53%)"], + [12, "hsl(339, 72%, 51%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1.75], + [18, 27] + ] + } + } + }, + { + "id": "Pedestrian road outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "class", "path"], + ["==", "subclass", "pedestrian"], + ["!=", "brunel", "tunnel"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 60%)", + "line-width": { + "stops": [ + [13, 3], + [14, 5], + [15, 6], + [16, 12], + [17, 13], + [18, 17] + ] + } + } + }, + { + "id": "Pedestrian road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "class", "path"], + ["==", "subclass", "pedestrian"], + ["!=", "brunel", "tunnel"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(240, 19%, 89%)", + "line-width": { + "stops": [ + [13, 1.9], + [14, 3.8], + [15, 4.8], + [16, 10.4], + [17, 11.4], + [18, 15.4] + ] + } + } + }, + { + "id": "Steps path outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["==", "subclass", "steps"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 93%)", + "line-opacity": 0.6, + "line-width": { + "base": 1.2, + "stops": [ + [14, 4], + [15, 4.3], + [17, 4.3], + [18, 4.6] + ] + } + } + }, + { + "id": "Bridleway path outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["any", ["==", "subclass", "bridleway"], ["==", "horse", "designated"]], + ["!=", "bicycle", "designated"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 93%)", + "line-opacity": 0.6, + "line-width": { + "base": 1.2, + "stops": [ + [14, 3], + [15, 3.3], + [17, 3.3], + [18, 3.6] + ] + } + } + }, + { + "id": "Cycleway path outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["any", ["==", "subclass", "cycleway"], ["==", "bicycle", "designated"]] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 93%)", + "line-opacity": 0.6, + "line-width": { + "base": 1.2, + "stops": [ + [14, 3], + [15, 3.3], + [17, 3.3], + [18, 3.6] + ] + } + } + }, + { + "id": "Footway path outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["in", "subclass", "footway", "path"], + ["!=", "bicycle", "designated"], + ["!=", "horse", "designated"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 93%)", + "line-opacity": 0.6, + "line-width": { + "base": 1.2, + "stops": [ + [14, 2.7], + [15, 3], + [17, 3.3], + [18, 3.6] + ] + } + } + }, + { + "id": "Cycleway path", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["any", ["==", "subclass", "cycleway"], ["==", "bicycle", "designated"]] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(240, 100%, 50%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [12, 0.7], + [14, 0.9], + [17, 1], + [18, 1.3] + ] + } + } + }, + { + "id": "Steps path", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["==", "subclass", "steps"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(6, 93%, 71%)", + "line-dasharray": [0.5, 0.5], + "line-width": { + "base": 1.2, + "stops": [ + [12, 1.7], + [14, 1.9], + [17, 2], + [18, 2.3] + ] + } + } + }, + { + "id": "Bridleway path", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["any", ["==", "subclass", "bridleway"], ["==", "horse", "designated"]], + ["!=", "bicycle", "designated"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(120, 100%, 25%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [12, 0.7], + [14, 0.9], + [17, 1], + [18, 1.3] + ] + } + } + }, + { + "id": "Footway path", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "path"], + ["in", "subclass", "footway", "path"], + ["!=", "bicycle", "designated"], + ["!=", "horse", "designated"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(6, 93%, 71%)", + "line-dasharray": [2, 1], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.6], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Tertiary road link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "tertiary"], + ["==", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [10.5, "hsl(0, 0%, 73%)"], + [10.6, "hsl(0, 0%, 100%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 1], + [12, 2], + [13, 3], + [14, 5], + [15, 7], + [16, 11], + [17, 14], + [18, 16] + ] + } + } + }, + { + "id": "Secondary road link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary"], + ["==", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [10.5, "hsl(0, 0%, 73%)"], + [10.6, "hsl(63, 86%, 86%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 2], + [12, 3], + [13, 3.5], + [14, 5], + [15, 7], + [16, 10], + [17, 12], + [18, 14.5] + ] + } + } + }, + { + "id": "Primary road link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "ramp", 1], + ["in", "class", "primary"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(34, 94%, 82%)", + "line-width": { + "base": 1.2, + "stops": [ + [11, 1.5], + [12, 3], + [13, 3], + [14, 6.6], + [16, 10.4], + [17, 11.4], + [18, 14.4] + ] + } + } + }, + { + "id": "Trunk road link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "ramp", 1], + ["in", "class", "trunk"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(15, 96%, 81%)"], + [11, "hsl(14, 89%, 79%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 0.9], + [12, 3], + [14, 6.6], + [16, 10.4], + [17, 11.4], + [18, 14.4] + ] + } + } + }, + { + "id": "Highway road link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"], + ["==", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(347, 71%, 67%)"], + [10, "hsl(349, 65%, 74%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [8, 0.7], + [11, 0.9], + [12, 3], + [14, 6.6], + [16, 10.4], + [17, 11.4], + [18, 14.4], + [19, 15.4] + ] + } + } + }, + { + "id": "Service road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "service"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.9], + [15, 2.3], + [16, 5.4], + [17, 6.9], + [18, 9.4], + [19, 10.4] + ] + } + } + }, + { + "id": "Track road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "track"] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [12, "hsla(42, 61%, 41%, 0.5)"], + [16, "hsl(42, 61%, 41%)"] + ] + }, + "line-dasharray": [3, 2.5], + "line-width": { + "base": 1.2, + "stops": [ + [13, 1.5], + [17, 2], + [19, 2.5] + ] + } + } + }, + { + "id": "Service road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "service_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.9], + [15, 2.3], + [16, 5.4], + [17, 6.9], + [18, 9.4], + [19, 10.4] + ] + } + } + }, + { + "id": "Raceway road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 9, + "filter": ["all", ["in", "class", "raceway"]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(351, 97%, 87%)", + "line-width": { + "base": 1.2, + "stops": [ + [11, 0.7], + [12, 1.9], + [13, 3.9], + [14, 5.1], + [15, 5.1], + [16, 11.5], + [17, 11.5], + [18, 12.7] + ] + } + } + }, + { + "id": "Minor road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "minor_construction"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 83%)", + "line-opacity": 1, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Minor road under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "minor_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [12, "hsl(0, 0%, 83%)"], + [13, "hsl(0, 0%, 100%)"] + ] + }, + "line-dasharray": [1, 1], + "line-opacity": 1, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Minor road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "minor"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [12, "hsl(0, 0%, 83%)"], + [13, "hsl(0, 0%, 100%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [12, 1], + [13, 1.9], + [14, 3.8], + [15, 4.8], + [16, 10.4], + [17, 11.4], + [18, 15.4] + ] + } + } + }, + { + "id": "Tertiary road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 9, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "tertiary_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 73%)", + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Tertiary road under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 9, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "tertiary_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [10.5, "hsl(0, 0%, 73%)"], + [10.6, "hsl(0, 0%, 100%)"] + ] + }, + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Tertiary road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 9, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "tertiary"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [10.5, "hsl(0, 0%, 73%)"], + [10.6, "hsl(0, 0%, 100%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [9, 0.7], + [10, 0.7], + [11, 1.9], + [12, 3], + [13, 3.9], + [14, 7.8], + [15, 8.8], + [16, 16.4], + [17, 19.4], + [18, 25.4] + ] + } + } + }, + { + "id": "Secondary road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary_construction"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": [ + "interpolate", + ["exponential", 1], + ["zoom"], + 10.5, + "hsl(0, 0%, 73%)", + 10.6, + "hsl(63, 86%, 86%)" + ], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Secondary road under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Secondary road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "secondary"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [10.5, "hsl(0, 0%, 73%)"], + [10.6, "hsl(63, 86%, 86%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [8, 1], + [9, 1.1], + [10, 1.1], + [11, 2.9], + [12, 4.3], + [13, 4.3], + [14, 7.6], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Primary road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 7, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "primary_construction"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [7, "hsl(35, 83%, 73%)"], + [11, "hsl(34, 94%, 82%)"] + ] + }, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Primary road under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 7, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "primary_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(35, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Primary road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 7, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "primary"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [7, "hsl(35, 83%, 73%)"], + [11, "hsl(34, 94%, 82%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [7, 1], + [8, 1.4], + [9, 1.8], + [10, 1.8], + [11, 2.5], + [12, 4], + [13, 4], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Trunk road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 7, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "trunk_construction"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(15, 96%, 81%)"], + [11, "hsl(14, 89%, 79%)"] + ] + }, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Trunk road under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 7, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "trunk_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(15, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Trunk road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["!=", "ramp", 1], + ["in", "class", "trunk"] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(347, 71%, 67%)"], + [11, "hsl(14, 89%, 79%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0.3], + [6, 0.5], + [7, 1], + [8, 1.4], + [9, 1.8], + [10, 1.8], + [11, 2.5], + [12, 4], + [13, 4], + [15, 8.6], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Highway road under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway_construction"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [6, "hsl(349, 65%, 74%)"], + [10, "hsl(347, 71%, 67%)"] + ] + }, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 5, + 1, + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Highway road under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway_construction"], + ["!=", "ramp", 1] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(349, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 5, + 0, + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Highway road", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "motorway"], + ["!=", "ramp", 1] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(347, 71%, 67%)"], + [10, "hsl(349, 65%, 74%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [4.9, 0], + [7, 1], + [18, 25] + ] + } + } + }, + { + "id": "Subway line", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "transit"], + ["==", "subclass", "subway"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(60, 1%, 50%)", + "line-dasharray": [1, 1.2], + "line-opacity": 1, + "line-width": { + "stops": [ + [14, 1], + [18, 3] + ] + } + } + }, + { + "id": "Major rail service", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "rail"], + ["in", "service", "siding", "spur", "yard"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [8, "hsl(0, 0%, 47%)"], + [14, "hsl(0, 0%, 51%)"] + ] + }, + "line-opacity": 0.4, + "line-width": { + "base": 1.4, + "stops": [ + [8, 0.8], + [11, 1.5], + [15, 3], + [20, 5.4] + ] + } + } + }, + { + "id": "Major rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "class", "rail"], + ["!in", "service", "siding", "spur", "yard"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [8, "hsl(0, 0%, 47%)"], + [14, "hsl(0, 0%, 51%)"] + ] + }, + "line-width": { + "base": 1.4, + "stops": [ + [8, 0.8], + [11, 1.5], + [15, 3], + [20, 5.4] + ] + } + } + }, + { + "id": "Minor rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "subclass", "tram", "light_rail"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 51%)", + "line-width": { + "base": 1.4, + "stops": [ + [12, 0.8], + [15, 1.2], + [20, 4] + ] + } + } + }, + { + "id": "Major rail hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["==", "class", "rail"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [2.5, 2.5], + "line-width": { + "base": 1.4, + "stops": [ + [9, 0], + [14, 1.5], + [20, 3] + ] + } + } + }, + { + "id": "Minor rail hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["!in", "brunnel", "bridge", "tunnel"], + ["in", "subclass", "tram", "light_rail"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 73%)", + "line-dasharray": [0.2, 4], + "line-width": { + "base": 1.4, + "stops": [ + [14.5, 0], + [15, 2], + [20, 6] + ] + } + } + }, + { + "id": "River bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"] + ], + "layout": { + "line-cap": "butt", + "line-join": "miter" + }, + "paint": { + "line-color": "hsl(0, 0%, 73%)", + "line-gap-width": { + "base": 1.3, + "stops": [ + [13, 0.5], + [20, 6] + ] + }, + "line-width": { + "base": 1.6, + "stops": [ + [12, 0.5], + [20, 12] + ] + } + } + }, + { + "id": "River bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(204, 92%, 75%)", + "line-width": { + "base": 1.3, + "stops": [ + [13, 0.5], + [20, 10] + ] + } + } + }, + { + "id": "Highway link bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "ramp", 1], + ["==", "brunnel", "bridge"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(345, 49%, 53%)"], + [12, "hsl(339, 72%, 51%)"] + ] + }, + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [12, 4], + [14, 7], + [18, 16], + [19, 17] + ] + } + } + }, + { + "id": "Service bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "service"] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(36, 5%, 80%)", + "line-width": { + "base": 1.2, + "stops": [ + [15, 1], + [16, 4], + [20, 11] + ] + } + } + }, + { + "id": "Link bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "class", "link"], ["==", "brunnel", "bridge"]], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(28, 72%, 69%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [12, 1], + [13, 3], + [14, 4], + [20, 15] + ] + } + } + }, + { + "id": "Street bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "street", "street_limited"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(36, 6%, 74%)", + "line-opacity": { + "stops": [ + [12, 0], + [12.5, 1] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [12, 0.5], + [13, 1], + [14, 4], + [20, 25] + ] + } + } + }, + { + "id": "Path bridge second outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"], + ["in", "class", "path"] + ], + "layout": { + "line-join": "miter", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 0%)", + "line-dasharray": [1, 0], + "line-width": { + "base": 1.2, + "stops": [ + [13, 3.7], + [14, 4], + [15, 4.3], + [17, 4.3], + [18, 4.6] + ] + } + } + }, + { + "id": "Path bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"], + ["in", "class", "path"] + ], + "layout": { + "line-join": "miter", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 0], + "line-width": { + "base": 1.2, + "stops": [ + [13, 2.7], + [14, 3], + [15, 3.3], + [17, 3.3], + [18, 3.6] + ] + } + } + }, + { + "id": "Secondary bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 0%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [12, 5], + [13, 5], + [14, 9], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Tertiary bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary", "tertiary"] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(15, 6%, 75%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [8, 1.5], + [20, 17] + ] + } + } + }, + { + "id": "Trunk bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": ["all", ["==", "brunnel", "bridge"], ["in", "class", "trunk"]], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [11, "hsl(13, 58%, 55%)"], + [12, "hsl(12, 62%, 48%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [11, 3.5], + [12, 6], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Primary bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary"] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 0%)", + "line-width": { + "base": 1.2, + "stops": [ + [12, 5], + [13, 5], + [15, 10], + [16, 18], + [17, 21], + [18, 27] + ] + } + } + }, + { + "id": "Highway bridge outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "brunnel", "bridge"], + ["!=", "ramp", 1] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 0%)", + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1.75], + [18, 27] + ] + } + } + }, + { + "id": "Cycleway bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"], + ["in", "class", "path"], + ["any", ["==", "subclass", "cycleway"], ["==", "bicycle", "designated"]] + ], + "paint": { + "line-color": "hsl(240, 100%, 50%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.8], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Bridleway bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"], + ["in", "class", "path"], + ["any", ["==", "subclass", "bridleway"], ["==", "horse", "designated"]], + ["!=", "bicycle", "designated"] + ], + "paint": { + "line-color": "hsl(120, 100%, 25%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.8], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Footway bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + ["==", "$type", "LineString"], + ["==", "brunnel", "bridge"], + ["in", "class", "path"], + ["in", "subclass", "footway", "path"], + ["!=", "bicycle", "designated"], + ["!=", "horse", "designated"] + ], + "paint": { + "line-color": "hsl(6, 93%, 71%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [13, 0.8], + [14, 1], + [15, 1.3], + [17, 1.3], + [18, 1.6] + ] + } + } + }, + { + "id": "Highway link bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "ramp", 1], + ["==", "brunnel", "bridge"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(347, 71%, 67%)"], + [10, "hsl(349, 65%, 74%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [12, 3], + [14, 6], + [18, 15], + [19, 16] + ] + } + } + }, + { + "id": "Service bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "service_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.2, + "stops": [ + [15.5, 0], + [16, 2], + [20, 7.5] + ] + } + } + }, + { + "id": "Service bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "service"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": { + "base": 1.2, + "stops": [ + [15.5, 0], + [16, 2], + [20, 7.5] + ] + } + } + }, + { + "id": "Link bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "class", "link"], ["==", "brunnel", "bridge"]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(48, 100%, 83%)", + "line-width": { + "base": 1.2, + "stops": [ + [12.5, 0], + [13, 1.5], + [14, 2.5], + [20, 11.5] + ] + } + } + }, + { + "id": "Minor bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "minor_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 83%)", + "line-opacity": 1, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Minor bridge under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "minor_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 1], + "line-opacity": 1, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Minor bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "bridge"], ["in", "class", "minor"]], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [13.5, 0], + [14, 2.5], + [20, 18] + ] + } + } + }, + { + "id": "Tertiary bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "tertiary_construction"] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 83%)", + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Tertiary bridge under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "tertiary_construction"] + ], + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Tertiary bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 11, + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "tertiary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-width": { + "base": 1.2, + "stops": [ + [11, 2.3], + [12, 3], + [13, 4], + [14, 7.5], + [15, 8.5], + [16, 16.4], + [17, 19.4], + [18, 25.4] + ] + } + } + }, + { + "id": "Secondary bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary_construction"] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(63, 86%, 86%)", + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Secondary bridge under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary_construction"] + ], + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Secondary bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 7, + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "secondary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(63, 86%, 86%)", + "line-width": { + "base": 1.2, + "stops": [ + [7, 1.5], + [11, 3.3], + [12, 4], + [13, 3.8], + [14, 7.5], + [15, 8.5], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Primary bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "primary_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(34, 94%, 82%)", + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Primary bridge under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "primary_construction"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(34, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Primary bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(34, 94%, 82%)", + "line-width": { + "base": 1.2, + "stops": [ + [7, 1.5], + [11, 3.3], + [12, 4], + [13, 4], + [15, 8.5], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Trunk bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["==", "class", "trunk_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(14, 89%, 79%)", + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Trunk bridge under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "primary_construction", "trunk_construction"] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(48, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 11, + 0, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Trunk bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": ["all", ["==", "brunnel", "bridge"], ["in", "class", "trunk"]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(14, 89%, 79%)", + "line-width": { + "base": 1.2, + "stops": [ + [7, 1.5], + [11, 4.5], + [12, 5], + [15, 8.5], + [16, 16], + [17, 19], + [18, 25] + ] + } + } + }, + { + "id": "Highway bridge under construction", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway_construction"], + ["==", "brunnel", "bridge"], + ["!=", "ramp", 1] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(349, 65%, 74%)"], + [10, "hsl(347, 71%, 67%)"] + ] + }, + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 5, + 1, + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Highway bridge under construction dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway_construction"], + ["==", "brunnel", "bridge"], + ["!=", "ramp", 1] + ], + "paint": { + "line-color": "hsl(349, 0%, 100%)", + "line-dasharray": [1, 1], + "line-width": [ + "interpolate", + ["exponential", 1.2], + ["zoom"], + 5, + 0, + 11, + 1, + 12, + 2, + 13, + 4, + 16, + 7 + ] + } + }, + { + "id": "Highway bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "class", "motorway"], + ["==", "brunnel", "bridge"], + ["!=", "ramp", 1] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(347, 71%, 67%)"], + [10, "hsl(349, 65%, 74%)"] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [5, 0], + [7, 1], + [18, 25] + ] + } + } + }, + { + "id": "Minor rail bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "subclass", "light_rail", "tram"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 51%)", + "line-width": { + "base": 1.4, + "stops": [ + [12, 0.8], + [15, 1.2], + [20, 4] + ] + } + } + }, + { + "id": "Minor rail bridge hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "subclass", "light_rail", "tram"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 73%)", + "line-dasharray": [0.2, 4], + "line-width": { + "base": 1.4, + "stops": [ + [14.5, 0], + [15, 2], + [20, 6] + ] + } + } + }, + { + "id": "Major rail bridge service", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "rail"], + ["in", "service", "siding", "spur", "yard"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(0, 0%, 58%)"], + [12, "hsl(0, 0%, 55%)"], + [14, "hsl(0, 0%, 51%)"] + ] + }, + "line-opacity": 0.4, + "line-width": { + "base": 1.4, + "stops": [ + [8, 0.5], + [15, 3], + [20, 5.4] + ] + } + } + }, + { + "id": "Major rail bridge", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + ["==", "brunnel", "bridge"], + ["in", "class", "rail"], + ["!in", "service", "siding", "spur", "yard"] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": { + "stops": [ + [6, "hsl(0, 0%, 58%)"], + [12, "hsl(0, 0%, 55%)"], + [14, "hsl(0, 0%, 51%)"] + ] + }, + "line-width": { + "base": 1.4, + "stops": [ + [8, 0.5], + [15, 3], + [20, 5.4] + ] + } + } + }, + { + "id": "Major rail bridge hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 8, + "filter": ["all", ["==", "brunnel", "bridge"], ["==", "class", "rail"]], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 100%)", + "line-dasharray": [2, 2], + "line-width": { + "base": 1.4, + "stops": [ + [9, 0], + [15, 2], + [20, 4] + ] + } + } + }, + { + "id": "Cablecar", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": ["==", "class", "aerialway"], + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 50%)", + "line-width": { + "base": 1, + "stops": [ + [11, 1], + [19, 2.5] + ] + } + } + }, + { + "id": "Cablecar dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": ["==", "class", "aerialway"], + "layout": { + "line-cap": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(0, 0%, 26%)", + "line-dasharray": [0.5, 10], + "line-width": { + "base": 1, + "stops": [ + [11, 1], + [19, 3] + ] + } + } + }, + { + "id": "Other border", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "minzoom": 3, + "filter": ["all", ["in", "admin_level", 3, 4], ["==", "maritime", 0]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(301, 23%, 42%)", + "line-dasharray": [5, 3], + "line-opacity": { + "stops": [ + [3, 0.5], + [10, 1] + ] + }, + "line-width": { + "base": 1, + "stops": [ + [4, 0.4], + [5, 0.7], + [12, 1.6] + ] + } + } + }, + { + "id": "Country border", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "minzoom": 0, + "filter": ["all", ["==", "admin_level", 2], ["==", "disputed", 0]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(303, 17%, 56%)", + "line-opacity": 1, + "line-width": { + "base": 1, + "stops": [ + [3, 0.5], + [5, 1.2], + [12, 3] + ] + } + } + }, + { + "id": "Disputed border", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "minzoom": 0, + "filter": ["all", ["==", "admin_level", 2], ["==", "disputed", 1]], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(246, 17%, 56%)", + "line-dasharray": [4, 3], + "line-opacity": 1, + "line-width": { + "base": 1, + "stops": [ + [3, 0.5], + [5, 1.2], + [12, 3] + ] + } + } + }, + { + "id": "River labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 3, + "filter": ["all", ["==", "$type", "LineString"]], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 400, + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Italic"], + "text-max-width": 5, + "text-size": { + "stops": [ + [11, 10], + [13, 12] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(210, 40%, 50%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1 + } + }, + { + "id": "Lakeline labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "minzoom": 0, + "filter": ["all", ["==", "$type", "LineString"]], + "layout": { + "symbol-placement": "line", + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Regular"], + "text-max-width": 5, + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(238, 43%, 55%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.7)", + "text-halo-width": 1 + } + }, + { + "id": "Water labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "minzoom": 15, + "filter": ["all", ["==", "$type", "Point"], ["!=", "class", "ocean"]], + "layout": { + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Regular"], + "text-max-width": 5, + "text-size": 11, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(210, 39%, 49%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1 + } + }, + { + "id": "House number labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "housenumber", + "minzoom": 17, + "layout": { + "symbol-avoid-edges": false, + "text-allow-overlap": false, + "text-field": "{housenumber}", + "text-font": ["Noto Sans Regular"], + "text-ignore-placement": false, + "text-line-height": -0.15, + "text-padding": 3, + "text-size": { + "stops": [ + [17, 9], + [22, 11] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 40%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1 + } + }, + { + "id": "Oneway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", 1], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "icon-image": "oneway", + "icon-padding": 2, + "icon-rotation-alignment": "map", + "icon-size": { + "stops": [ + [15, 0.8], + [20, 1] + ] + }, + "symbol-placement": "line", + "symbol-spacing": 95, + "visibility": "visible" + }, + "paint": { + "icon-opacity": 1 + } + }, + { + "id": "Oneway opposite", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + ["==", "oneway", -1], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "icon-image": "oneway", + "icon-padding": 2, + "icon-rotate": -90, + "icon-rotation-alignment": "map", + "icon-size": { + "stops": [ + [15, 0.5], + [19, 1] + ] + }, + "symbol-placement": "line", + "symbol-spacing": 75, + "visibility": "visible" + }, + "paint": { + "icon-opacity": 0.5 + } + }, + { + "id": "Ferry line", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 6, + "filter": ["all", ["in", "class", "ferry"]], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "hsl(240, 90%, 73%)", + "line-dasharray": [2, 2], + "line-opacity": ["interpolate", ["linear"], ["zoom"], 5, 0, 9, 1], + "line-width": { + "stops": [ + [10, 0.5], + [14, 1.1] + ] + } + } + }, + { + "id": "Ferry labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 14, + "filter": ["all", ["==", "class", "ferry"]], + "layout": { + "symbol-placement": "line", + "text-anchor": "center", + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Regular"], + "text-offset": [0, 0], + "text-size": ["interpolate", ["linear"], ["zoom"], 14, 10, 18, 12] + }, + "paint": { + "text-color": "hsl(240, 100%, 70%)", + "text-halo-blur": 0, + "text-halo-color": "hsl(195, 45%, 77%)", + "text-halo-width": 2 + } + }, + { + "id": "Road labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 11, + "maxzoom": 22, + "filter": ["all", ["!=", "class", "ferry"]], + "layout": { + "symbol-placement": "line", + "symbol-spacing": ["step", ["zoom"], 250, 17, 400, 20, 800, 21, 1100], + "text-anchor": "center", + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Regular"], + "text-offset": [0, 0], + "text-size": { + "base": 1, + "stops": [ + [14, 9], + [18, 13] + ] + } + }, + "paint": { + "text-color": "hsl(0, 0%, 0%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.97)", + "text-halo-width": 1 + } + }, + { + "id": "Major airport labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "aerodrome_label", + "minzoom": 8, + "maxzoom": 17, + "filter": ["all", ["has", "iata"]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-allow-overlap": false, + "text-anchor": "center", + "text-field": { + "stops": [ + [8, " "], + [11, "{name}"] + ] + }, + "text-font": ["Noto Sans Italic"], + "text-max-width": 9, + "text-offset": [0, 0], + "text-optional": true, + "text-padding": 2, + "text-size": { + "stops": [ + [8, 10], + [14, 12] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(261, 46%, 43%)", + "text-halo-blur": 0.5, + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1 + } + }, + { + "id": "Other labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 8, + "filter": [ + "all", + ["in", "class", "hamlet", "island", "islet", "neighbourhood", "suburb"] + ], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "symbol-spacing": 150, + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Bold"], + "text-max-width": 10, + "text-size": { + "base": 1.2, + "stops": [ + [11, 10], + [14, 14], + [18, 16] + ] + }, + "text-transform": "none", + "visibility": "visible" + }, + "paint": { + "text-color": { + "stops": [ + [12.5, "hsl(0, 0%, 13%)"], + [12.6, "hsl(0, 0%, 47%)"] + ] + }, + "text-halo-blur": 0, + "text-halo-color": { + "stops": [ + [11, "hsla(0, 0%, 100%, 0.6)"], + [13, "hsl(0, 0%, 100%)"] + ] + }, + "text-halo-width": { + "stops": [ + [8, 0.8], + [13, 1.5] + ] + } + } + }, + { + "id": "National park labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "park", + "minzoom": 7, + "maxzoom": 12, + "filter": ["all", ["<=", "rank", 2]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "symbol-spacing": 150, + "text-allow-overlap": false, + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Italic"], + "text-size": 12, + "visibility": "visible" + }, + "paint": { + "text-color": { + "stops": [ + [7, "hsl(120, 40%, 46%)"], + [10, "hsl(120, 100%, 25%)"] + ] + }, + "text-halo-blur": 0.1, + "text-halo-color": { + "stops": [ + [7, "hsl(100, 100%, 96%)"], + [10, "hsl(110, 83%, 88%)"] + ] + }, + "text-halo-width": 0.3 + } + }, + { + "id": "Village labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 8, + "filter": ["all", ["==", "class", "village"]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Bold"], + "text-max-width": 8, + "text-size": { + "base": 1.2, + "stops": [ + [10, 10], + [15, 16] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(0, 0%, 20%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "Town labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 6, + "filter": ["all", ["==", "class", "town"]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-anchor": "bottom", + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Bold"], + "text-max-width": 8, + "text-offset": [0, 0], + "text-size": { + "base": 1.2, + "stops": [ + [7, 10], + [11, 13] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(0, 0%, 20%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "State labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 4, + "maxzoom": 12, + "filter": ["all", ["==", "class", "state"], ["<", "rank", 3]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Regular"], + "text-letter-spacing": 0, + "text-padding": 2, + "text-size": { + "stops": [ + [3, 10], + [6, 14] + ] + }, + "text-transform": "none", + "visibility": "visible" + }, + "paint": { + "text-color": "hsl(302, 18%, 42%)", + "text-halo-color": "hsla(0, 0%, 100%, 0.7)", + "text-halo-width": 0.8 + } + }, + { + "id": "City labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 4, + "maxzoom": 14, + "filter": ["all", ["==", "class", "city"], ["!in", "capital", 1, 2]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-anchor": "center", + "text-field": ["coalesce", ["get", "name:en"], ["get", "name"]], + "text-font": ["Noto Sans Bold"], + "text-max-width": 8, + "text-offset": [0, 0], + "text-size": { + "base": 1.2, + "stops": [ + [4, 11], + [15, 16] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": { + "stops": [ + [6, "hsl(0, 0%, 35%)"], + [14, "hsl(0, 0%, 13%)"] + ] + }, + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1 + } + }, + { + "id": "Capital city labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 3, + "maxzoom": 15, + "filter": ["all", ["==", "class", "city"], ["in", "capital", 1, 2]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-anchor": "center", + "text-field": "{name:en}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 8, + "text-offset": [0, 0], + "text-size": { + "base": 1.2, + "stops": [ + [4, 12], + [12, 18] + ] + }, + "visibility": "visible" + }, + "paint": { + "text-color": { + "stops": [ + [6, "hsl(0, 0%, 29%)"], + [14, "hsla(0, 0%, 13%, 1)"] + ] + }, + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 1.2 + } + }, + { + "id": "Country labels", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 2, + "maxzoom": 12, + "filter": ["all", ["==", "class", "country"], ["!=", "iso_a2", "VA"]], + "layout": { + "symbol-sort-key": ["to-number", ["get", "rank"]], + "text-field": "{name:en}", + "text-font": ["Noto Sans Bold"], + "text-max-width": 6.25, + "text-size": [ + "interpolate", + ["linear", 1], + ["zoom"], + 4.99, + ["case", [">", ["get", "rank"], 2], 0, 11], + 5, + ["case", [">", ["get", "rank"], 2], 13, 14], + 7, + ["case", [">", ["get", "rank"], 2], 17, 19] + ], + "text-transform": "none", + "visibility": "visible" + }, + "paint": { + "text-color": { + "stops": [ + [2, "hsl(302, 16%, 36%)"], + [10, "hsl(273, 33%, 22%)"] + ] + }, + "text-halo-blur": 1, + "text-halo-color": "hsla(0, 0%, 100%, 0.8)", + "text-halo-width": 0.8 + } + } + ] +} diff --git a/apps/frontend/src/components/Map.tsx b/apps/frontend/src/components/Map.tsx index 00f526a..453e044 100644 --- a/apps/frontend/src/components/Map.tsx +++ b/apps/frontend/src/components/Map.tsx @@ -5,7 +5,6 @@ import { CircleMarker, MapContainer, Marker, - TileLayer, Tooltip, useMap, } from 'react-leaflet' @@ -19,16 +18,14 @@ import harpIconUrl from '#/assets/harp.svg?url' import harpShadowUrl from '#/assets/harp_shadow.svg?url' import { MOCK_LOCATION_NAME } from '../lib/location' import type { Coordinates } from '../lib/location' +import { MAP_STYLE_URLS } from '../lib/map-styles' +import { useThemeMode } from '../lib/use-theme-mode' import type { SearchResult } from '../types/search' +import { VectorTileLayer } from './VectorTileLayer' const DEFAULT_CENTER: [number, number] = [63.4305, 10.3951] const DEFAULT_ZOOM = 15 -// Using the single `tile` host (instead of the a/b/c subdomains) means the -// browser only needs one connection, and preconnecting to it in the document -// head pays off for every tile request. -const TILE_URL = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png' - function FlyToResult({ coordinates }: { coordinates: number[] | undefined }) { const map = useMap() @@ -83,6 +80,7 @@ export default function Map({ isMockLocation = false, }: MapProps) { const navigate = useNavigate() + const themeMode = useThemeMode() // Start at the user's position when we already know it. Otherwise Leaflet // first downloads tiles for the default view and immediately replaces them // after flying to the user, wasting both time and bandwidth. @@ -105,13 +103,11 @@ export default function Map({ - + { + const layer = maplibreGL({ + style: styleUrl, + attributionControl: false, + }) + layer.addTo(map) + map.attributionControl.addAttribution(MAP_ATTRIBUTION) + + // The upstream dark style references a `wood-pattern` sprite that is not + // included in its sprite sheet. Add a transparent placeholder so MapLibre + // does not log a warning for every redraw. + const glMap = layer.getMaplibreMap() + glMap.on('styleimagemissing', (event) => { + if (!glMap.hasImage(event.id)) { + glMap.addImage(event.id, { + width: 1, + height: 1, + data: new Uint8Array(4), + }) + } + }) + + return () => { + map.attributionControl.removeAttribution(MAP_ATTRIBUTION) + layer.remove() + } + }, [map, styleUrl]) + + return null +} diff --git a/apps/frontend/src/components/VenueMap.tsx b/apps/frontend/src/components/VenueMap.tsx index 7b10057..f342d1f 100644 --- a/apps/frontend/src/components/VenueMap.tsx +++ b/apps/frontend/src/components/VenueMap.tsx @@ -1,9 +1,12 @@ -import { MapContainer, Marker, TileLayer } from 'react-leaflet' +import { MapContainer, Marker } from 'react-leaflet' import L from 'leaflet' import 'leaflet/dist/leaflet.css' import harpIconUrl from '#/assets/harp.svg?url' import harpShadowUrl from '#/assets/harp_shadow.svg?url' +import { MAP_STYLE_URLS } from '#/lib/map-styles' +import { useThemeMode } from '#/lib/use-theme-mode' +import { VectorTileLayer } from './VectorTileLayer' export interface VenueMapProps { lat: number @@ -22,20 +25,20 @@ const harpIcon = new L.Icon({ }) export default function VenueMap({ lat, lon, name }: VenueMapProps) { + const themeMode = useThemeMode() + return ( - + ) diff --git a/apps/frontend/src/components/__tests__/Map.test.tsx b/apps/frontend/src/components/__tests__/Map.test.tsx index 015db64..5c46835 100644 --- a/apps/frontend/src/components/__tests__/Map.test.tsx +++ b/apps/frontend/src/components/__tests__/Map.test.tsx @@ -2,6 +2,7 @@ import { render, screen, waitFor } from '@testing-library/react' import { describe, expect, it, vi } from 'vitest' import type { ReactNode } from 'react' +import { MAP_STYLE_URLS } from '#/lib/map-styles' import { makeSearchResult } from '#/test/fixtures' import Map from '../Map' import VenueMap from '../VenueMap' @@ -37,9 +38,6 @@ vi.mock('react-leaflet', () => ({ {children} ), - TileLayer: ({ url }: { url: string }) => ( -
- ), Marker: ({ children, position, title }: MarkerProps) => (
({ ), })) +vi.mock('../VectorTileLayer', () => ({ + VectorTileLayer: ({ styleUrl }: { styleUrl: string }) => ( +
+ ), +})) + +vi.mock('#/lib/use-theme-mode', () => ({ + useThemeMode: () => 'light', +})) + describe('Map', () => { it('renders a map, tile layer and markers for nearby venues', () => { const venue = makeSearchResult() @@ -86,9 +94,9 @@ describe('Map', () => { '63.4305,10.3951', ) expect(screen.getByTestId('map')).toHaveAttribute('data-zoom', '15') - expect(screen.getByTestId('tile-layer')).toHaveAttribute( - 'data-url', - 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + expect(screen.getByTestId('vector-tile-layer')).toHaveAttribute( + 'data-style', + MAP_STYLE_URLS.light, ) const marker = screen.getByTestId('marker') diff --git a/apps/frontend/src/lib/map-styles.ts b/apps/frontend/src/lib/map-styles.ts new file mode 100644 index 0000000..47728ac --- /dev/null +++ b/apps/frontend/src/lib/map-styles.ts @@ -0,0 +1,12 @@ +const BASE_URL = import.meta.env.BASE_URL.replace(/\/$/, '') +const OSM_CARTO_STYLE = `${BASE_URL}/map-styles/osm-carto.json` + +export const MAP_STYLE_URLS = { + // The dark theme uses the same style with the washed-out CSS filter that the + // original OSM raster map used. + light: OSM_CARTO_STYLE, + dark: OSM_CARTO_STYLE, +} as const + +export const MAP_ATTRIBUTION = + '© OpenFreeMap © OpenMapTiles Data from OpenStreetMap' diff --git a/apps/frontend/src/lib/use-theme-mode.ts b/apps/frontend/src/lib/use-theme-mode.ts new file mode 100644 index 0000000..cc42d22 --- /dev/null +++ b/apps/frontend/src/lib/use-theme-mode.ts @@ -0,0 +1,29 @@ +import { useEffect, useState } from 'react' + +export type ThemeMode = 'light' | 'dark' + +function readThemeMode(): ThemeMode { + if (typeof document === 'undefined') return 'light' + + return document.documentElement.dataset.theme === 'dark' ? 'dark' : 'light' +} + +/** Tracks the theme that `ThemeToggle` writes to the document element. */ +export function useThemeMode(): ThemeMode { + const [mode, setMode] = useState(readThemeMode) + + useEffect(() => { + const observer = new MutationObserver(() => { + setMode(readThemeMode()) + }) + + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-theme'], + }) + + return () => observer.disconnect() + }, []) + + return mode +} diff --git a/apps/frontend/src/routes/__root.tsx b/apps/frontend/src/routes/__root.tsx index 1ac9610..be3da2b 100644 --- a/apps/frontend/src/routes/__root.tsx +++ b/apps/frontend/src/routes/__root.tsx @@ -107,7 +107,7 @@ function RootDocument({ children }: { children: React.ReactNode }) { type="font/woff2" crossOrigin="anonymous" /> - + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 16a4852..5540a0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,10 +13,10 @@ importers: devDependencies: '@tanstack/eslint-config': specifier: latest - version: 0.4.0(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + version: 0.5.0(@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) eslint: specifier: latest - version: 10.13.0(jiti@2.7.0) + version: 10.14.0(jiti@2.7.0) prettier: specifier: ^3.9.9 version: 3.9.10 @@ -60,33 +60,39 @@ importers: apps/frontend: dependencies: + '@maplibre/maplibre-gl-leaflet': + specifier: ^0.1.4 + version: 0.1.4(@types/leaflet@1.9.22)(leaflet@1.9.4)(maplibre-gl@5.24.0) '@tailwindcss/vite': specifier: ^4.3.3 version: 4.3.3(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) '@tanstack/react-devtools': specifier: latest - version: 0.10.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.17) + version: 0.10.14(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.17) '@tanstack/react-query': specifier: latest - version: 5.105.0(@types/react@19.3.0)(react@19.3.0) + version: 5.107.1(@types/react@19.3.0)(react@19.3.0) '@tanstack/react-query-devtools': specifier: latest - version: 5.105.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react@19.3.0) + version: 5.107.1(@tanstack/react-query@5.107.1(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react@19.3.0) '@tanstack/react-router': specifier: latest version: 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-router-devtools': specifier: latest - version: 1.167.2(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.167.3(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-router-ssr-query': specifier: latest - version: 1.167.3(@tanstack/query-core@5.105.0)(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.0))(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.167.3(@tanstack/query-core@5.107.1)(@tanstack/react-query@5.107.1(@types/react@19.3.0)(react@19.3.0))(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/react-start': specifier: latest - version: 1.169.4(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + version: 1.169.5(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) leaflet: specifier: ^1.9.4 version: 1.9.4 + maplibre-gl: + specifier: ^5.24.0 + version: 5.24.0 nitro: specifier: 3.0.260610-beta version: 3.0.260610-beta(@electric-sql/pglite@0.4.3)(chokidar@5.0.0)(dotenv@17.4.2)(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.3)(mysql2@3.15.3)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) @@ -111,7 +117,7 @@ importers: version: 0.5.20(tailwindcss@4.3.3) '@tanstack/devtools-vite': specifier: latest - version: 0.8.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + version: 0.8.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) '@tanstack/router-cli': specifier: ^1.167.39 version: 1.167.43 @@ -721,6 +727,49 @@ packages: peerDependencies: solid-js: ^1.8.8 + '@mapbox/jsonlint-lines-primitives@2.0.3': + resolution: {integrity: sha512-0SElaV0uMxEnxzBhhX9WTuPyUeMsAN/SS0i16tjuba4/mio63MG9khjC1a0JAiPGXAwvwm4UfHJURCN7nyudQg==} + engines: {node: '>= 22'} + + '@mapbox/point-geometry@1.1.0': + resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} + + '@mapbox/tiny-sdf@2.3.0': + resolution: {integrity: sha512-gBvcNDBBB66bgQYvnaJ6Jk+VCaMmVq5+IZR2kWPisT88Z8s0kBQt6hfVi8QgRW8Vpg0UWZzBA4ZSyzHHC+VeRA==} + + '@mapbox/unitbezier@0.0.1': + resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + + '@mapbox/unitbezier@1.0.0': + resolution: {integrity: sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ==} + + '@mapbox/vector-tile@2.0.5': + resolution: {integrity: sha512-pXj8m7KTsqZt+1jsE0xIpGvqTSbblfkuEJL/NJmNePMtEwxO8V3XMDo9WMSfDeqHvCtBI9Lmt4mGcGR10zecmw==} + + '@mapbox/whoots-js@3.1.0': + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + + '@maplibre/geojson-vt@6.3.0': + resolution: {integrity: sha512-3Zw2jsU9pIJG3G2CQFbLjWj2MlAHodhD7cSY+15iywUuLmmkgzcKRnueVRZ4AcC/5wOtfhidcJAAzBpoBNs3Xg==} + + '@maplibre/maplibre-gl-leaflet@0.1.4': + resolution: {integrity: sha512-k57wcndZIvq3m08g2je4pjUPGr43ffNW3j+gXbymt8Vi2l1lUERUi1UmdTZcTPN8LuDDYOMWRNBaSLwpAu02ew==} + peerDependencies: + '@types/leaflet': ^1.9.0 + leaflet: ^1.9.3 + maplibre-gl: ^2.4.0 || ^3.3.1 || ^4.3.2 || ^5.0.0 || ^6.0.0 + + '@maplibre/maplibre-gl-style-spec@24.10.0': + resolution: {integrity: sha512-lichxSiagMEBBrqHF0trtMQH9RKh+9jUlIJl0qW0QHvt2H/tbvUWdE+ZzI2Jd0/pT7j/iavLonlPu7EQ/ixTOw==} + hasBin: true + + '@maplibre/mlt@1.3.0': + resolution: {integrity: sha512-7M2O7ABM80Oi8XPkfkrjKB8mOBIxGoVgkA52Mu4RMWoBvvMdagQ522+WxVYujZsMpqIr3BpzrTbXrm4k8lCzCQ==} + + '@maplibre/vt-pbf@4.3.3': + resolution: {integrity: sha512-dEe5XUd64RQbxNxy2OzIkJnwNDWjVmSXjCd0A7zLirm7QJ/WWbmtDFIkfsiM4yt1cplqzG6oSivRYeWx1SM1yg==} + '@napi-rs/wasm-runtime@1.2.5': resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -800,56 +849,48 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.120.0': resolution: {integrity: sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.120.0': resolution: {integrity: sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.120.0': resolution: {integrity: sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.120.0': resolution: {integrity: sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.120.0': resolution: {integrity: sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.120.0': resolution: {integrity: sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.120.0': resolution: {integrity: sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.120.0': resolution: {integrity: sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA==} @@ -1369,8 +1410,8 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tanstack/devtools-bundler-core@0.1.3': - resolution: {integrity: sha512-F0tlxIyfFqXkZ1mJP1EjtkiSeJA+ztXY2AYOHf7r4goCIEAOp86N9PFJ/yv8vu1TnmxGS6vKsZCS3Kyls9xQQA==} + '@tanstack/devtools-bundler-core@0.1.4': + resolution: {integrity: sha512-NaDbpESGyGLV4XPbLsL1b7XeGnYovbnRjoTZ9LoAwllaaposdcrgtBsAcbdr0n4p+mltEVrUB6AFpvAmjj0VGQ==} engines: {node: '>=18'} '@tanstack/devtools-client@0.0.8': @@ -1386,28 +1427,27 @@ packages: engines: {node: '>=18'} hasBin: true - '@tanstack/devtools-ui@0.7.1': - resolution: {integrity: sha512-3xQ/ezZ2qVNszhjpCN2N3jn7uHc2J1PMgcyjHzH4XZBt9xAQyMMcPNoR2cd7rzReyxWoJpZUWiDBmOJiCtLj9A==} + '@tanstack/devtools-ui@0.7.2': + resolution: {integrity: sha512-Ij6EpEXkx13OOVMJPCJpMzWzVV/mcsqfXM4d+ZjqCrQtgbt7cd2rsCseuKuYNmuGhJiOLYNXzYU5da7UqCY54g==} engines: {node: '>=18'} peerDependencies: - solid-js: '>=1.9.7' + solid-js: ^1.9.13 - '@tanstack/devtools-vite@0.8.5': - resolution: {integrity: sha512-xaifCEmiwwzizlbp973oISXNsnmuU/BugLa66gryAZaPJJ/qo1kJd2DxY5X960eHwmyIS3SN0KYrL3/aRhucmA==} + '@tanstack/devtools-vite@0.8.6': + resolution: {integrity: sha512-CkaVqh3P7cJmQ6mMIxQfEmmR8gwlmgRCcoiWOMLigHaPobrrwTqsZvKqvYRHBybZ3ZT1ZSBj5TwlP7ukJJcRlg==} engines: {node: '>=18'} hasBin: true peerDependencies: vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@tanstack/devtools@0.15.0': - resolution: {integrity: sha512-KyS7Qi82Eq9yG8C+uae3ikAPb+D5rfzVhvOOjXVAHZ/64s6TWJlDWpREw1FrHIYZaI7paErpsExSSKlF5BKA/A==} + '@tanstack/devtools@0.16.0': + resolution: {integrity: sha512-SgmsZ1RwWgohY+S2GhZ1bCttZ+bICb8EKaI1DUFBrs/CXL67IaW25TouoHflj5fGzrppfDM2ld56+TLuzMwJSA==} engines: {node: '>=18'} - hasBin: true peerDependencies: - solid-js: '>=1.9.7' + solid-js: ^1.9.13 - '@tanstack/eslint-config@0.4.0': - resolution: {integrity: sha512-V+Cd81W/f65dqKJKpytbwTGx9R+IwxKAHsG/uJ3nSLYEh36hlAr54lRpstUhggQB8nf/cP733cIw8DuD2dzQUg==} + '@tanstack/eslint-config@0.5.0': + resolution: {integrity: sha512-ViENA1MY9G9PN+xCRPI4aVUgHWZqQdlhiAWi/Gxw9PP4rvsmlyPYx8wLm6Xw7Mb8coRUvNZt3NxKiyQCeulY7w==} engines: {node: '>=18'} peerDependencies: eslint: ^9.0.0 || ^10.0.0 @@ -1420,14 +1460,14 @@ packages: resolution: {integrity: sha512-DIpUSOhPfQ7u/qfUi/Wgm0wBO56MyBYXGvnlI0NcauDRPqdBUlAZZjW2Dxm92m+k1UWVhKw8YJ4f47+75Aujyw==} engines: {node: '>=20'} - '@tanstack/query-core@5.105.0': - resolution: {integrity: sha512-7p56vRmT/z4UJ6sctGIdl5WRUQyUv53IUpUwEKi2g97zMbO7zh8ZsCLffGAvCPBR4xD72e3VXsDyLwXHhoNTMQ==} + '@tanstack/query-core@5.107.1': + resolution: {integrity: sha512-PSyAik11oQBEVOiVy5hjZWHmoUqOXqK1WYy4v55mcxozEfKaQgpUMsgnXhWjuESzSht8JfzqMS1m6M/9CpNgvg==} - '@tanstack/query-devtools@5.105.0': - resolution: {integrity: sha512-vRJf9XRHB+P2aMSAEHWtMLsAf1nC9NSsHVqSHiT/FZYU/+5LEo2BOrXKskURQnJEzg6whaBeP6iMn0PS30KJrQ==} + '@tanstack/query-devtools@5.107.1': + resolution: {integrity: sha512-cZvgIPNvsh57mM3yTTwuL2GUMmMp5XR+3k5r2UJDyStmPYCqSwZf8z7OulgA4X8vISziAG5PoykbQ1q+2zemdA==} - '@tanstack/react-devtools@0.10.13': - resolution: {integrity: sha512-r0cdB/14+st2Vxl/1Bodlyq4VC8pf9SykLQDYbGHDc1+V146WQo5B3KlYLkfyxD9Q/6+9NPRQHZyl8fvZVMdRA==} + '@tanstack/react-devtools@0.10.14': + resolution: {integrity: sha512-wFoNpqiU03MDbY1RljhX4vMUoGWwqpa5AZthWEaJRrojBFWFoB57lzzIM5r+EPGi+BsEX+OcXkn8Zkfoe4hGiA==} engines: {node: '>=18'} peerDependencies: '@types/react': '>=16.8' @@ -1435,18 +1475,18 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-query-devtools@5.105.0': - resolution: {integrity: sha512-FfRQxvqngBYqTLsuAB+qaj0Ef3KkUpknuRoyUjcl8OCZhwPocTHEvhMPAoBmk1FtO6nXUIVCC7F9A2AHH01SLQ==} + '@tanstack/react-query-devtools@5.107.1': + resolution: {integrity: sha512-A3q9X3iOxtlz1jU/ou7t9CFvNHT84rTMofS1YEkFcBalvwotZ/RJKPDsX1NsQVl10J8XwN0OYMSfdjgIElt0sg==} peerDependencies: - '@tanstack/react-query': ^5.105.0 + '@tanstack/react-query': ^5.107.1 '@types/react': ^18 || ^19 react: ^18 || ^19 peerDependenciesMeta: '@types/react': optional: true - '@tanstack/react-query@5.105.0': - resolution: {integrity: sha512-y+hMuDERvgg6ay1da0V1a6ZC0ZONt7dELxSFkqRZuwm7p1TTZs0MoXrPlBRflIpRoYjvzQVYxycnLImpFLhWrw==} + '@tanstack/react-query@5.107.1': + resolution: {integrity: sha512-udCOOLp3ZAheUrIHLCe+ZZge6nr2ZUrGMSWcCuXsjY1Bf2JeeE09oxst97PILiCY6N8xo/7bIo3Hvz13zh06FA==} peerDependencies: '@types/react': ^18 || ^19 react: ^18 || ^19 @@ -1454,12 +1494,12 @@ packages: '@types/react': optional: true - '@tanstack/react-router-devtools@1.167.2': - resolution: {integrity: sha512-VuoqB7OhDUrBa4WOFSKiAQ8xI8sJpeZdo9sYE1hQa89iMuVFUQu1iWE4iCiQhB+6TYOZDZ9e+iHKxYjop4ZVYw==} + '@tanstack/react-router-devtools@1.167.3': + resolution: {integrity: sha512-HwAbCp3eIDHG6DmG9M7U7zBB5V3ybjeBek7Ss1Lz3NO19+qHDCJygdNPJpzdZJqznlnYGwLEoUF9XssUx5p8RQ==} engines: {node: '>=20.19'} peerDependencies: - '@tanstack/react-router': ^1.170.36 - '@tanstack/router-core': ^1.171.30 + '@tanstack/react-router': ^1.170.46 + '@tanstack/router-core': ^1.171.39 react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' peerDependenciesMeta: @@ -1483,15 +1523,15 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.168.44': - resolution: {integrity: sha512-WvrYhQ0EgwYpxnP9mFCCo+jctqXV3qq8GfIyiSGLiZzz4GDyw+GuQ2lyA3BTN64wbNNNVeMll+9PV5OlGYi2/w==} + '@tanstack/react-start-client@1.168.45': + resolution: {integrity: sha512-DzTCJS+TVFIEs08w9RQGOEp7dtVCEIUU3y6Oay+mXOqoRk62T0olohHbNR9A4Z1my2b3hVdMjg9KG18WOckQYg==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-rsc@0.1.65': - resolution: {integrity: sha512-5MmzmQoADjMA/d2XawkwKAkgBaQFrfifw/wn8qwCaLIntGYd2jkrCga/KdQW2xdjBu9IoP98WFhZilm7DfI/4g==} + '@tanstack/react-start-rsc@0.1.66': + resolution: {integrity: sha512-Utk9e3xJBZGvg0CcmiciW0m2dL45QOHFm/UGgQUcu1w32QvV6p5i8NmewwVcfr8utnexJXifDZZUWeO2NWiLpg==} engines: {node: '>=22.12.0'} peerDependencies: '@rspack/core': '>=2.0.0-0' @@ -1514,11 +1554,11 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.169.4': - resolution: {integrity: sha512-+DmlNPeQ1rsvo025I79GrlNgDm+zVCVAGg9gMIGmAevK2TJRMpKahgEKZZ1j4VSxDxjfTpkfLyuXiUxxjMJCaw==} + '@tanstack/react-start@1.169.5': + resolution: {integrity: sha512-wbI+pitXm5J2uvFe9aLXVgIjY85ju4efsQ76reE19bZTkqyZzpSb+cBkNV5rZMSrsMzWUsbN5CRctHuWeMkRiA==} engines: {node: '>=22.12.0'} peerDependencies: - '@rsbuild/core': ^2.0.0 + '@rsbuild/core': ^2.0.5 '@vitejs/plugin-rsc': '*' react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' @@ -1550,11 +1590,11 @@ packages: resolution: {integrity: sha512-qUhoJ0meuSUqGYQbHbcJYdASr06YtK+bulbj6vtrhKYFkLgkSsZ6tXmMyym7sFxiSJSPYgasgozrL01LyyR/6A==} engines: {node: '>=20.19'} - '@tanstack/router-devtools-core@1.168.2': - resolution: {integrity: sha512-pCCdQ5M/NUeWdiAbPmjyfcNdls6G4vaVlIQbPf1IqZk1FLYFr00aQvi578yUuWFBNM2KNS2QcwM1uPucbtGf5Q==} + '@tanstack/router-devtools-core@1.168.3': + resolution: {integrity: sha512-NJh7lWkvShucJU/pXtf5JWLqprL+8j6L5m82qcFuCvS4azOfknYr+KVIb3uEyVpLTrMpAvw+/hJEgAGULs21HA==} engines: {node: '>=20.19'} peerDependencies: - '@tanstack/router-core': ^1.171.30 + '@tanstack/router-core': ^1.171.39 csstype: ^3.0.10 peerDependenciesMeta: csstype: @@ -1564,17 +1604,17 @@ packages: resolution: {integrity: sha512-3IOgWD3gUmbokR9q1ZFQE9/By/VMX4/bDSKJwaIa625PDB0czCF6J+OPSeA/7wb1wDE42fAqX1q4j7bnr1eLcA==} engines: {node: '>=20.19'} - '@tanstack/router-generator@1.167.46': - resolution: {integrity: sha512-JSailAThcqPvqBzE3+MhNh6zQyZM2IdmIsHOxZgAc061Lh++SZqamNm/Whe7QNXWK5sLP4E0J1F8AI0hP8wTSw==} - engines: {node: '>=20.19'} + '@tanstack/router-generator@1.168.0': + resolution: {integrity: sha512-Ty3y1g96Nq4yMojTH+OTgRFp0oa14LBKhiDW8+SrsdgW2mCpPRzZ8Ix7jjztxmkS8O+AKc2WaLkSskGUe3oEDQ==} + engines: {node: ^20.19.0 || >=22.12.0} - '@tanstack/router-plugin@1.168.48': - resolution: {integrity: sha512-oLDEZO/vhvF5JLrQ6qMNYcCjMMhlHA0Byx6ZXl9AHJ6qVLRxUeCU41vlZQ4buisONY2p0Zl9O09/qwLiVrIBCQ==} - engines: {node: '>=20.19'} + '@tanstack/router-plugin@1.169.0': + resolution: {integrity: sha512-aulFJmvW/rN5zQg/IM1Z5iUueX9dnYjBKxNpFWstpHxbatdlRlEwtSrc57VlBmfzRuckVxpZLi6wH3O40DMLgw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@rsbuild/core': '>=1.0.2 || ^2.0.0' '@tanstack/react-router': ^1.170.46 - vite: '>=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0' + vite: '>=6.0.0' vite-plugin-solid: ^2.11.10 || ^3.0.0-0 webpack: '>=5.92.0' peerDependenciesMeta: @@ -1600,9 +1640,14 @@ packages: resolution: {integrity: sha512-Icb0xGuG1+54IV0WMLRcc3ErTx2HeJWyPG661FkQ8UT6guoBq1FJjFRqlG/JS0xi4mFFkBhvwO7tbLa32f3yxA==} engines: {node: '>=20.19'} - '@tanstack/router-utils@1.162.4': - resolution: {integrity: sha512-3TSH3rwAQTqQOtTBF8IXMFXmGNJWnjwIm+l87uguyC/of0pSRKcU9GJrozaf0fY9it8dLQvUZJA2MOlfqbW1sA==} - engines: {node: '>=20.19'} + '@tanstack/router-utils@1.163.0': + resolution: {integrity: sha512-OMeFv8aRwk9Xtf3JhRmQrjtMxCj7qqfnsueASuL8xUgItoblIL9eCIyt4Zv0hk3LBp/s7NqviZgQhiAfDhJb/A==} + engines: {node: ^20.19.0 || >=22.12.0} + + '@tanstack/solid-virtual@3.13.53': + resolution: {integrity: sha512-LUdGSmkTkwtpUea4w7bJp6N6ErnNkWT5iXpvn0mI9ijjtVrOa0JkSX8ZhQfNZxbhm4cnlGYbz/U1SQn/LqSNlw==} + peerDependencies: + solid-js: ^1.3.0 '@tanstack/start-client-core@1.170.39': resolution: {integrity: sha512-G0VJbZFf9/dYomQjZkWapaTjkjEI4vbk1jnxhhVtQ3nTRb3sIRc196j+S+qZcySfEV5W9TJHu4KatjSzjZZQwQ==} @@ -1612,11 +1657,11 @@ packages: resolution: {integrity: sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.171.55': - resolution: {integrity: sha512-8FjTuuxIE8MNJoveXahZPBCfEpm8p9tMFyWTvbllfqlysdhry34rw/nCwULfcVwTG39ezXEu/RYE83NSV+miog==} + '@tanstack/start-plugin-core@1.171.56': + resolution: {integrity: sha512-xTzXpxfuBsJjBq4xLbQ0Go0/87SReVukjevkqNR3k/rgeKHfjt8nHJDMaQByS97ko+jmSoVY8+TXtRLaCYvI0A==} engines: {node: '>=22.12.0'} peerDependencies: - '@rsbuild/core': ^2.0.0 + '@rsbuild/core': ^2.0.5 vite: '>=8.0.0' peerDependenciesMeta: '@rsbuild/core': @@ -1635,6 +1680,9 @@ packages: '@tanstack/store@0.11.2': resolution: {integrity: sha512-sJ4mjol8uQsHV0gOJzzjwXfh2Fwm+Sz0+8deqiTm4jGbMdjzNSW+xZCFm0kUa870uhd8yi+DpKnZb5Kc4apa0Q==} + '@tanstack/virtual-core@3.19.11': + resolution: {integrity: sha512-/5iHb0RHBvj8Di59FDs4ESNm45jls33aZAi4zccVXZjc/6ZvwQP6nzEYeT6weXjTf9E6/vrp2JhYWRyO+ZP13A==} + '@tanstack/virtual-file-routes@1.162.0': resolution: {integrity: sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA==} engines: {node: '>=20.19'} @@ -1757,39 +1805,39 @@ packages: '@types/react@19.3.0': resolution: {integrity: sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==} - '@typescript-eslint/eslint-plugin@8.71.2': - resolution: {integrity: sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ==} + '@typescript-eslint/eslint-plugin@8.72.1': + resolution: {integrity: sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.71.2 + '@typescript-eslint/parser': ^8.72.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.71.2': - resolution: {integrity: sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw==} + '@typescript-eslint/parser@8.72.1': + resolution: {integrity: sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.71.2': - resolution: {integrity: sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw==} + '@typescript-eslint/project-service@8.72.1': + resolution: {integrity: sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.71.2': - resolution: {integrity: sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg==} + '@typescript-eslint/scope-manager@8.72.1': + resolution: {integrity: sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.71.2': - resolution: {integrity: sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg==} + '@typescript-eslint/tsconfig-utils@8.72.1': + resolution: {integrity: sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.71.2': - resolution: {integrity: sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang==} + '@typescript-eslint/type-utils@8.72.1': + resolution: {integrity: sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1799,21 +1847,25 @@ packages: resolution: {integrity: sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.71.2': - resolution: {integrity: sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA==} + '@typescript-eslint/types@8.72.1': + resolution: {integrity: sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.72.1': + resolution: {integrity: sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.71.2': - resolution: {integrity: sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw==} + '@typescript-eslint/utils@8.72.1': + resolution: {integrity: sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.71.2': - resolution: {integrity: sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg==} + '@typescript-eslint/visitor-keys@8.72.1': + resolution: {integrity: sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.12.2': @@ -1855,61 +1907,51 @@ packages: resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} cpu: [arm64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.12.2': resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} cpu: [arm64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} cpu: [loong64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-loong64-musl@1.12.2': resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} cpu: [loong64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} cpu: [ppc64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} cpu: [riscv64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} cpu: [riscv64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} cpu: [s390x] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.12.2': resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} cpu: [x64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.12.2': resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} cpu: [x64] os: [linux] - libc: [musl] '@unrs/resolver-binding-openharmony-arm64@1.12.2': resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} @@ -2380,6 +2422,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + earcut@3.2.4: + resolution: {integrity: sha512-FHc6yNpnTORB0tM5kmZ03iD2mDuNakDE2lvf4Hw1XkfxtEHIGVi01B/GqUSwx+NcC1WGjidAfpTXzeALtPtfpg==} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -2520,8 +2565,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.13.0: - resolution: {integrity: sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==} + eslint@10.14.0: + resolution: {integrity: sha512-T0pNsxkb9IKmtQjhpK3d7nWOpFv+YHuMbTJnSVMoQblF0onvXfErrtp4V1jHtsQPan7dKaGVD0q1WCXnzMF31A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2664,6 +2709,9 @@ packages: resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} hasBin: true + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -2847,11 +2895,17 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-pretty-compact@4.0.0: + resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true + kdbush@4.1.0: + resolution: {integrity: sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==} + keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} @@ -3051,6 +3105,10 @@ packages: magic-string@1.4.5: resolution: {integrity: sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==} + maplibre-gl@5.24.0: + resolution: {integrity: sha512-ALyFxgtd5R+65UqZ/++lOqwWcC0SNho9c27fYSyLmG7AfnAul2o46F05aDJGPbFU57wos9dgcIySHs0Xe6ia3A==} + engines: {node: '>=16.14.0', npm: '>=8.1.0'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3084,6 +3142,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + murmurhash-js@1.0.0: + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} + mysql2@3.15.3: resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} engines: {node: '>= 8.0'} @@ -3206,6 +3267,14 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pbf@4.0.2: + resolution: {integrity: sha512-J0ajxARhZfpUEebxYs1vhMGMuLSXtBe1e+fFPDrf2uA2hgo+UshKfNUWOz92HJNz6/NFEXseQPddnHkTreWRqg==} + hasBin: true + + pbf@5.1.2: + resolution: {integrity: sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==} + hasBin: true + perfect-debounce@2.1.0: resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} @@ -3299,6 +3368,9 @@ packages: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} + potpack@2.1.0: + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3328,6 +3400,9 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + protocol-buffers-schema@3.6.1: + resolution: {integrity: sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -3343,6 +3418,9 @@ packages: resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} + quickselect@3.0.0: + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} + raw-body@3.0.2: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} @@ -3403,6 +3481,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-protobuf-schema@2.1.0: + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} + ret@0.5.0: resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} @@ -3606,6 +3687,9 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyqueue@3.0.0: + resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} + tldts-core@7.4.20: resolution: {integrity: sha512-C630TWXZCZmLq0F2bW4QqwnaaxCQ/svpAqvJwnC4JvgEM5ohhBnGsEzTLSOXcN+xjz+kEaHS5uoWIw2klnqd0A==} @@ -3660,8 +3744,8 @@ packages: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typescript-eslint@8.71.2: - resolution: {integrity: sha512-Rz4effbMy2g9wnvOJZG6SbVavX313Lap1vNEbk1RUochzickvzP8P4HB+bkNg5e50eVz1hQGjh9K1omI1xB4Bw==} + typescript-eslint@8.72.1: + resolution: {integrity: sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -3689,8 +3773,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unplugin@3.4.0: - resolution: {integrity: sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==} + unplugin@3.7.0: + resolution: {integrity: sha512-GrM2uq3DQo3hvLU2FjeYhooJ8BY9N6j1Fbzgx7Pta3VVJevsD3VP4dPjZkZOS0mLvN8w9zzr9OlP+31bSMyuLw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: '@farmfe/core': '*' @@ -4402,9 +4486,9 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.13.0(jiti@2.7.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.14.0(jiti@2.7.0))': dependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -4425,9 +4509,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.13.0(jiti@2.7.0))': + '@eslint/js@10.0.1(eslint@10.14.0(jiti@2.7.0))': optionalDependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) '@eslint/object-schema@3.0.5': {} @@ -4543,6 +4627,53 @@ snapshots: '@solid-primitives/utils': 6.4.1(solid-js@1.9.17) solid-js: 1.9.17 + '@mapbox/jsonlint-lines-primitives@2.0.3': {} + + '@mapbox/point-geometry@1.1.0': {} + + '@mapbox/tiny-sdf@2.3.0': {} + + '@mapbox/unitbezier@0.0.1': {} + + '@mapbox/unitbezier@1.0.0': {} + + '@mapbox/vector-tile@2.0.5': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 4.0.2 + + '@mapbox/whoots-js@3.1.0': {} + + '@maplibre/geojson-vt@6.3.0': + dependencies: + kdbush: 4.1.0 + + '@maplibre/maplibre-gl-leaflet@0.1.4(@types/leaflet@1.9.22)(leaflet@1.9.4)(maplibre-gl@5.24.0)': + dependencies: + '@types/leaflet': 1.9.22 + leaflet: 1.9.4 + maplibre-gl: 5.24.0 + + '@maplibre/maplibre-gl-style-spec@24.10.0': + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.3 + '@mapbox/unitbezier': 1.0.0 + json-stringify-pretty-compact: 4.0.0 + minimist: 1.2.8 + quickselect: 3.0.0 + tinyqueue: 3.0.0 + + '@maplibre/mlt@1.3.0': + dependencies: + '@mapbox/point-geometry': 1.1.0 + + '@maplibre/vt-pbf@4.3.3': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 5.1.2 + '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -4993,11 +5124,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.13.0(jiti@2.7.0))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.14.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) '@typescript-eslint/types': 8.71.2 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -5080,7 +5211,7 @@ snapshots: tailwindcss: 4.3.3 vite: 8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15) - '@tanstack/devtools-bundler-core@0.1.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@tanstack/devtools-bundler-core@0.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@tanstack/devtools-client': 0.0.8 '@tanstack/devtools-event-bus': 0.4.3 @@ -5108,7 +5239,7 @@ snapshots: '@tanstack/devtools-event-client@0.5.0': {} - '@tanstack/devtools-ui@0.7.1(csstype@3.2.3)(solid-js@1.9.17)': + '@tanstack/devtools-ui@0.7.2(csstype@3.2.3)(solid-js@1.9.17)': dependencies: clsx: 2.1.1 dayjs: 1.11.23 @@ -5117,9 +5248,9 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.8.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': + '@tanstack/devtools-vite@0.8.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': dependencies: - '@tanstack/devtools-bundler-core': 0.1.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@tanstack/devtools-bundler-core': 0.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@tanstack/devtools-client': 0.0.8 '@tanstack/devtools-event-bus': 0.4.3 chalk: 5.6.2 @@ -5130,7 +5261,7 @@ snapshots: - bufferutil - utf-8-validate - '@tanstack/devtools@0.15.0(csstype@3.2.3)(solid-js@1.9.17)': + '@tanstack/devtools@0.16.0(csstype@3.2.3)(solid-js@1.9.17)': dependencies: '@neodrag/core': 3.0.0-next.11 '@neodrag/solid': 3.0.0-next.11(@neodrag/core@3.0.0-next.11)(solid-js@1.9.17) @@ -5139,7 +5270,7 @@ snapshots: '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.17) '@tanstack/devtools-client': 0.0.8 '@tanstack/devtools-event-bus': 0.4.3 - '@tanstack/devtools-ui': 0.7.1(csstype@3.2.3)(solid-js@1.9.17) + '@tanstack/devtools-ui': 0.7.2(csstype@3.2.3)(solid-js@1.9.17) clsx: 2.1.1 goober: 2.1.19(csstype@3.2.3) solid-js: 1.9.17 @@ -5148,16 +5279,16 @@ snapshots: - csstype - utf-8-validate - '@tanstack/eslint-config@0.4.0(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@tanstack/eslint-config@0.5.0(@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint/js': 10.0.1(eslint@10.13.0(jiti@2.7.0)) - '@stylistic/eslint-plugin': 5.10.0(eslint@10.13.0(jiti@2.7.0)) - eslint: 10.13.0(jiti@2.7.0) - eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0)) - eslint-plugin-n: 17.24.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@eslint/js': 10.0.1(eslint@10.14.0(jiti@2.7.0)) + '@stylistic/eslint-plugin': 5.10.0(eslint@10.14.0(jiti@2.7.0)) + eslint: 10.14.0(jiti@2.7.0) + eslint-plugin-import-x: 4.17.1(@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0)) + eslint-plugin-n: 17.24.0(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) globals: 17.13.0 - typescript-eslint: 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - vue-eslint-parser: 10.4.1(eslint@10.13.0(jiti@2.7.0)) + typescript-eslint: 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + vue-eslint-parser: 10.4.1(eslint@10.14.0(jiti@2.7.0)) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -5170,16 +5301,17 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/query-core@5.105.0': {} + '@tanstack/query-core@5.107.1': {} - '@tanstack/query-devtools@5.105.0(csstype@3.2.3)': + '@tanstack/query-devtools@5.107.1(csstype@3.2.3)': dependencies: '@kobalte/core': 0.13.14(solid-js@1.9.17) '@solid-primitives/keyed': 1.5.3(solid-js@1.9.17) '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.17) '@solid-primitives/storage': 1.3.11(solid-js@1.9.17) '@tanstack/match-sorter-utils': 9.2.6 - '@tanstack/query-core': 5.105.0 + '@tanstack/query-core': 5.107.1 + '@tanstack/solid-virtual': 3.13.53(solid-js@1.9.17) clsx: 2.1.1 goober: 2.1.19(csstype@3.2.3) solid-js: 1.9.17 @@ -5188,9 +5320,9 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/react-devtools@0.10.13(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.17)': + '@tanstack/react-devtools@0.10.14(@types/react-dom@19.3.0(@types/react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(solid-js@1.9.17)': dependencies: - '@tanstack/devtools': 0.15.0(csstype@3.2.3)(solid-js@1.9.17) + '@tanstack/devtools': 0.16.0(csstype@3.2.3)(solid-js@1.9.17) '@types/react': 19.3.0 '@types/react-dom': 19.3.0(@types/react@19.3.0) react: 19.3.0 @@ -5201,27 +5333,27 @@ snapshots: - solid-js - utf-8-validate - '@tanstack/react-query-devtools@5.105.0(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react@19.3.0)': + '@tanstack/react-query-devtools@5.107.1(@tanstack/react-query@5.107.1(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(csstype@3.2.3)(react@19.3.0)': dependencies: - '@tanstack/query-devtools': 5.105.0(csstype@3.2.3) - '@tanstack/react-query': 5.105.0(@types/react@19.3.0)(react@19.3.0) + '@tanstack/query-devtools': 5.107.1(csstype@3.2.3) + '@tanstack/react-query': 5.107.1(@types/react@19.3.0)(react@19.3.0) react: 19.3.0 optionalDependencies: '@types/react': 19.3.0 transitivePeerDependencies: - csstype - '@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.0)': + '@tanstack/react-query@5.107.1(@types/react@19.3.0)(react@19.3.0)': dependencies: - '@tanstack/query-core': 5.105.0 + '@tanstack/query-core': 5.107.1 react: 19.3.0 optionalDependencies: '@types/react': 19.3.0 - '@tanstack/react-router-devtools@1.167.2(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-router-devtools@1.167.3(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(csstype@3.2.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/react-router': 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-devtools-core': 1.168.2(@tanstack/router-core@1.171.39)(csstype@3.2.3) + '@tanstack/router-devtools-core': 1.168.3(@tanstack/router-core@1.171.39)(csstype@3.2.3) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) optionalDependencies: @@ -5229,12 +5361,12 @@ snapshots: transitivePeerDependencies: - csstype - '@tanstack/react-router-ssr-query@1.167.3(@tanstack/query-core@5.105.0)(@tanstack/react-query@5.105.0(@types/react@19.3.0)(react@19.3.0))(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-router-ssr-query@1.167.3(@tanstack/query-core@5.107.1)(@tanstack/react-query@5.107.1(@types/react@19.3.0)(react@19.3.0))(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@tanstack/router-core@1.171.39)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@tanstack/query-core': 5.105.0 - '@tanstack/react-query': 5.105.0(@types/react@19.3.0)(react@19.3.0) + '@tanstack/query-core': 5.107.1 + '@tanstack/react-query': 5.107.1(@types/react@19.3.0)(react@19.3.0) '@tanstack/react-router': 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-ssr-query-core': 1.169.3(@tanstack/query-core@5.105.0)(@tanstack/router-core@1.171.39) + '@tanstack/router-ssr-query-core': 1.169.3(@tanstack/query-core@5.107.1)(@tanstack/router-core@1.171.39) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: @@ -5249,7 +5381,7 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tanstack/react-start-client@1.168.44(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@tanstack/react-start-client@1.168.45(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/react-router': 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/router-core': 1.171.39 @@ -5257,14 +5389,14 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tanstack/react-start-rsc@0.1.65(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': + '@tanstack/react-start-rsc@0.1.66(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': dependencies: '@tanstack/react-router': 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@tanstack/router-core': 1.171.39 - '@tanstack/router-utils': 1.162.4 + '@tanstack/router-utils': 1.163.0 '@tanstack/start-client-core': 1.170.39 '@tanstack/start-fn-stubs': 1.162.0 - '@tanstack/start-plugin-core': 1.171.55(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + '@tanstack/start-plugin-core': 1.171.56(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) '@tanstack/start-storage-context': 1.167.41 pathe: 2.0.3 react: 19.3.0 @@ -5290,15 +5422,15 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) - '@tanstack/react-start@1.169.4(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': + '@tanstack/react-start@1.169.5(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': dependencies: '@tanstack/react-router': 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-start-client': 1.168.44(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/react-start-rsc': 0.1.65(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + '@tanstack/react-start-client': 1.168.45(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@tanstack/react-start-rsc': 0.1.66(esbuild@0.28.2)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) '@tanstack/react-start-server': 1.167.52(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@tanstack/router-utils': 1.162.4 + '@tanstack/router-utils': 1.163.0 '@tanstack/start-client-core': 1.170.39 - '@tanstack/start-plugin-core': 1.171.55(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + '@tanstack/start-plugin-core': 1.171.56(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) '@tanstack/start-server-core': 1.169.45 pathe: 2.0.3 react: 19.3.0 @@ -5347,7 +5479,7 @@ snapshots: seroval: 1.6.9 seroval-plugins: 1.6.9(seroval@1.6.9) - '@tanstack/router-devtools-core@1.168.2(@tanstack/router-core@1.171.39)(csstype@3.2.3)': + '@tanstack/router-devtools-core@1.168.3(@tanstack/router-core@1.171.39)(csstype@3.2.3)': dependencies: '@tanstack/router-core': 1.171.39 clsx: 2.1.1 @@ -5368,11 +5500,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-generator@1.167.46': + '@tanstack/router-generator@1.168.0': dependencies: '@babel/types': 7.29.8 '@tanstack/router-core': 1.171.39 - '@tanstack/router-utils': 1.162.4 + '@tanstack/router-utils': 1.163.0 '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 magic-string: 0.30.21 @@ -5381,16 +5513,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.48(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': + '@tanstack/router-plugin@1.169.0(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': dependencies: '@babel/core': 7.29.7 '@babel/template': 7.29.7 '@babel/types': 7.29.8 '@tanstack/router-core': 1.171.39 - '@tanstack/router-generator': 1.167.46 - '@tanstack/router-utils': 1.162.4 + '@tanstack/router-generator': 1.168.0 + '@tanstack/router-utils': 1.163.0 chokidar: 5.0.0 - unplugin: 3.4.0(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + unplugin: 3.7.0(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) zod: 4.6.7 optionalDependencies: '@tanstack/react-router': 1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -5405,9 +5537,9 @@ snapshots: - supports-color - unloader - '@tanstack/router-ssr-query-core@1.169.3(@tanstack/query-core@5.105.0)(@tanstack/router-core@1.171.39)': + '@tanstack/router-ssr-query-core@1.169.3(@tanstack/query-core@5.107.1)(@tanstack/router-core@1.171.39)': dependencies: - '@tanstack/query-core': 5.105.0 + '@tanstack/query-core': 5.107.1 '@tanstack/router-core': 1.171.39 '@tanstack/router-utils@1.162.3': @@ -5423,7 +5555,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.162.4': + '@tanstack/router-utils@1.163.0': dependencies: '@babel/generator': 7.29.8 '@babel/parser': 7.29.9 @@ -5436,6 +5568,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@tanstack/solid-virtual@3.13.53(solid-js@1.9.17)': + dependencies: + '@tanstack/virtual-core': 3.19.11 + solid-js: 1.9.17 + '@tanstack/start-client-core@1.170.39': dependencies: '@tanstack/router-core': 1.171.39 @@ -5445,16 +5582,16 @@ snapshots: '@tanstack/start-fn-stubs@1.162.0': {} - '@tanstack/start-plugin-core@1.171.55(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': + '@tanstack/start-plugin-core@1.171.56(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15))': dependencies: '@babel/code-frame': 7.29.7 '@babel/core': 7.29.7 '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 '@tanstack/router-core': 1.171.39 - '@tanstack/router-generator': 1.167.46 - '@tanstack/router-plugin': 1.168.48(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) - '@tanstack/router-utils': 1.162.4 + '@tanstack/router-generator': 1.168.0 + '@tanstack/router-plugin': 1.169.0(@tanstack/react-router@1.170.46(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)) + '@tanstack/router-utils': 1.163.0 '@tanstack/start-server-core': 1.169.45 exsolve: 1.1.3 lightningcss: 1.33.0 @@ -5499,6 +5636,8 @@ snapshots: '@tanstack/store@0.11.2': {} + '@tanstack/virtual-core@3.19.11': {} + '@tanstack/virtual-file-routes@1.162.0': {} '@testing-library/dom@10.4.2': @@ -5620,15 +5759,15 @@ snapshots: dependencies: csstype: 3.2.3 - '@typescript-eslint/eslint-plugin@8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.71.2 - '@typescript-eslint/type-utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.71.2 - eslint: 10.13.0(jiti@2.7.0) + '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/type-utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.72.1 + eslint: 10.14.0(jiti@2.7.0) ignore: 7.0.12 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5636,43 +5775,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.71.2 - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/typescript-estree': 8.71.2(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.71.2 + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.72.1 debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.71.2(typescript@6.0.3)': + '@typescript-eslint/project-service@8.72.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.71.2(typescript@6.0.3) - '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.71.2': + '@typescript-eslint/scope-manager@8.72.1': dependencies: - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/visitor-keys': 8.71.2 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/visitor-keys': 8.72.1 - '@typescript-eslint/tsconfig-utils@8.71.2(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.72.1(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/typescript-estree': 8.71.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -5680,12 +5819,14 @@ snapshots: '@typescript-eslint/types@8.71.2': {} - '@typescript-eslint/typescript-estree@8.71.2(typescript@6.0.3)': + '@typescript-eslint/types@8.72.1': {} + + '@typescript-eslint/typescript-estree@8.72.1(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.71.2(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.71.2(typescript@6.0.3) - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/visitor-keys': 8.71.2 + '@typescript-eslint/project-service': 8.72.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.72.1(typescript@6.0.3) + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/visitor-keys': 8.72.1 debug: 4.4.3 minimatch: 10.2.6 semver: 7.8.5 @@ -5695,20 +5836,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.71.2 - '@typescript-eslint/types': 8.71.2 - '@typescript-eslint/typescript-estree': 8.71.2(typescript@6.0.3) - eslint: 10.13.0(jiti@2.7.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.72.1 + '@typescript-eslint/types': 8.72.1 + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + eslint: 10.14.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.71.2': + '@typescript-eslint/visitor-keys@8.72.1': dependencies: - '@typescript-eslint/types': 8.71.2 + '@typescript-eslint/types': 8.72.1 eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.12.2': @@ -6210,6 +6351,8 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + earcut@3.2.4: {} + ee-first@1.1.1: {} effect@3.20.0: @@ -6288,9 +6431,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@10.13.0(jiti@2.7.0)): + eslint-compat-utils@0.5.1(eslint@10.14.0(jiti@2.7.0)): dependencies: - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) semver: 7.8.5 eslint-import-context@0.1.9(unrs-resolver@1.12.2): @@ -6300,19 +6443,19 @@ snapshots: optionalDependencies: unrs-resolver: 1.12.2 - eslint-plugin-es-x@7.8.0(eslint@10.13.0(jiti@2.7.0)): + eslint-plugin-es-x@7.8.0(eslint@10.14.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - eslint: 10.13.0(jiti@2.7.0) - eslint-compat-utils: 0.5.1(eslint@10.13.0(jiti@2.7.0)) + eslint: 10.14.0(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@10.14.0(jiti@2.7.0)) - eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0)): + eslint-plugin-import-x@4.17.1(@typescript-eslint/utils@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0)): dependencies: '@typescript-eslint/types': 8.71.2 comment-parser: 1.4.9 debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) eslint-import-context: 0.1.9(unrs-resolver@1.12.2) is-glob: 4.0.3 minimatch: 10.2.6 @@ -6320,16 +6463,16 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.12.2 optionalDependencies: - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - supports-color - eslint-plugin-n@17.24.0(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + eslint-plugin-n@17.24.0(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) enhanced-resolve: 5.26.0 - eslint: 10.13.0(jiti@2.7.0) - eslint-plugin-es-x: 7.8.0(eslint@10.13.0(jiti@2.7.0)) + eslint: 10.14.0(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@10.14.0(jiti@2.7.0)) get-tsconfig: 4.14.3 globals: 15.15.0 globrex: 0.1.2 @@ -6352,9 +6495,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.13.0(jiti@2.7.0): + eslint@10.14.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.13.0(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.14.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.7.0 @@ -6527,6 +6670,8 @@ snapshots: giget@3.3.1: {} + gl-matrix@3.4.4: {} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -6679,8 +6824,12 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-pretty-compact@4.0.0: {} + json5@2.2.3: {} + kdbush@4.1.0: {} + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -6690,12 +6839,12 @@ snapshots: picocolors: 1.1.1 shell-quote: 1.12.0 - leaflet@1.9.4: {} - leaflet.markercluster@1.5.3(leaflet@1.9.4): dependencies: leaflet: 1.9.4 + leaflet@1.9.4: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -6831,6 +6980,28 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + maplibre-gl@5.24.0: + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.3 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/tiny-sdf': 2.3.0 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 2.0.5 + '@mapbox/whoots-js': 3.1.0 + '@maplibre/geojson-vt': 6.3.0 + '@maplibre/maplibre-gl-style-spec': 24.10.0 + '@maplibre/mlt': 1.3.0 + '@maplibre/vt-pbf': 4.3.3 + '@types/geojson': 7946.0.16 + earcut: 3.2.4 + gl-matrix: 3.4.4 + kdbush: 4.1.0 + murmurhash-js: 1.0.0 + pbf: 4.0.2 + potpack: 2.1.0 + quickselect: 3.0.0 + tinyqueue: 3.0.0 + math-intrinsics@1.1.0: {} mdn-data@2.27.1: {} @@ -6853,6 +7024,8 @@ snapshots: ms@2.1.3: {} + murmurhash-js@1.0.0: {} + mysql2@3.15.3: dependencies: aws-ssl-profiles: 1.1.2 @@ -7011,6 +7184,14 @@ snapshots: pathe@2.0.3: {} + pbf@4.0.2: + dependencies: + resolve-protobuf-schema: 2.1.0 + + pbf@5.1.2: + dependencies: + resolve-protobuf-schema: 2.1.0 + perfect-debounce@2.1.0: {} pg-cloudflare@1.4.1: @@ -7091,6 +7272,8 @@ snapshots: postgres@3.4.7: {} + potpack@2.1.0: {} + prelude-ls@1.2.1: {} prettier@3.9.10: {} @@ -7124,6 +7307,8 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 + protocol-buffers-schema@3.6.1: {} + punycode@2.3.1: {} pure-rand@6.1.0: {} @@ -7137,6 +7322,8 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 + quickselect@3.0.0: {} + raw-body@3.0.2: dependencies: bytes: 3.1.2 @@ -7191,6 +7378,10 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve-protobuf-schema@2.1.0: + dependencies: + protocol-buffers-schema: 3.6.1 + ret@0.5.0: {} retry@0.12.0: {} @@ -7378,6 +7569,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinyqueue@3.0.0: {} + tldts-core@7.4.20: {} tldts@7.4.19: @@ -7433,13 +7626,13 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typescript-eslint@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3): + typescript-eslint@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.71.2(@typescript-eslint/parser@8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.71.2(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.2(eslint@10.13.0(jiti@2.7.0))(typescript@6.0.3) - eslint: 10.13.0(jiti@2.7.0) + '@typescript-eslint/eslint-plugin': 8.72.1(@typescript-eslint/parser@8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.72.1(typescript@6.0.3) + '@typescript-eslint/utils': 8.72.1(eslint@10.14.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.14.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -7458,9 +7651,10 @@ snapshots: unpipe@1.0.0: {} - unplugin@3.4.0(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)): + unplugin@3.7.0(esbuild@0.28.2)(rolldown@1.2.13)(vite@8.3.4(@types/node@22.20.5)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.15)): dependencies: '@jridgewell/remapping': 2.3.5 + '@rolldown/pluginutils': 1.0.1 picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -7564,10 +7758,10 @@ snapshots: transitivePeerDependencies: - msw - vue-eslint-parser@10.4.1(eslint@10.13.0(jiti@2.7.0)): + vue-eslint-parser@10.4.1(eslint@10.14.0(jiti@2.7.0)): dependencies: debug: 4.4.3 - eslint: 10.13.0(jiti@2.7.0) + eslint: 10.14.0(jiti@2.7.0) eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 espree: 11.2.0