aboutsummaryrefslogtreecommitdiff
path: root/src/frontend
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2025-10-13 00:14:56 +0200
committerAriel Costas Guerrero <ariel@costas.dev>2025-10-13 00:14:56 +0200
commit2da9964e49e64c02767342d2de675b776e8e6cda (patch)
tree71bdae38ccf86afb01a673c9a9f3c90421b5b64c /src/frontend
parent497a2893465bf0cd84cf6d3cc9023daba336f253 (diff)
Use openfreemapinstead of self-hosting, improve stop display, improve dark mode
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/app/AppContext.tsx70
-rw-r--r--src/frontend/app/i18n/locales/en-GB.json5
-rw-r--r--src/frontend/app/i18n/locales/es-ES.json5
-rw-r--r--src/frontend/app/i18n/locales/gl-ES.json5
-rw-r--r--src/frontend/app/maps/styleloader.ts15
-rw-r--r--src/frontend/app/root.css3
-rw-r--r--src/frontend/app/routes/map.tsx26
-rw-r--r--src/frontend/app/routes/settings.css1
-rw-r--r--src/frontend/app/routes/settings.tsx8
-rw-r--r--src/frontend/public/maps/styles/openfreemap-any.json5976
-rw-r--r--src/frontend/public/pwa-worker.js2
11 files changed, 6091 insertions, 25 deletions
diff --git a/src/frontend/app/AppContext.tsx b/src/frontend/app/AppContext.tsx
index e6d8971..9013463 100644
--- a/src/frontend/app/AppContext.tsx
+++ b/src/frontend/app/AppContext.tsx
@@ -8,7 +8,7 @@ import {
} from "react";
import { type LngLatLike } from "maplibre-gl";
-type Theme = "light" | "dark";
+export type Theme = "light" | "dark" | "system";
type TableStyle = "regular" | "grouped";
type MapPositionMode = "gps" | "last";
@@ -47,23 +47,75 @@ const AppContext = createContext<AppContextProps | undefined>(undefined);
export const AppProvider = ({ children }: { children: ReactNode }) => {
//#region Theme
+ const getPreferredScheme = () => {
+ if (typeof window === "undefined" || !window.matchMedia) {
+ return "light" as const;
+ }
+ return window.matchMedia("(prefers-color-scheme: dark)").matches
+ ? "dark"
+ : "light";
+ };
+
+ const [systemTheme, setSystemTheme] = useState<"light" | "dark">(
+ getPreferredScheme,
+ );
+
const [theme, setTheme] = useState<Theme>(() => {
const savedTheme = localStorage.getItem("theme");
- if (savedTheme) {
- return savedTheme as Theme;
+ if (savedTheme === "light" || savedTheme === "dark" || savedTheme === "system") {
+ return savedTheme;
}
- const prefersDark =
- window.matchMedia &&
- window.matchMedia("(prefers-color-scheme: dark)").matches;
- return prefersDark ? "dark" : "light";
+ return "system";
});
+ useEffect(() => {
+ if (typeof window === "undefined" || !window.matchMedia) {
+ return;
+ }
+
+ const media = window.matchMedia("(prefers-color-scheme: dark)");
+ const handleChange = (event: MediaQueryListEvent) => {
+ setSystemTheme(event.matches ? "dark" : "light");
+ };
+
+ // Sync immediately in case theme changed before subscription
+ setSystemTheme(media.matches ? "dark" : "light");
+
+ if (media.addEventListener) {
+ media.addEventListener("change", handleChange);
+ } else {
+ media.addListener(handleChange);
+ }
+
+ return () => {
+ if (media.removeEventListener) {
+ media.removeEventListener("change", handleChange);
+ } else {
+ media.removeListener(handleChange);
+ }
+ };
+ }, []);
+
+ const resolvedTheme = theme === "system" ? systemTheme : theme;
+
const toggleTheme = () => {
- setTheme((prevTheme) => (prevTheme === "light" ? "dark" : "light"));
+ setTheme((prevTheme) => {
+ if (prevTheme === "light") {
+ return "dark";
+ }
+ if (prevTheme === "dark") {
+ return "system";
+ }
+ return "light";
+ });
};
useEffect(() => {
- document.documentElement.setAttribute("data-theme", theme);
+ document.documentElement.setAttribute("data-theme", resolvedTheme);
+ document.documentElement.style.colorScheme = resolvedTheme;
+ }, [resolvedTheme]);
+
+ useEffect(() => {
localStorage.setItem("theme", theme);
}, [theme]);
//#endregion
diff --git a/src/frontend/app/i18n/locales/en-GB.json b/src/frontend/app/i18n/locales/en-GB.json
index ee8ec7a..4d0c91b 100644
--- a/src/frontend/app/i18n/locales/en-GB.json
+++ b/src/frontend/app/i18n/locales/en-GB.json
@@ -9,8 +9,9 @@
"data_source_middle": "under license",
"settings": "Settings",
"theme": "Mode:",
- "theme_light": "Light",
- "theme_dark": "Dark",
+ "theme_light": "Light",
+ "theme_dark": "Dark",
+ "theme_system": "System",
"table_style": "Table style:",
"table_style_regular": "Show in order",
"table_style_grouped": "Group by line",
diff --git a/src/frontend/app/i18n/locales/es-ES.json b/src/frontend/app/i18n/locales/es-ES.json
index a152564..0915361 100644
--- a/src/frontend/app/i18n/locales/es-ES.json
+++ b/src/frontend/app/i18n/locales/es-ES.json
@@ -9,8 +9,9 @@
"data_source_middle": "bajo licencia",
"settings": "Ajustes",
"theme": "Modo:",
- "theme_light": "Claro",
- "theme_dark": "Oscuro",
+ "theme_light": "Claro",
+ "theme_dark": "Oscuro",
+ "theme_system": "Sistema",
"table_style": "Estilo de tabla:",
"table_style_regular": "Mostrar por orden",
"table_style_grouped": "Agrupar por línea",
diff --git a/src/frontend/app/i18n/locales/gl-ES.json b/src/frontend/app/i18n/locales/gl-ES.json
index b683fc0..8949333 100644
--- a/src/frontend/app/i18n/locales/gl-ES.json
+++ b/src/frontend/app/i18n/locales/gl-ES.json
@@ -9,8 +9,9 @@
"data_source_middle": "baixo licenza",
"settings": "Axustes",
"theme": "Modo:",
- "theme_light": "Claro",
- "theme_dark": "Escuro",
+ "theme_light": "Claro",
+ "theme_dark": "Escuro",
+ "theme_system": "Sistema",
"table_style": "Estilo de táboa:",
"table_style_regular": "Mostrar por orde",
"table_style_grouped": "Agrupar por liña",
diff --git a/src/frontend/app/maps/styleloader.ts b/src/frontend/app/maps/styleloader.ts
index cf285a5..08086f1 100644
--- a/src/frontend/app/maps/styleloader.ts
+++ b/src/frontend/app/maps/styleloader.ts
@@ -1,9 +1,22 @@
import type { StyleSpecification } from "react-map-gl/maplibre";
+import type { Theme } from "~/AppContext";
export async function loadStyle(
styleName: string,
- colorScheme: string,
+ colorScheme: Theme,
): Promise<StyleSpecification> {
+ if (styleName == "openfreemap") {
+ const url = "/maps/styles/openfreemap-any.json";
+
+ const resp = await fetch(url);
+ if (!resp.ok) {
+ throw new Error(`Failed to load style: ${url}`);
+ }
+
+ const style = await resp.json();
+ return style as StyleSpecification;
+ }
+
const stylePath = `/maps/styles/${styleName}-${colorScheme}.json`;
const resp = await fetch(stylePath);
diff --git a/src/frontend/app/root.css b/src/frontend/app/root.css
index b77f44d..202e6f1 100644
--- a/src/frontend/app/root.css
+++ b/src/frontend/app/root.css
@@ -10,6 +10,7 @@
--star-color: #ffcc00;
--message-background-color: #f8f9fa;
+ color-scheme: light;
font-family: "Roboto Variable", Roboto, Arial, sans-serif;
}
@@ -24,6 +25,8 @@
--button-disabled-background-color: #555555;
--star-color: #ffcc00;
--message-background-color: #333333;
+
+ color-scheme: dark;
}
body {
diff --git a/src/frontend/app/routes/map.tsx b/src/frontend/app/routes/map.tsx
index 5887b9c..56a9c79 100644
--- a/src/frontend/app/routes/map.tsx
+++ b/src/frontend/app/routes/map.tsx
@@ -73,7 +73,8 @@ export default function StopMap() {
}, []);
useEffect(() => {
- const styleName = "carto";
+ //const styleName = "carto";
+ const styleName = "openfreemap";
loadStyle(styleName, theme)
.then((style) => setMapStyle(style))
.catch((error) => console.error("Failed to load map style:", error));
@@ -158,12 +159,33 @@ export default function StopMap() {
source="stops-source"
layout={{
"icon-image": "stop",
- "icon-size": ["interpolate", ["linear"], ["zoom"], 11, 0.4, 16, 0.8],
+ "icon-size": ["interpolate", ["linear"], ["zoom"], 11, 0.4, 18, 0.8],
"icon-allow-overlap": true,
"icon-ignore-placement": true,
}}
/>
+ <Layer
+ id="stops-label"
+ type="symbol"
+ source="stops-source"
+ minzoom={16}
+ layout={{
+ "text-field": ["get", "name"],
+ "text-font": ["Noto Sans Regular"],
+ "text-offset": [0, 2.5],
+ "text-anchor": "center",
+ "text-justify": "center",
+ "text-size": ["interpolate", ["linear"], ["zoom"], 11, 8, 22, 14]
+ }}
+ paint={{
+ "text-color": "#45a15a",
+ "text-halo-color": "#fff",
+ "text-halo-width": 1.5
+ }}
+ />
+
+
{selectedStop && (
<StopSheet
isOpen={isSheetOpen}
diff --git a/src/frontend/app/routes/settings.css b/src/frontend/app/routes/settings.css
index 47de391..ef9fbd5 100644
--- a/src/frontend/app/routes/settings.css
+++ b/src/frontend/app/routes/settings.css
@@ -51,7 +51,6 @@
margin-left: 0.5em;
padding: 0.5rem;
font-size: 1rem;
- border: 1px solid var(--border-color);
border-radius: 8px;
}
diff --git a/src/frontend/app/routes/settings.tsx b/src/frontend/app/routes/settings.tsx
index 3bc3492..bcda311 100644
--- a/src/frontend/app/routes/settings.tsx
+++ b/src/frontend/app/routes/settings.tsx
@@ -1,4 +1,4 @@
-import { useApp } from "../AppContext";
+import { type Theme, useApp } from "../AppContext";
import "./settings.css";
import { useTranslation } from "react-i18next";
import { useState } from "react";
@@ -14,9 +14,6 @@ export default function Settings() {
setMapPositionMode,
} = useApp();
- const [isCheckingUpdates, setIsCheckingUpdates] = useState(false);
- const [updateMessage, setUpdateMessage] = useState<string | null>(null);
-
return (
<div className="page-container">
<h1 className="page-title">{t("about.title")}</h1>
@@ -31,10 +28,11 @@ export default function Settings() {
id="theme"
className="form-select-inline"
value={theme}
- onChange={(e) => setTheme(e.target.value as "light" | "dark")}
+ onChange={(e) => setTheme(e.target.value as Theme)}
>
<option value="light">{t("about.theme_light")}</option>
<option value="dark">{t("about.theme_dark")}</option>
+ <option value="system">{t("about.theme_system")}</option>
</select>
</div>
<div className="settings-content-inline">
diff --git a/src/frontend/public/maps/styles/openfreemap-any.json b/src/frontend/public/maps/styles/openfreemap-any.json
new file mode 100644
index 0000000..d279f8c
--- /dev/null
+++ b/src/frontend/public/maps/styles/openfreemap-any.json
@@ -0,0 +1,5976 @@
+{
+ "version": 8,
+ "sources": {
+ "openmaptiles": {
+ "type": "vector",
+ "url": "https://tiles.openfreemap.org/planet"
+ }
+ },
+ "sprite": "https://tiles.openfreemap.org/sprites/ofm_f384/ofm",
+ "glyphs": "https://tiles.openfreemap.org/fonts/{fontstack}/{range}.pbf",
+ "layers": [
+ {
+ "id": "background",
+ "type": "background",
+ "paint": {
+ "background-color": "#f8f4f0"
+ }
+ },
+ {
+ "id": "landcover-glacier",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landcover",
+ "filter": [
+ "==",
+ [
+ "get",
+ "subclass"
+ ],
+ "glacier"
+ ],
+ "paint": {
+ "fill-color": "#fff",
+ "fill-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 0, 0.9, 10, 0.3]
+ }
+ },
+ {
+ "id": "landuse-residential",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "neighbourhood",
+ "residential"
+ ],
+ true, false],
+ "paint": {
+ "fill-color": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 12, "hsla(30,19%,90%,0.4)",
+ 16, "hsla(30,19%,90%,0.2)"
+ ]
+ }
+ },
+ {
+ "id": "landuse-suburb",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "maxzoom": 10,
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "suburb"
+ ],
+ "paint": {
+ "fill-color": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 8, "hsla(30,19%,90%,0.4)",
+ 10, "hsla(30,19%,90%,0.0)"
+ ]
+ }
+ },
+ {
+ "id": "landuse-commercial",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPolygon",
+ "Polygon"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "commercial"
+ ]
+ ],
+ "paint": {
+ "fill-color": "hsla(0,60%,87%,0.23)"
+ }
+ },
+ {
+ "id": "landuse-industrial",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPolygon",
+ "Polygon"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "dam",
+ "garages",
+ "industrial"
+ ],
+ true, false]
+ ],
+ "paint": {
+ "fill-color": "hsla(49,100%,88%,0.34)"
+ }
+ },
+ {
+ "id": "landuse-cemetery",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "cemetery"
+ ],
+ "paint": {
+ "fill-color": "#e0e4dd"
+ }
+ },
+ {
+ "id": "landuse-hospital",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "hospital"
+ ],
+ "paint": {
+ "fill-color": "#fde"
+ }
+ },
+ {
+ "id": "landuse-school",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "school"
+ ],
+ "paint": {
+ "fill-color": "#f0e8f8"
+ }
+ },
+ {
+ "id": "landuse-railway",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landuse",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "railway"
+ ],
+ "paint": {
+ "fill-color": "hsla(30,19%,90%,0.4)"
+ }
+ },
+ {
+ "id": "park",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "park",
+ "filter": [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPolygon",
+ "Polygon"
+ ],
+ true, false],
+ "paint": {
+ "fill-color": "#d8e8c8",
+ "fill-opacity": [
+ "interpolate",
+ [
+ "exponential",
+ 1.8],
+ [
+ "zoom"
+ ],
+ 9, 0.5, 12, 0.2]
+ }
+ },
+ {
+ "id": "landcover-wood",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landcover",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "wood"
+ ],
+ "paint": {
+ "fill-antialias": [
+ "step",
+ [
+ "zoom"
+ ],
+ false, 9, true],
+ "fill-color": "#6a4",
+ "fill-opacity": 0.1,
+ "fill-outline-color": "hsla(0,0%,0%,0.03)"
+ }
+ },
+ {
+ "id": "landcover-grass",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landcover",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "grass"
+ ],
+ "paint": {
+ "fill-color": "#d8e8c8",
+ "fill-opacity": 1
+ }
+ },
+ {
+ "id": "landcover-grass-park",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "park",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "public_park"
+ ],
+ "paint": {
+ "fill-color": "#d8e8c8",
+ "fill-opacity": 0.8
+ }
+ },
+ {
+ "id": "waterway_tunnel",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "minzoom": 14,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "canal",
+ "river",
+ "stream"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-dasharray": [2, 4],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.3],
+ [
+ "zoom"
+ ],
+ 13, 0.5, 20, 6]
+ }
+ },
+ {
+ "id": "waterway-other",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "canal",
+ "river",
+ "stream"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "intermittent"
+ ],
+ 0]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.3],
+ [
+ "zoom"
+ ],
+ 13, 0.5, 20, 2]
+ }
+ },
+ {
+ "id": "waterway-other-intermittent",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "canal",
+ "river",
+ "stream"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "intermittent"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-dasharray": [4, 3],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.3],
+ [
+ "zoom"
+ ],
+ 13, 0.5, 20, 2]
+ }
+ },
+ {
+ "id": "waterway-stream-canal",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "canal",
+ "stream"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "intermittent"
+ ],
+ 0]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.3],
+ [
+ "zoom"
+ ],
+ 13, 0.5, 20, 6]
+ }
+ },
+ {
+ "id": "waterway-stream-canal-intermittent",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "canal",
+ "stream"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "intermittent"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-dasharray": [4, 3],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.3],
+ [
+ "zoom"
+ ],
+ 13, 0.5, 20, 6]
+ }
+ },
+ {
+ "id": "waterway-river",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "river"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "intermittent"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 10, 0.8, 20, 6]
+ }
+ },
+ {
+ "id": "waterway-river-intermittent",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "river"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "intermittent"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "#a0c8f0",
+ "line-dasharray": [3, 2.5],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 10, 0.8, 20, 6]
+ }
+ },
+ {
+ "id": "water",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "water",
+ "filter": [
+ "all",
+ [
+ "!=",
+ [
+ "get",
+ "intermittent"
+ ],
+ 1],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ]
+ ],
+ "paint": {
+ "fill-color": "#AECFE2"
+ }
+ },
+ {
+ "id": "water-intermittent",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "water",
+ "filter": [
+ "==",
+ [
+ "get",
+ "intermittent"
+ ],
+ 1],
+ "paint": {
+ "fill-color": "hsl(210,67%,85%)",
+ "fill-opacity": 0.7
+ }
+ },
+ {
+ "id": "landcover-ice-shelf",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landcover",
+ "filter": [
+ "==",
+ [
+ "get",
+ "subclass"
+ ],
+ "ice_shelf"
+ ],
+ "paint": {
+ "fill-color": "#fff",
+ "fill-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 0, 0.9, 10, 0.3]
+ }
+ },
+ {
+ "id": "landcover-sand",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "landcover",
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "sand"
+ ],
+ "paint": {
+ "fill-color": "rgba(245, 238, 188, 1)",
+ "fill-opacity": 1
+ }
+ },
+ {
+ "id": "building",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "building",
+ "paint": {
+ "fill-antialias": true,
+ "fill-color": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 15.5, "#f2eae2",
+ 16, "#dfdbd7"
+ ]
+ }
+ },
+ {
+ "id": "building-top",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "building",
+ "paint": {
+ "fill-color": "#f2eae2",
+ "fill-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 13, 0, 16, 1],
+ "fill-outline-color": "#dfdbd7",
+ "fill-translate": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 14, [
+ "literal",
+ [0, 0]
+ ],
+ 16, [
+ "literal",
+ [-2, -2]
+ ]
+ ]
+ }
+ },
+ {
+ "id": "tunnel-service-track-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#cfcdca",
+ "line-dasharray": [0.5, 0.25],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15, 1, 16, 4, 20, 11]
+ }
+ },
+ {
+ "id": "tunnel-motorway-link-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(200, 147, 102, 1)",
+ "line-dasharray": [0.5, 0.25],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 1, 13, 3, 14, 4, 20, 15]
+ }
+ },
+ {
+ "id": "tunnel-minor-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "minor"
+ ]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#cfcdca",
+ "line-dasharray": [0.5, 0.25],
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 12, 0, 12.5, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 0.5, 13, 1, 14, 4, 20, 15]
+ }
+ },
+ {
+ "id": "tunnel-link-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-dasharray": [0.5, 0.25],
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 1, 13, 3, 14, 4, 20, 15]
+ }
+ },
+ {
+ "id": "tunnel-secondary-tertiary-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "secondary",
+ "tertiary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-dasharray": [0.5, 0.25],
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 8, 1.5, 20, 17]
+ }
+ },
+ {
+ "id": "tunnel-trunk-primary-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 5, 0.4, 6, 0.6, 7, 1.5, 20, 22]
+ }
+ },
+ {
+ "id": "tunnel-motorway-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-dasharray": [0.5, 0.25],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 5, 0.4, 6, 0.6, 7, 1.5, 20, 22]
+ }
+ },
+ {
+ "id": "tunnel-path",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "path"
+ ]
+ ],
+ "paint": {
+ "line-color": "#cba",
+ "line-dasharray": [1.5, 0.75],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15, 1.2, 20, 4]
+ }
+ },
+ {
+ "id": "tunnel-motorway-link",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(244, 209, 158, 1)",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12.5, 0, 13, 1.5, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "tunnel-service-track",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15.5, 0, 16, 2, 20, 7.5]
+ }
+ },
+ {
+ "id": "tunnel-link",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff4c6",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12.5, 0, 13, 1.5, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "tunnel-minor",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "minor"
+ ]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 13.5, 0, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "tunnel-secondary-tertiary",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "secondary",
+ "tertiary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff4c6",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 10]
+ }
+ },
+ {
+ "id": "tunnel-trunk-primary",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff4c6",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "tunnel-motorway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#ffdaa6",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "tunnel-railway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ]
+ ],
+ "paint": {
+ "line-color": "#bbb",
+ "line-dasharray": [2, 2],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14, 0.4, 15, 0.75, 20, 2]
+ }
+ },
+ {
+ "id": "ferry",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "ferry"
+ ],
+ true, false],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(108, 159, 182, 1)",
+ "line-dasharray": [2, 2],
+ "line-width": 1.1
+ }
+ },
+ {
+ "id": "aeroway-taxiway-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "aeroway",
+ "minzoom": 12,
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "taxiway"
+ ],
+ true, false],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(153, 153, 153, 1)",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.5],
+ [
+ "zoom"
+ ],
+ 11, 2, 17, 12]
+ }
+ },
+ {
+ "id": "aeroway-runway-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "aeroway",
+ "minzoom": 12,
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "runway"
+ ],
+ true, false],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(153, 153, 153, 1)",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.5],
+ [
+ "zoom"
+ ],
+ 11, 5, 17, 55]
+ }
+ },
+ {
+ "id": "aeroway-area",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "aeroway",
+ "minzoom": 4,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPolygon",
+ "Polygon"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "runway",
+ "taxiway"
+ ],
+ true, false]
+ ],
+ "paint": {
+ "fill-color": "rgba(255, 255, 255, 1)",
+ "fill-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 13, 0, 14, 1]
+ }
+ },
+ {
+ "id": "aeroway-taxiway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "aeroway",
+ "minzoom": 4,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "taxiway"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(255, 255, 255, 1)",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 11, 0, 12, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.5],
+ [
+ "zoom"
+ ],
+ 11, 1, 17, 10]
+ }
+ },
+ {
+ "id": "aeroway-runway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "aeroway",
+ "minzoom": 4,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "runway"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "rgba(255, 255, 255, 1)",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 11, 0, 12, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.5],
+ [
+ "zoom"
+ ],
+ 11, 4, 17, 50]
+ }
+ },
+ {
+ "id": "road_area_pier",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPolygon",
+ "Polygon"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "pier"
+ ]
+ ],
+ "paint": {
+ "fill-antialias": true,
+ "fill-color": "#f8f4f0"
+ }
+ },
+ {
+ "id": "road_pier",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "pier"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#f8f4f0",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15, 1, 17, 4]
+ }
+ },
+ {
+ "id": "highway-area",
+ "type": "fill",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPolygon",
+ "Polygon"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "pier"
+ ],
+ false, true]
+ ],
+ "paint": {
+ "fill-antialias": false,
+ "fill-color": "hsla(0,0%,89%,0.56)",
+ "fill-opacity": 0.9,
+ "fill-outline-color": "#cfcdca"
+ }
+ },
+ {
+ "id": "highway-motorway-link-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 1, 13, 3, 14, 4, 20, 15]
+ }
+ },
+ {
+ "id": "highway-link-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 13,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 1, 13, 3, 14, 4, 20, 15]
+ }
+ },
+ {
+ "id": "highway-minor-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#cfcdca",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 12, 0, 12.5, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 0.5, 13, 1, 14, 4, 20, 15]
+ }
+ },
+ {
+ "id": "highway-secondary-tertiary-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "secondary",
+ "tertiary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 8, 1.5, 20, 17]
+ }
+ },
+ {
+ "id": "highway-primary-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 5,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 7, 0, 8, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 7, 0, 8, 0.6, 9, 1.5, 20, 22]
+ }
+ },
+ {
+ "id": "highway-trunk-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 5,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "trunk"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 5, 0, 6, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 5, 0, 6, 0.6, 7, 1.5, 20, 22]
+ }
+ },
+ {
+ "id": "highway-motorway-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 4,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 4, 0, 5, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 4, 0, 5, 0.4, 6, 0.6, 7, 1.5, 20, 22]
+ }
+ },
+ {
+ "id": "highway-path",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "path"
+ ]
+ ],
+ "paint": {
+ "line-color": "#cba",
+ "line-dasharray": [1.5, 0.75],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15, 1.2, 20, 4]
+ }
+ },
+ {
+ "id": "highway-motorway-link",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 12,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fc8",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12.5, 0, 13, 1.5, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "highway-link",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 13,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12.5, 0, 13, 1.5, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "highway-minor",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "brunnel"
+ ],
+ "tunnel"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 13.5, 0, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "highway-secondary-tertiary",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "secondary",
+ "tertiary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 8, 0.5, 20, 13]
+ }
+ },
+ {
+ "id": "highway-primary",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 8.5, 0, 9, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "highway-trunk",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "trunk"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "highway-motorway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 5,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fc8",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "railway-transit",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "transit"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "tunnel"
+ ],
+ false, true]
+ ],
+ "paint": {
+ "line-color": "hsla(0,0%,73%,0.77)",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14, 0.4, 20, 1]
+ }
+ },
+ {
+ "id": "railway-transit-hatching",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "transit"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "tunnel"
+ ],
+ false, true]
+ ],
+ "paint": {
+ "line-color": "hsla(0,0%,73%,0.68)",
+ "line-dasharray": [0.2, 8],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14.5, 0, 15, 2, 20, 6]
+ }
+ },
+ {
+ "id": "railway-service",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ],
+ [
+ "has",
+ "service"
+ ]
+ ],
+ "paint": {
+ "line-color": "hsla(0,0%,73%,0.77)",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14, 0.4, 20, 1]
+ }
+ },
+ {
+ "id": "railway-service-hatching",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ],
+ [
+ "has",
+ "service"
+ ]
+ ],
+ "paint": {
+ "line-color": "hsla(0,0%,73%,0.68)",
+ "line-dasharray": [0.2, 8],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14.5, 0, 15, 2, 20, 6]
+ }
+ },
+ {
+ "id": "railway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "!",
+ [
+ "has",
+ "service"
+ ]
+ ],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ]
+ ],
+ "paint": {
+ "line-color": "#bbb",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14, 0.4, 15, 0.75, 20, 2]
+ }
+ },
+ {
+ "id": "railway-hatching",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "!",
+ [
+ "has",
+ "service"
+ ]
+ ],
+ [
+ "match",
+ [
+ "get",
+ "brunnel"
+ ],
+ [
+ "bridge",
+ "tunnel"
+ ],
+ false, true],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ]
+ ],
+ "paint": {
+ "line-color": "#bbb",
+ "line-dasharray": [0.2, 8],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14.5, 0, 15, 3, 20, 8]
+ }
+ },
+ {
+ "id": "bridge-motorway-link-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 1, 13, 3, 14, 4, 20, 19]
+ }
+ },
+ {
+ "id": "bridge-link-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 1, 13, 3, 14, 4, 20, 19]
+ }
+ },
+ {
+ "id": "bridge-secondary-tertiary-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "secondary",
+ "tertiary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 5, 0.4, 7, 0.6, 8, 1.5, 20, 21]
+ }
+ },
+ {
+ "id": "bridge-trunk-primary-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "hsl(28,76%,67%)",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 5, 0.4, 6, 0.6, 7, 1.5, 20, 26]
+ }
+ },
+ {
+ "id": "bridge-motorway-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#e9ac77",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 5, 0.4, 6, 0.6, 7, 1.5, 20, 26]
+ }
+ },
+ {
+ "id": "bridge-minor-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "butt",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#cfcdca",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 12, 0, 12.5, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12, 0.5, 13, 1, 14, 6, 20, 24]
+ }
+ },
+ {
+ "id": "bridge-path-casing",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "path"
+ ]
+ ],
+ "paint": {
+ "line-color": "#f8f4f0",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15, 1.2, 20, 18]
+ }
+ },
+ {
+ "id": "bridge-path",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "path"
+ ]
+ ],
+ "paint": {
+ "line-color": "#cba",
+ "line-dasharray": [1.5, 0.75],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 15, 1.2, 20, 4]
+ }
+ },
+ {
+ "id": "bridge-motorway-link",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fc8",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12.5, 0, 13, 1.5, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "bridge-link",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 12.5, 0, 13, 1.5, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "bridge-minor",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fff",
+ "line-opacity": 1,
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 13.5, 0, 14, 2.5, 20, 11.5]
+ }
+ },
+ {
+ "id": "bridge-secondary-tertiary",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "secondary",
+ "tertiary"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 8, 0.5, 20, 13]
+ }
+ },
+ {
+ "id": "bridge-trunk-primary",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "trunk"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fea",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "bridge-motorway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "motorway"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "ramp"
+ ],
+ 1]
+ ],
+ "layout": {
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "#fc8",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 6.5, 0, 7, 0.5, 20, 18]
+ }
+ },
+ {
+ "id": "bridge-railway",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ]
+ ],
+ "paint": {
+ "line-color": "#bbb",
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14, 0.4, 15, 0.75, 20, 2]
+ }
+ },
+ {
+ "id": "bridge-railway-hatching",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "brunnel"
+ ],
+ "bridge"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "rail"
+ ]
+ ],
+ "paint": {
+ "line-color": "#bbb",
+ "line-dasharray": [0.2, 8],
+ "line-width": [
+ "interpolate",
+ [
+ "exponential",
+ 1.4],
+ [
+ "zoom"
+ ],
+ 14.5, 0, 15, 3, 20, 8]
+ }
+ },
+ {
+ "id": "cablecar",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 13,
+ "filter": [
+ "==",
+ [
+ "get",
+ "subclass"
+ ],
+ "cable_car"
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "hsl(0,0%,70%)",
+ "line-width": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 11, 1, 19, 2.5]
+ }
+ },
+ {
+ "id": "cablecar-dash",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 13,
+ "filter": [
+ "==",
+ [
+ "get",
+ "subclass"
+ ],
+ "cable_car"
+ ],
+ "layout": {
+ "line-cap": "round"
+ },
+ "paint": {
+ "line-color": "hsl(0,0%,70%)",
+ "line-dasharray": [2, 3],
+ "line-width": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 11, 3, 19, 5.5]
+ }
+ },
+ {
+ "id": "boundary_3",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "boundary",
+ "minzoom": 5,
+ "filter": [
+ "all",
+ [
+ "\u003E=",
+ [
+ "get",
+ "admin_level"
+ ],
+ 3],
+ [
+ "\u003C=",
+ [
+ "get",
+ "admin_level"
+ ],
+ 6],
+ [
+ "!=",
+ [
+ "get",
+ "maritime"
+ ],
+ 1],
+ [
+ "!=",
+ [
+ "get",
+ "disputed"
+ ],
+ 1],
+ [
+ "!",
+ [
+ "has",
+ "claimed_by"
+ ]
+ ]
+ ],
+ "paint": {
+ "line-color": "hsl(0,0%,70%)",
+ "line-dasharray": [1, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "linear",
+ 1],
+ [
+ "zoom"
+ ],
+ 7, 1, 11, 2]
+ }
+ },
+ {
+ "id": "boundary_2",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "boundary",
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "admin_level"
+ ],
+ 2],
+ [
+ "!=",
+ [
+ "get",
+ "maritime"
+ ],
+ 1],
+ [
+ "!=",
+ [
+ "get",
+ "disputed"
+ ],
+ 1],
+ [
+ "!",
+ [
+ "has",
+ "claimed_by"
+ ]
+ ]
+ ],
+ "layout": {
+ "line-cap": "round",
+ "line-join": "round"
+ },
+ "paint": {
+ "line-color": "hsl(248,7%,66%)",
+ "line-opacity": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 0, 0.4, 4, 1],
+ "line-width": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 3, 1, 5, 1.2, 12, 3]
+ }
+ },
+ {
+ "id": "boundary_disputed",
+ "type": "line",
+ "source": "openmaptiles",
+ "source-layer": "boundary",
+ "filter": [
+ "all",
+ [
+ "!=",
+ [
+ "get",
+ "maritime"
+ ],
+ 1],
+ [
+ "==",
+ [
+ "get",
+ "disputed"
+ ],
+ 1]
+ ],
+ "paint": {
+ "line-color": "hsl(248,7%,66%)",
+ "line-dasharray": [1, 2],
+ "line-width": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 3, 1, 5, 1.2, 12, 3]
+ }
+ },
+ {
+ "id": "road_oneway",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 15,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "oneway"
+ ],
+ 1],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "motorway",
+ "primary",
+ "secondary",
+ "service",
+ "tertiary",
+ "trunk"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "icon-image": "oneway",
+ "icon-padding": 2,
+ "icon-rotate": 90,
+ "icon-rotation-alignment": "map",
+ "icon-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 15, 0.5, 19, 1],
+ "symbol-placement": "line",
+ "symbol-spacing": 75
+ },
+ "paint": {
+ "icon-opacity": 0.5
+ }
+ },
+ {
+ "id": "road_oneway_opposite",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation",
+ "minzoom": 15,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "oneway"
+ ],
+ -1],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "motorway",
+ "primary",
+ "secondary",
+ "service",
+ "tertiary",
+ "trunk"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "icon-image": "oneway",
+ "icon-padding": 2,
+ "icon-rotate": -90,
+ "icon-rotation-alignment": "map",
+ "icon-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 15, 0.5, 19, 1],
+ "symbol-placement": "line",
+ "symbol-spacing": 75
+ },
+ "paint": {
+ "icon-opacity": 0.5
+ }
+ },
+ {
+ "id": "waterway_line_label",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "waterway",
+ "minzoom": 10,
+ "filter": [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ "layout": {
+ "symbol-placement": "line",
+ "symbol-spacing": 350,
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ " ",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-letter-spacing": 0.2,
+ "text-max-width": 5,
+ "text-size": 14
+ },
+ "paint": {
+ "text-color": "#74aee9",
+ "text-halo-color": "rgba(255,255,255,0.7)",
+ "text-halo-width": 1.5
+ }
+ },
+ {
+ "id": "water_name_point_label",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "water_name",
+ "filter": [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPoint",
+ "Point"
+ ],
+ true, false],
+ "layout": {
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-letter-spacing": 0.2,
+ "text-max-width": 5,
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 0, 10, 8, 14]
+ },
+ "paint": {
+ "text-color": "#495e91",
+ "text-halo-color": "rgba(255,255,255,0.7)",
+ "text-halo-width": 1.5
+ }
+ },
+ {
+ "id": "water_name_line_label",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "water_name",
+ "filter": [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ "layout": {
+ "symbol-placement": "line",
+ "symbol-spacing": 350,
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ " ",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-letter-spacing": 0.2,
+ "text-max-width": 5,
+ "text-size": 14
+ },
+ "paint": {
+ "text-color": "#495e91",
+ "text-halo-color": "rgba(255,255,255,0.7)",
+ "text-halo-width": 1.5
+ }
+ },
+ {
+ "id": "poi_r20",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "poi",
+ "minzoom": 17,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPoint",
+ "Point"
+ ],
+ true, false],
+ [
+ "\u003E=",
+ [
+ "get",
+ "rank"
+ ],
+ 20]
+ ],
+ "layout": {
+ "icon-image": [
+ "match",
+ [
+ "get",
+ "subclass"
+ ],
+ [
+ "florist",
+ "furniture"
+ ],
+ [
+ "get",
+ "subclass"
+ ],
+ [
+ "get",
+ "class"
+ ]
+ ],
+ "text-anchor": "top",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-max-width": 9,
+ "text-offset": [0, 0.6],
+ "text-size": 12
+ },
+ "paint": {
+ "text-color": "#666",
+ "text-halo-blur": 0.5,
+ "text-halo-color": "#ffffff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "poi_r7",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "poi",
+ "minzoom": 16,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPoint",
+ "Point"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "class"
+ ], "bus"],
+ [
+ "\u003E=",
+ [
+ "get",
+ "rank"
+ ],
+ 7],
+ [
+ "\u003C",
+ [
+ "get",
+ "rank"
+ ],
+ 20]
+ ],
+ "layout": {
+ "icon-image": [
+ "match",
+ [
+ "get",
+ "subclass"
+ ],
+ [
+ "florist",
+ "furniture"
+ ],
+ [
+ "get",
+ "subclass"
+ ],
+ [
+ "get",
+ "class"
+ ]
+ ],
+ "text-anchor": "top",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-max-width": 9,
+ "text-offset": [0, 0.6],
+ "text-size": 12
+ },
+ "paint": {
+ "text-color": "#666",
+ "text-halo-blur": 0.5,
+ "text-halo-color": "#ffffff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "poi_r1",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "poi",
+ "minzoom": 15,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "MultiPoint",
+ "Point"
+ ],
+ true, false],
+ [
+ "!=",
+ [
+ "get",
+ "class"
+ ], "bus"],
+ [
+ "!=",
+ [
+ "get",
+ "class"
+ ], "bus"],
+ [
+ "\u003E=",
+ [
+ "get",
+ "rank"
+ ],
+ 1],
+ [
+ "\u003C",
+ [
+ "get",
+ "rank"
+ ],
+ 7]
+ ],
+ "layout": {
+ "icon-image": [
+ "match",
+ [
+ "get",
+ "subclass"
+ ],
+ [
+ "florist",
+ "furniture"
+ ],
+ [
+ "get",
+ "subclass"
+ ],
+ [
+ "get",
+ "class"
+ ]
+ ],
+ "text-anchor": "top",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-max-width": 9,
+ "text-offset": [0, 0.6],
+ "text-size": 12
+ },
+ "paint": {
+ "text-color": "#666",
+ "text-halo-blur": 0.5,
+ "text-halo-color": "#ffffff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "poi_transit",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "poi",
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "airport",
+ "rail"
+ ],
+ true, false],
+ "layout": {
+ "icon-image": [
+ "to-string",
+ [
+ "get",
+ "class"
+ ]
+ ],
+ "icon-size": 0.7,
+ "text-anchor": "left",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-max-width": 9,
+ "text-offset": [0.9, 0],
+ "text-size": 12
+ },
+ "paint": {
+ "text-color": "#2e5a80",
+ "text-halo-blur": 0.5,
+ "text-halo-color": "#ffffff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "highway-name-path",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation_name",
+ "minzoom": 15.5,
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "path"
+ ],
+ "layout": {
+ "symbol-placement": "line",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ " ",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-rotation-alignment": "map",
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 13, 12, 14, 13]
+ },
+ "paint": {
+ "text-color": "hsl(30,23%,62%)",
+ "text-halo-color": "#f8f4f0",
+ "text-halo-width": 0.5
+ }
+ },
+ {
+ "id": "highway-name-minor",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation_name",
+ "minzoom": 15,
+ "filter": [
+ "all",
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "minor",
+ "service",
+ "track"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "symbol-placement": "line",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ " ",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-rotation-alignment": "map",
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 13, 12, 14, 13]
+ },
+ "paint": {
+ "text-color": "#666",
+ "text-halo-blur": 0.5,
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "highway-name-major",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation_name",
+ "minzoom": 12.2,
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "primary",
+ "secondary",
+ "tertiary",
+ "trunk"
+ ],
+ true, false],
+ "layout": {
+ "symbol-placement": "line",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ " ",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-rotation-alignment": "map",
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 13, 12, 14, 13]
+ },
+ "paint": {
+ "text-color": "#666",
+ "text-halo-blur": 0.5,
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "highway-shield-non-us",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation_name",
+ "minzoom": 8,
+ "filter": [
+ "all",
+ [
+ "\u003C=",
+ [
+ "get",
+ "ref_length"
+ ],
+ 6],
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "network"
+ ],
+ [
+ "us-highway",
+ "us-interstate",
+ "us-state"
+ ],
+ false, true]
+ ],
+ "layout": {
+ "icon-image": [
+ "concat",
+ "road_",
+ [
+ "get",
+ "ref_length"
+ ]
+ ],
+ "icon-rotation-alignment": "viewport",
+ "icon-size": 1,
+ "symbol-placement": [
+ "step",
+ [
+ "zoom"
+ ],
+ "point",
+ 11, "line"
+ ],
+ "symbol-spacing": 200,
+ "text-field": [
+ "to-string",
+ [
+ "get",
+ "ref"
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-rotation-alignment": "viewport",
+ "text-size": 10
+ }
+ },
+ {
+ "id": "highway-shield-us-interstate",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation_name",
+ "minzoom": 7,
+ "filter": [
+ "all",
+ [
+ "\u003C=",
+ [
+ "get",
+ "ref_length"
+ ],
+ 6],
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "network"
+ ],
+ [
+ "us-interstate"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "icon-image": [
+ "concat",
+ [
+ "get",
+ "network"
+ ],
+ "_",
+ [
+ "get",
+ "ref_length"
+ ]
+ ],
+ "icon-rotation-alignment": "viewport",
+ "icon-size": 1,
+ "symbol-placement": [
+ "step",
+ [
+ "zoom"
+ ],
+ "point",
+ 7, "line",
+ 8, "line"
+ ],
+ "symbol-spacing": 200,
+ "text-field": [
+ "to-string",
+ [
+ "get",
+ "ref"
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-rotation-alignment": "viewport",
+ "text-size": 10
+ }
+ },
+ {
+ "id": "road_shield_us",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "transportation_name",
+ "minzoom": 9,
+ "filter": [
+ "all",
+ [
+ "\u003C=",
+ [
+ "get",
+ "ref_length"
+ ],
+ 6],
+ [
+ "match",
+ [
+ "geometry-type"
+ ],
+ [
+ "LineString",
+ "MultiLineString"
+ ],
+ true, false],
+ [
+ "match",
+ [
+ "get",
+ "network"
+ ],
+ [
+ "us-highway",
+ "us-state"
+ ],
+ true, false]
+ ],
+ "layout": {
+ "icon-image": [
+ "concat",
+ [
+ "get",
+ "network"
+ ],
+ "_",
+ [
+ "get",
+ "ref_length"
+ ]
+ ],
+ "icon-rotation-alignment": "viewport",
+ "icon-size": 1,
+ "symbol-placement": [
+ "step",
+ [
+ "zoom"
+ ],
+ "point",
+ 11, "line"
+ ],
+ "symbol-spacing": 200,
+ "text-field": [
+ "to-string",
+ [
+ "get",
+ "ref"
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-rotation-alignment": "viewport",
+ "text-size": 10
+ }
+ },
+ {
+ "id": "airport",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "aerodrome_label",
+ "minzoom": 10,
+ "filter": [
+ "all",
+ [
+ "has",
+ "iata"
+ ]
+ ],
+ "layout": {
+ "icon-image": "airport_11",
+ "icon-size": 1,
+ "text-anchor": "top",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-max-width": 9,
+ "text-offset": [0, 0.6],
+ "text-optional": true,
+ "text-padding": 2,
+ "text-size": 12
+ },
+ "paint": {
+ "text-color": "#666",
+ "text-halo-blur": 0.5,
+ "text-halo-color": "#ffffff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_other",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 8,
+ "filter": [
+ "match",
+ [
+ "get",
+ "class"
+ ],
+ [
+ "city",
+ "continent",
+ "country",
+ "state",
+ "town",
+ "village"
+ ],
+ false, true],
+ "layout": {
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-letter-spacing": 0.1,
+ "text-max-width": 9,
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 8, 9, 12, 10],
+ "text-transform": "uppercase"
+ },
+ "paint": {
+ "text-color": "#333",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_village",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 9,
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "village"
+ ],
+ "layout": {
+ "icon-allow-overlap": true,
+ "icon-image": [
+ "step",
+ [
+ "zoom"
+ ],
+ "circle_11_black",
+ 10, ""
+ ],
+ "icon-optional": false,
+ "icon-size": 0.2,
+ "text-anchor": "bottom",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-max-width": 8,
+ "text-size": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 7, 10, 11, 12]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_town",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 6,
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "town"
+ ],
+ "layout": {
+ "icon-allow-overlap": true,
+ "icon-image": [
+ "step",
+ [
+ "zoom"
+ ],
+ "circle_11_black",
+ 10, ""
+ ],
+ "icon-optional": false,
+ "icon-size": 0.2,
+ "text-anchor": "bottom",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-max-width": 8,
+ "text-size": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 7, 12, 11, 14]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_state",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 5,
+ "maxzoom": 8,
+ "filter": [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "state"
+ ],
+ "layout": {
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Italic"
+ ],
+ "text-letter-spacing": 0.2,
+ "text-max-width": 9,
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 5, 10, 8, 14],
+ "text-transform": "uppercase"
+ },
+ "paint": {
+ "text-color": "#333",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_city",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 3,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "city"
+ ],
+ [
+ "!=",
+ [
+ "get",
+ "capital"
+ ],
+ 2]
+ ],
+ "layout": {
+ "icon-allow-overlap": true,
+ "icon-image": [
+ "step",
+ [
+ "zoom"
+ ],
+ "circle_11_black",
+ 9, ""
+ ],
+ "icon-optional": false,
+ "icon-size": 0.4,
+ "text-anchor": "bottom",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Regular"
+ ],
+ "text-max-width": 8,
+ "text-offset": [0, -0.1],
+ "text-size": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 4, 11, 7, 13, 11, 18]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_city_capital",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 3,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "city"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "capital"
+ ],
+ 2]
+ ],
+ "layout": {
+ "icon-allow-overlap": true,
+ "icon-image": [
+ "step",
+ [
+ "zoom"
+ ],
+ "circle_11_black",
+ 9, ""
+ ],
+ "icon-optional": false,
+ "icon-size": 0.5,
+ "text-anchor": "bottom",
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Bold"
+ ],
+ "text-max-width": 8,
+ "text-offset": [0, -0.2],
+ "text-size": [
+ "interpolate",
+ [
+ "exponential",
+ 1.2],
+ [
+ "zoom"
+ ],
+ 4, 12, 7, 14, 11, 20]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_country_3",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "minzoom": 2,
+ "maxzoom": 9,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "country"
+ ],
+ [
+ "\u003E=",
+ [
+ "get",
+ "rank"
+ ],
+ 3]
+ ],
+ "layout": {
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Bold"
+ ],
+ "text-max-width": 6.25,
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 3, 9, 7, 17]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_country_2",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "maxzoom": 9,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "country"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "rank"
+ ],
+ 2]
+ ],
+ "layout": {
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Bold"
+ ],
+ "text-max-width": 6.25,
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 2, 9, 5, 17]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ },
+ {
+ "id": "label_country_1",
+ "type": "symbol",
+ "source": "openmaptiles",
+ "source-layer": "place",
+ "maxzoom": 9,
+ "filter": [
+ "all",
+ [
+ "==",
+ [
+ "get",
+ "class"
+ ],
+ "country"
+ ],
+ [
+ "==",
+ [
+ "get",
+ "rank"
+ ],
+ 1]
+ ],
+ "layout": {
+ "text-field": [
+ "case",
+ [
+ "has",
+ "name:nonlatin"
+ ],
+ [
+ "concat",
+ [
+ "get",
+ "name:latin"
+ ],
+ "\n",
+ [
+ "get",
+ "name:nonlatin"
+ ]
+ ],
+ [
+ "coalesce",
+ [
+ "get",
+ "name_en"
+ ],
+ [
+ "get",
+ "name"
+ ]
+ ]
+ ],
+ "text-font": [
+ "Noto Sans Bold"
+ ],
+ "text-max-width": 6.25,
+ "text-size": [
+ "interpolate",
+ [
+ "linear"
+ ],
+ [
+ "zoom"
+ ],
+ 1, 9, 4, 17]
+ },
+ "paint": {
+ "text-color": "#000",
+ "text-halo-blur": 1,
+ "text-halo-color": "#fff",
+ "text-halo-width": 1
+ }
+ }
+ ]
+}
diff --git a/src/frontend/public/pwa-worker.js b/src/frontend/public/pwa-worker.js
index e43cf9e..9995828 100644
--- a/src/frontend/public/pwa-worker.js
+++ b/src/frontend/public/pwa-worker.js
@@ -1,4 +1,4 @@
-const CACHE_VERSION = "2025-1012a";
+const CACHE_VERSION = "2025-1013a";
const STATIC_CACHE_NAME = `static-cache-${CACHE_VERSION}`;
const STATIC_CACHE_ASSETS = [
"/favicon.ico",