From 9e907509e0d0cacdeae33dbf022e2a3c4a437dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B8ran=20Dalum?= Date: Thu, 9 Jul 2026 10:18:51 +0200 Subject: [PATCH 1/2] feat: initial release of mapbox styles, NSR layer defs, and pin icon types --- README.md | 88 +- package.json | 2 +- src/index.ts | 36 +- src/mapbox-styles/get-mapbox-dark-style.ts | 5329 ++++++++++++++++ src/mapbox-styles/get-mapbox-light-style.ts | 5457 +++++++++++++++++ .../mapbox-color-theme-data.json | 3 + src/mapbox-styles/mapbox-color-theme.ts | 11 + src/mapbox-styles/pin-types.ts | 36 + src/national-stop-registry/nsr-layers.ts | 245 + src/national-stop-registry/nsr-utils.ts | 181 + src/types.ts | 117 + 11 files changed, 11501 insertions(+), 4 deletions(-) create mode 100644 src/mapbox-styles/get-mapbox-dark-style.ts create mode 100644 src/mapbox-styles/get-mapbox-light-style.ts create mode 100644 src/mapbox-styles/mapbox-color-theme-data.json create mode 100644 src/mapbox-styles/mapbox-color-theme.ts create mode 100644 src/mapbox-styles/pin-types.ts create mode 100644 src/national-stop-registry/nsr-layers.ts create mode 100644 src/national-stop-registry/nsr-utils.ts create mode 100644 src/types.ts diff --git a/README.md b/README.md index 691ace2..4254a15 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,89 @@ # @atb-as/mapbox-shared -Mapbox style JSON, sprite icon naming, and National Stop Registry layer definitions shared between AtB's web planner and mobile app. +Mapbox style JSON, sprite icon naming, and National Stop Registry (NSR) layer definitions shared between AtB's [travel planner web](https://github.com/AtB-AS/planner-web) and [mobile app](https://github.com/AtB-AS/mittatb-app). -Initial contents landing via [the first PR](https://github.com/AtB-AS/mapbox-shared/pulls). +## Install + +``` +pnpm add @atb-as/mapbox-shared +``` + +Requires `@atb-as/theme` at runtime for the `PinTheme` type (which is `'light' | 'dark'` derived from the theme package's `Themes` map). + +## What's in here + +- `getMapboxLightStyle(userName, nsrTilesetId)` / `getMapboxDarkStyle(userName, nsrTilesetId)` — full Mapbox style JSONs, downloaded from Mapbox Studio and parameterized on the caller's user name + NSR tileset id. +- `colorTheme` — the `color-theme` payload used with the Mapbox Standard basemap import (light + dark tuned for AtB). +- `nsrSymbolLayers` / `nsrCircleLayers` — layer metadata for rendering stop places, quays, and parking from the NSR tileset (filter, zoom threshold, icon code, entity type). +- `getLayerPropsDeterminedByZoomLevel(...)` — zoom-transition math for icon + label size/opacity. +- Pin/icon naming types (`PinIcon`, `NsrPinIconCode`, `PinTheme`, etc.) matching the sprite conventions in [`AtB-AS/map-sprites`](https://github.com/AtB-AS/map-sprites). + +Expression types use a strict operator union (`Expression = readonly [ExpressionName, ...]`) vendored from `@rnmapbox/maps`, which catches typos at the construction site here. The result is assignable both to `@rnmapbox/maps`'s types (identical) and to `mapbox-gl`'s looser `ExpressionSpecification` (a narrow type flows into a wider one) — no casts needed on either side. + +## Updating the styles + +We store Mapbox style JSON in this package rather than referencing it live from Mapbox Studio, because layer styling has to be expressed in code to support interactivity (Studio expressions are static), and Studio's asset workflow (SVG-only sprite uploads, buggy shadow rendering, duplicate uploads per OMS partner) doesn't fit AtB's setup. Sprites are hosted separately and injected by the consumer. + +To pull an updated style from Studio: + +1. Update the style in [Mapbox Studio](http://studio.mapbox.com/). +2. Download it with the [Mapbox Styles API](https://docs.mapbox.com/api/maps/styles/#retrieve-a-style): + ``` + curl "https://api.mapbox.com/styles/v1/MAPBOX_USER_NAME/STYLE_URL_ID?access_token=PUBLIC_ACCESS_TOKEN" + ``` +3. Strip metadata and layers with `visibility: 'none'`: + ```js + const style = /* paste curl response */; + + const layers = style.layers + .filter((l) => l?.layout?.visibility !== 'none') + .map(({metadata, ...rest}) => rest); + + copy({sources: style.sources, glyphs: style.glyphs, layers}); + ``` +4. Paste into `src/mapbox-styles/get-mapbox-{light,dark}-style.ts`. Then: + - Replace `sources.composite.url` and `glyphs` with the `${mapboxUserName}` / `${mapboxNsrTilesetId}` template literals used in the existing files. + - Ensure there is no `sprite` field — consumers inject the sprite URL at runtime. + - Update the "Based on" comment at the top of the file. + - Test both light and dark modes. Watch out for cached tiles. + +### Sprites + +Icons are maintained in [`AtB-AS/map-sprites`](https://github.com/AtB-AS/map-sprites) and produce the following statically-hosted assets: + +- `light.json`, `light.png`, `light@2x.json`, `light@2x.png` +- `dark.json`, `dark.png`, `dark@2x.json`, `dark@2x.png` + +Consumers configure the sprite URL at runtime (e.g. the mobile app reads it from firestore-configuration; the web planner has its own config). + +## Local development + +To test changes without cutting a release, use `pnpm add file:` (e.g. `pnpm add file:../mapbox-shared`) in the project that depends on it. + +Consumers import the built `lib/`, so run `pnpm build` when setting it up and whenever you make changes. + +When you're done, set the package version in the consumer's `package.json` back to the previous version. + +## Release + +1. Merge a PR to main, where the commit message follows the [conventional commits specification](https://www.conventionalcommits.org/en/v1.0.0/). +2. The Github action `release-please-action` will create a PR to update the package version and changelog. + - `feat` will be a minor release. + - `fix` will be a patch release. + - Adding `!` after the prefix (e.g. `feat!`) means it is a breaking change, and will be a major release. This includes any changes to the public API that requires users of the package to update any code. + - Other prefixes such as `chore` or `refactor` will not trigger a release. +3. Merge the release PR to main to trigger a NPM release. + +> [!NOTE] +> In case you want to create a release with a different version number than the one suggested by release-please, you can make an empty commit on main with commit message on this format: +> ``` +> chore: release v1.2.3 +> +> release-as: 1.2.3 +> ``` + +For more details, see [release-please-action](https://github.com/googleapis/release-please-action). + +## License + +EUPL-1.2 diff --git a/package.json b/package.json index 584e83e..ae28366 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "private": false, "packageManager": "pnpm@11.1.1", "scripts": { - "build": "tsc", + "build": "tsc && cp src/mapbox-styles/mapbox-color-theme-data.json lib/mapbox-styles/", "lint": "eslint", "prettier": "prettier -c src", "check-all": "pnpm build && pnpm lint && pnpm prettier && pnpm test", diff --git a/src/index.ts b/src/index.ts index cb0ff5c..e1300c3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,35 @@ -export {}; +// Mapbox style JSONs (verbatim from Mapbox Studio, minus vestigial layers +// with no features in the current NSR tileset). +export {getMapboxLightStyle} from './mapbox-styles/get-mapbox-light-style'; +export {getMapboxDarkStyle} from './mapbox-styles/get-mapbox-dark-style'; + +// Standard basemap color-theme (used inside style imports). +export {colorTheme} from './mapbox-styles/mapbox-color-theme'; + +// Pin naming (used for sprite icon references like `stoppin_bus_default_light`). +export type { + NsrPinIconCode, + VehicleIconCode, + StationIconCode, + PinScooterCompany, + LiveVehiclePinState, + PinType, + PinIconCode, + PinState, + PinTheme, + PinIcon, +} from './mapbox-styles/pin-types'; + +// National Stop Registry (NSR) — layer definitions + zoom-transition math. +export { + nsrCircleLayers, + nsrSymbolLayers, + NsrSymbolLayerTextLocation, +} from './national-stop-registry/nsr-layers'; +export type {NsrLayer} from './national-stop-registry/nsr-layers'; +export { + getNsrLayerSourceProps, + getFilterWhichAlsoHidesSelectedFeature, + getLayerPropsDeterminedByZoomLevel, +} from './national-stop-registry/nsr-utils'; +export type {LayerPropsDeterminedByZoomLevelParams} from './national-stop-registry/nsr-utils'; diff --git a/src/mapbox-styles/get-mapbox-dark-style.ts b/src/mapbox-styles/get-mapbox-dark-style.ts new file mode 100644 index 0000000..16d5cb6 --- /dev/null +++ b/src/mapbox-styles/get-mapbox-dark-style.ts @@ -0,0 +1,5329 @@ +export const getMapboxDarkStyle = ( + mapboxUserName: string, + mapboxNsrTilesetId: string, +) => { + /** + * Based on + * "version":8, + * "name":"AtB-Prod-Dark-V2" + * "id":"cm4sibv3l00cq01sb3kfjbxz4" + */ + + return { + sources: { + composite: { + url: `mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v8,${mapboxNsrTilesetId}`, + type: 'vector', + }, + }, + glyphs: `mapbox://fonts/${mapboxUserName}/{fontstack}/{range}.pbf`, + layers: [ + { + id: 'land', + type: 'background', + layout: {}, + paint: { + 'background-color': 'hsl(200, 25%, 22%)', + }, + }, + { + id: 'landcover', + type: 'fill', + source: 'composite', + 'source-layer': 'landcover', + maxzoom: 12, + layout: {}, + paint: { + 'fill-color': [ + 'match', + ['get', 'class'], + 'snow', + 'hsl(190, 20%, 61%)', + 'hsl(125, 20%, 25%)', + ], + 'fill-opacity': [ + 'interpolate', + ['exponential', 0.9], + ['zoom'], + 2, + 0.4, + 12, + 0, + ], + 'fill-antialias': false, + }, + }, + { + minzoom: 5, + layout: {}, + filter: [ + 'match', + ['get', 'class'], + [ + 'park', + 'airport', + 'cemetery', + 'glacier', + 'hospital', + 'pitch', + 'sand', + 'school', + 'agriculture', + 'wood', + 'grass', + 'scrub', + ], + true, + false, + ], + type: 'fill', + source: 'composite', + id: 'landuse', + paint: { + 'fill-color': [ + 'match', + ['get', 'class'], + ['park', 'grass'], + 'hsl(125, 20%, 30%)', + 'airport', + 'hsl(200, 25%, 20%)', + 'cemetery', + 'hsl(125, 20%, 33%)', + 'glacier', + 'hsl(190, 20%, 20%)', + 'hospital', + 'hsl(200, 25%, 20%)', + 'pitch', + 'hsl(125, 20%, 33%)', + 'sand', + 'hsl(55, 20%, 28%)', + 'school', + 'hsl(200, 25%, 20%)', + 'agriculture', + 'hsl(125, 20%, 30%)', + ['wood', 'scrub'], + 'hsl(125, 20%, 33%)', + 'hsla(0, 0%, 0%, 0)', + ], + 'fill-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 5, + 0, + 6, + [ + 'match', + ['get', 'class'], + [ + 'agriculture', + 'wood', + 'grass', + 'scrub', + 'cemetery', + 'sand', + 'park', + ], + 0, + 'glacier', + 0.5, + 1, + ], + 15, + 1, + ], + }, + 'source-layer': 'landuse', + }, + { + minzoom: 13, + layout: {}, + filter: [ + 'all', + ['==', ['geometry-type'], 'Polygon'], + ['==', ['get', 'class'], 'land'], + ], + type: 'fill', + source: 'composite', + id: 'land-structure-polygon', + paint: { + 'fill-color': 'hsl(200, 25%, 22%)', + }, + 'source-layer': 'structure', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + }, + filter: [ + 'all', + ['==', ['geometry-type'], 'LineString'], + ['==', ['get', 'class'], 'land'], + ], + type: 'line', + source: 'composite', + id: 'land-structure-line', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.99], + ['zoom'], + 14, + 0.75, + 20, + 40, + ], + 'line-color': 'hsl(200, 25%, 22%)', + }, + 'source-layer': 'structure', + }, + { + id: 'hillshade', + type: 'fill', + source: 'composite', + 'source-layer': 'hillshade', + maxzoom: 16, + layout: {}, + paint: { + 'fill-color': [ + 'match', + ['get', 'class'], + 'shadow', + 'hsl(200, 20%, 10%)', + 'hsl(0, 0%, 0%)', + ], + 'fill-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 14, + ['match', ['get', 'level'], [67, 56], 0.08, [89, 78], 0.07, 0.15], + 16, + 0, + ], + 'fill-antialias': false, + }, + }, + { + id: 'waterway-shadow', + type: 'line', + source: 'composite', + 'source-layer': 'waterway', + minzoom: 8, + layout: { + 'line-cap': ['step', ['zoom'], 'butt', 11, 'round'], + 'line-join': 'round', + }, + paint: { + 'line-color': 'hsl(200, 60%, 25%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.3], + ['zoom'], + 9, + ['match', ['get', 'class'], ['canal', 'river'], 0.1, 0], + 20, + ['match', ['get', 'class'], ['canal', 'river'], 8, 3], + ], + 'line-translate': [ + 'interpolate', + ['exponential', 1.2], + ['zoom'], + 7, + ['literal', [0, 0]], + 16, + ['literal', [-1, -1]], + ], + 'line-translate-anchor': 'viewport', + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 8.5, 1], + }, + }, + { + id: 'water-shadow', + type: 'fill', + source: 'composite', + 'source-layer': 'water', + layout: {}, + paint: { + 'fill-color': 'hsl(200, 60%, 25%)', + 'fill-translate': [ + 'interpolate', + ['exponential', 1.2], + ['zoom'], + 7, + ['literal', [0, 0]], + 16, + ['literal', [-1, -1]], + ], + 'fill-translate-anchor': 'viewport', + }, + }, + { + id: 'waterway', + type: 'line', + source: 'composite', + 'source-layer': 'waterway', + minzoom: 8, + layout: { + 'line-cap': ['step', ['zoom'], 'butt', 11, 'round'], + 'line-join': 'round', + }, + paint: { + 'line-color': 'hsl(200, 60%, 17%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.3], + ['zoom'], + 9, + ['match', ['get', 'class'], ['canal', 'river'], 1, 0.5], + 20, + ['match', ['get', 'class'], ['canal', 'river'], 8, 4], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 13, 0, 14, 1], + }, + }, + { + id: 'water', + type: 'fill', + source: 'composite', + 'source-layer': 'water', + paint: { + 'fill-color': 'hsl(200, 60%, 17%)', + }, + layout: {}, + }, + { + minzoom: 5, + layout: {}, + filter: [ + 'match', + ['get', 'class'], + ['wetland', 'wetland_noveg'], + true, + false, + ], + type: 'fill', + source: 'composite', + id: 'wetland', + paint: { + 'fill-color': 'hsl(125, 20%, 33%)', + 'fill-opacity': ['interpolate', ['linear'], ['zoom'], 7, 1, 12, 0.7], + }, + 'source-layer': 'landuse_overlay', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-street-minor-low', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': 'hsla(200, 25%, 15%, 0.6)', + 'line-opacity': ['step', ['zoom'], 1, 14, 0], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-street-minor-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsla(200, 25%, 15%, 0.6)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'track', 1, 0], + 14, + 1, + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-primary-secondary-tertiary-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + ['match', ['get', 'class'], 'primary', 1, 0.75], + 18, + 2, + ], + 'line-color': 'hsla(200, 25%, 15%, 0.6)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-major-link-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsla(200, 25%, 15%, 0.6)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-motorway-trunk-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsla(200, 25%, 15%, 0.6)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'construction'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-construction', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [0.4, 0.8]], + 15, + ['literal', [0.3, 0.6]], + 16, + ['literal', [0.2, 0.3]], + 17, + ['literal', [0.2, 0.25]], + 18, + ['literal', [0.15, 0.15]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'path'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + ], + true, + false, + ], + 16, + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + 'corridor', + 'sidewalk', + 'crossing', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-path-smooth-rough', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 0.4]], + 15, + ['literal', [3, 0.4]], + 16, + ['literal', [3, 0.35]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'path'], + ['match', ['get', 'type'], ['cycleway', 'piste'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-path-cycleway-piste', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'steps'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-steps', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 16, + 1.6, + 18, + 6, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.75, 1]], + 16, + ['literal', [1, 0.75]], + 17, + ['literal', [0.3, 0.3]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-major-link', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'pedestrian'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-pedestrian', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 18, + 12, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.5, 0.4]], + 16, + ['literal', [1, 0.2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-street-minor', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'track', 1, 0], + 14, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-primary-secondary-tertiary', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-small', + 17, + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + 'oneway-large', + 'oneway-small', + ], + 18, + 'oneway-large', + ], + 'symbol-spacing': 200, + 'icon-rotation-alignment': 'map', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'oneway'], 'true'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'street', 'street_limited', 'tertiary'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'street', + 'street_limited', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'path', + 'pedestrian', + 'service', + 'track', + ], + true, + false, + ], + ], + ], + type: 'symbol', + source: 'composite', + id: 'tunnel-oneway-arrow-blue', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-motorway-trunk', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-white-small', + 17, + 'oneway-white-large', + ], + 'symbol-spacing': 200, + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['motorway', 'motorway_link', 'trunk', 'trunk_link'], + true, + false, + ], + ['==', ['get', 'oneway'], 'true'], + ], + type: 'symbol', + source: 'composite', + id: 'tunnel-oneway-arrow-white', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane tunnel', + paint: { + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 3, + ], + 'line-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 0, + 11.5, + 0.3, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane tracks tunnel', + paint: { + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 3, + 20, + 7, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 11.5, 1], + 'line-dasharray': [0.1, 12], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['minor_rail'], true, false], + ['match', ['get', 'type'], ['tram', 'light_rail'], true, false], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ], + type: 'line', + source: 'composite', + id: 'tram tunnel', + paint: { + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 3, + ], + 'line-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 15, + 0, + 15.5, + 0.3, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['tunnel'], true, false], + [ + 'match', + ['get', 'type'], + ['narrow_gauge', 'preserved'], + true, + false, + ], + ], + type: 'line', + source: 'composite', + id: 'narrow-rail tunnel', + paint: { + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.4, + 20, + 0.7, + ], + 'line-opacity': 0.4, + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail tunnel', + paint: { + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 1, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 12, 0.4], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail-tracks tunnel', + paint: { + 'line-color': 'hsla(200, 25%, 30%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 4, + 20, + 8, + ], + 'line-dasharray': [0.1, 15], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 14, 0.4], + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: {}, + filter: [ + 'all', + ['!=', ['get', 'type'], 'building:part'], + ['==', ['get', 'underground'], 'false'], + ], + type: 'fill', + source: 'composite', + id: 'building', + paint: { + 'fill-color': 'hsl(200, 27%, 25%)', + 'fill-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 14.5, + 0, + 15.5, + 1, + ], + 'fill-outline-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 16, + 'hsla(0, 0%, 0%, 0)', + 22, + 'hsl(200, 25%, 13%)', + ], + }, + 'source-layer': 'building', + }, + { + minzoom: 8, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: ['==', ['get', 'type'], 'ferry'], + type: 'line', + source: 'composite', + id: 'ferry', + paint: { + 'line-width': ['interpolate', ['linear'], ['zoom'], 14, 1, 16, 1], + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [10, 4, 2, 4]], + 13, + ['literal', [12, 4]], + ], + 'line-color': 'hsl(195, 40%, 30%)', + }, + 'source-layer': 'road', + }, + { + id: 'ferry-auto', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: ['==', ['get', 'type'], 'ferry_auto'], + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 1, + 20, + 1, + ], + 'line-color': 'hsl(195, 40%, 30%)', + 'line-dasharray': [5, 5], + }, + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'pedestrian'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-pedestrian-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 14.5, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 11, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-street-low', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-opacity': ['step', ['zoom'], 1, 14, 0], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'step', + ['zoom'], + ['==', ['get', 'class'], 'track'], + 14, + [ + 'match', + ['get', 'class'], + ['track', 'secondary_link', 'tertiary_link', 'service'], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-minor-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + ['match', ['get', 'class'], 'track', 1, 0.5], + 18, + 12, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 11, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-street-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + id: 'road-secondary-tertiary-case', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['secondary', 'tertiary'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 0.75, + 18, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.1, + 18, + 26, + ], + 'line-opacity': ['step', ['zoom'], 0, 10, 1], + }, + }, + { + id: 'road-primary-case', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['==', ['get', 'class'], 'primary'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-opacity': ['step', ['zoom'], 0, 10, 1], + }, + }, + { + minzoom: 10, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-major-link-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-opacity': ['step', ['zoom'], 0, 11, 1], + }, + 'source-layer': 'road', + }, + { + id: 'road-motorway-trunk-case', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'motorway', 1, 0], + 6, + 1, + ], + }, + }, + { + minzoom: 14, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'class'], 'construction'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-construction', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [0.4, 0.8]], + 15, + ['literal', [0.3, 0.6]], + 16, + ['literal', [0.2, 0.3]], + 17, + ['literal', [0.2, 0.25]], + 18, + ['literal', [0.15, 0.15]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'path'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'type'], + ['bridleway', 'footway', 'path'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'corridor', + 'sidewalk', + 'crossing', + ], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-path-smooth', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 0.4]], + 15, + ['literal', [3, 0.4]], + 16, + ['literal', [3, 0.35]], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 16.5, 0, 17, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'path'], + [ + 'match', + ['get', 'type'], + ['hiking', 'mountain_bike', 'trail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-path-rough', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 0.4]], + 15, + ['literal', [1.75, 0.4]], + 16, + ['literal', [1, 0.4]], + 17, + ['literal', [1, 0.35]], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 16, 0, 17, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'path'], + ['match', ['get', 'type'], ['cycleway'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-path-cycleway-piste', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.61], + ['zoom'], + 14, + 2, + 22, + 12, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 14, 0, 16, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'type'], 'steps'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-steps', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 16, + 1.6, + 18, + 6, + ], + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 0, + 'hsl(200, 25%, 35%)', + 22, + 'hsl(200, 25%, 35%)', + ], + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.75, 1]], + 16, + ['literal', [1, 0.75]], + 17, + ['literal', [0.3, 0.3]], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 16, 0, 17, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-major-link', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'pedestrian'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-pedestrian', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 18, + 12, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.5, 0.4]], + 16, + ['literal', [1, 0.2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + filter: [ + 'all', + ['==', ['geometry-type'], 'Polygon'], + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'street', + 'street_limited', + 'track', + 'service', + ], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ], + type: 'fill', + source: 'composite', + id: 'road-polygon', + paint: { + 'fill-color': 'hsl(200, 25%, 35%)', + 'fill-outline-color': 'hsl(200, 10%, 15%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'step', + ['zoom'], + ['==', ['get', 'class'], 'track'], + 14, + [ + 'match', + ['get', 'class'], + ['secondary_link', 'tertiary_link', 'service'], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-minor', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + ['match', ['get', 'class'], 'track', 1, 0.5], + 18, + 12, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 11, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-street', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + id: 'road-secondary-tertiary', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['secondary', 'tertiary'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.1, + 18, + 26, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + }, + { + id: 'road-primary', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['==', ['get', 'class'], 'primary'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + }, + { + minzoom: 15, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-small', + 17, + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + 'oneway-large', + 'oneway-small', + ], + 18, + 'oneway-large', + ], + 'symbol-spacing': 200, + 'icon-rotation-alignment': 'map', + }, + filter: [ + 'all', + ['==', ['get', 'oneway'], 'true'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'street', + 'street_limited', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'path', + 'pedestrian', + 'service', + 'track', + ], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'road-oneway-arrow-blue', + paint: {}, + 'source-layer': 'road', + }, + { + id: 'road-motorway-trunk', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 3, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 11.5, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane tracks', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 3, + 20, + 7, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 11.5, 1], + 'line-dasharray': [0.1, 12], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['minor_rail'], true, false], + ['match', ['get', 'type'], ['tram', 'light_rail'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 'tram', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 1, + 20, + 3, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 15, 0, 15.5, 1], + 'line-dasharray': [6, 2], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail', 'minor_rail'], + true, + false, + ], + [ + 'match', + ['get', 'structure'], + ['none', 'ford', 'bridge'], + true, + false, + ], + [ + 'match', + ['get', 'type'], + ['narrow_gauge', 'preserved'], + true, + false, + ], + ], + type: 'line', + source: 'composite', + id: 'narrow-rail', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 20, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + [ + 'match', + ['get', 'type'], + ['narrow_gauge', 'preserved'], + true, + false, + ], + ], + type: 'line', + source: 'composite', + id: 'narrow-rail-tracks', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 8, + 20, + 12, + ], + 'line-dasharray': [0.1, 4], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 1, + 20, + 2, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 6, 1, 16, 0.8], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail-tracks', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 6, + 20, + 10, + ], + 'line-dasharray': [0.1, 15], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 18, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['major_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'bridge-heavy-rail', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 1, + 20, + 2, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 6, 1, 16, 0.8], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['major_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'bridge-heavy-rail-tracks', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 12, + 'hsl(200, 25%, 25%)', + 16, + 'hsl(200, 25%, 35%)', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 6, + 20, + 10, + ], + 'line-dasharray': [0.1, 15], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 18, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'icon-image': 'level-crossing', + 'icon-allow-overlap': true, + }, + filter: ['==', ['get', 'class'], 'level_crossing'], + type: 'symbol', + source: 'composite', + id: 'level-crossing', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-white-small', + 17, + 'oneway-white-large', + ], + 'symbol-spacing': 200, + }, + filter: [ + 'all', + ['==', ['get', 'oneway'], 'true'], + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'motorway_link', 'trunk_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'road-oneway-arrow-white', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'text-field': ['get', 'ref'], + 'text-size': 9, + 'icon-image': [ + 'concat', + 'motorway-exit-', + ['to-string', ['get', 'reflen']], + ], + 'text-font': ['DIN Offc Pro Bold', 'Arial Unicode MS Bold'], + }, + filter: ['all', ['has', 'reflen'], ['<=', ['get', 'reflen'], 9]], + type: 'symbol', + source: 'composite', + id: 'road-exit-shield', + paint: { + 'text-color': 'hsl(0, 0%, 100%)', + 'text-translate': [0, 0], + }, + 'source-layer': 'motorway_junction', + }, + { + minzoom: 6, + layout: { + 'text-size': 9, + 'icon-image': [ + 'concat', + ['get', 'shield'], + '-', + ['to-string', ['get', 'reflen']], + ], + 'icon-rotation-alignment': 'viewport', + 'text-max-angle': 38, + 'symbol-spacing': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 150, + 14, + 200, + ], + 'text-font': ['DIN Offc Pro Bold', 'Arial Unicode MS Bold'], + 'symbol-placement': ['step', ['zoom'], 'point', 11, 'line'], + 'text-rotation-alignment': 'viewport', + 'text-field': ['get', 'ref'], + 'text-letter-spacing': 0.05, + }, + filter: [ + 'all', + ['has', 'reflen'], + ['<=', ['get', 'reflen'], 6], + [ + 'step', + ['zoom'], + ['==', ['geometry-type'], 'Point'], + 11, + ['>', ['get', 'len'], 5000], + 12, + ['>', ['get', 'len'], 2500], + 13, + ['>', ['get', 'len'], 1000], + 14, + true, + ], + ], + type: 'symbol', + source: 'composite', + id: 'road-number-shield', + paint: { + 'text-color': [ + 'match', + ['get', 'shield_text_color'], + 'black', + 'hsl(200, 25%, 80%)', + 'yellow', + 'hsl(50, 81%, 74%)', + 'orange', + 'hsl(25, 73%, 63%)', + 'blue', + 'hsl(230, 40%, 58%)', + 'hsl(190, 20%, 75%)', + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'text-size': [ + 'interpolate', + ['linear'], + ['zoom'], + 10, + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'primary', 'secondary', 'tertiary'], + 10, + [ + 'motorway_link', + 'trunk_link', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'pedestrian', + 'street', + 'street_limited', + 'track', + 'path', + 'aerialway', + ], + 9, + 6.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'primary', 'secondary', 'tertiary'], + 16, + [ + 'motorway_link', + 'trunk_link', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'pedestrian', + 'street', + 'street_limited', + 'path', + ], + 14, + 13, + ], + ], + 'text-max-angle': 30, + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'symbol-placement': 'line', + 'text-padding': 1, + 'text-rotation-alignment': 'map', + 'text-pitch-alignment': 'viewport', + 'text-field': ['coalesce', ['get', 'name_en'], ['get', 'name']], + 'text-letter-spacing': 0.01, + }, + filter: [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'primary', 'secondary', 'tertiary'], + true, + false, + ], + 12, + [ + 'match', + ['get', 'class'], + [ + 'motorway', + 'trunk', + 'primary', + 'secondary', + 'tertiary', + 'pedestrian', + 'street', + 'street_limited', + 'track', + 'path', + 'aerialway', + ], + true, + false, + ], + 15, + ['match', ['get', 'class'], 'golf', false, true], + ], + type: 'symbol', + source: 'composite', + id: 'road-label', + paint: { + 'text-color': 'hsl(200, 25%, 90%)', + 'text-halo-color': [ + 'match', + ['get', 'class'], + 'ferry', + 'hsl(190, 60%, 15%)', + 'hsl(200, 25%, 15%)', + ], + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'type'], 'steps'], + ['==', ['get', 'structure'], 'bridge'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-steps-bg', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 2.5, + 18, + 7, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-opacity': 0.75, + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'pedestrian'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-pedestrian-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 14.5, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-street-minor-low', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-opacity': ['step', ['zoom'], 1, 14, 0], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-street-minor-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': [ + 'match', + ['get', 'class'], + 'track', + 'hsl(50, 100%, 40%)', + 'hsl(200, 10%, 15%)', + ], + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'track', 1, 0], + 14, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-primary-secondary-tertiary-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + ['match', ['get', 'class'], 'primary', 1, 0.75], + 18, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-opacity': ['step', ['zoom'], 0, 10, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'construction'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-construction', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [0.4, 0.8]], + 15, + ['literal', [0.3, 0.6]], + 16, + ['literal', [0.2, 0.3]], + 17, + ['literal', [0.2, 0.25]], + 18, + ['literal', [0.15, 0.15]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'path'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + ], + true, + false, + ], + 16, + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + 'corridor', + 'sidewalk', + 'crossing', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-path-smooth-rough', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 2, + 18, + 6, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 2]], + 15, + ['literal', [3, 2]], + 16, + ['literal', [3, 2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'path'], + ['match', ['get', 'type'], ['cycleway', 'piste'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-path-cycleway', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'type'], 'steps'], + ['==', ['get', 'structure'], 'bridge'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-steps', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 16, + 1.6, + 18, + 6, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.75, 1]], + 16, + ['literal', [1, 0.75]], + 17, + ['literal', [0.3, 0.3]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'pedestrian'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-pedestrian', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 18, + 12, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.5, 0.4]], + 16, + ['literal', [1, 0.2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-street-minor', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-primary-secondary-tertiary', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-small', + 17, + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + 'oneway-large', + 'oneway-small', + ], + 18, + 'oneway-large', + ], + 'symbol-spacing': 200, + 'icon-rotation-alignment': 'map', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'oneway'], 'true'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'street', + 'street_limited', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'path', + 'pedestrian', + 'track', + 'service', + ], + true, + false, + ], + ], + ], + type: 'symbol', + source: 'composite', + id: 'bridge-oneway-arrow-blue', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-translate': [0, 0], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link-2-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 25%, 15%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk-2-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 25%, 35%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link-2', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk-2', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsl(200, 25%, 35%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-white-small', + 17, + 'oneway-white-large', + ], + 'symbol-spacing': 200, + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['get', 'oneway'], 'true'], + ], + type: 'symbol', + source: 'composite', + id: 'bridge-oneway-arrow-white', + paint: {}, + 'source-layer': 'road', + }, + { + id: 'admin-1-boundary-bg', + type: 'line', + source: 'composite', + 'source-layer': 'admin', + filter: [ + 'all', + ['==', ['get', 'admin_level'], 1], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + layout: { + 'line-join': 'bevel', + }, + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 6, + 'hsl(200, 25%, 10%)', + 8, + 'hsl(200, 25%, 10%)', + ], + 'line-width': ['interpolate', ['linear'], ['zoom'], 7, 2, 12, 3], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 7, 0, 8, 0.75], + 'line-dasharray': [1, 0], + 'line-translate': [0, 0], + 'line-blur': ['interpolate', ['linear'], ['zoom'], 3, 0, 8, 3], + }, + }, + { + minzoom: 1, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'admin_level'], 0], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + type: 'line', + source: 'composite', + id: 'admin-0-boundary-bg', + paint: { + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 2, 10, 3], + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 6, + 'hsl(200, 25%, 10%)', + 8, + 'hsl(200, 25%, 10%)', + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 3, 0, 4, 0.5], + 'line-translate': [0, 0], + 'line-blur': ['interpolate', ['linear'], ['zoom'], 3, 0, 10, 2], + }, + 'source-layer': 'admin', + }, + { + id: 'admin-1-boundary', + type: 'line', + source: 'composite', + 'source-layer': 'admin', + filter: [ + 'all', + ['==', ['get', 'admin_level'], 1], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + paint: { + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [2, 0]], + 7, + ['literal', [2, 2, 6, 2]], + ], + 'line-width': ['interpolate', ['linear'], ['zoom'], 7, 0.75, 12, 1.5], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 2, 0, 3, 1], + 'line-color': 'hsl(200, 18%, 50%)', + }, + }, + { + minzoom: 1, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'admin_level'], 0], + ['==', ['get', 'disputed'], 'false'], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + type: 'line', + source: 'composite', + id: 'admin-0-boundary', + paint: { + 'line-color': 'hsl(200, 18%, 50%)', + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 1, 10, 2.5], + }, + 'source-layer': 'admin', + }, + { + minzoom: 1, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'disputed'], 'true'], + ['==', ['get', 'admin_level'], 0], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + type: 'line', + source: 'composite', + id: 'admin-0-boundary-disputed', + paint: { + 'line-dasharray': [1.5, 1.5], + 'line-color': 'hsl(200, 18%, 50%)', + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 0.5, 10, 1.5], + }, + 'source-layer': 'admin', + }, + { + minzoom: 4, + layout: { + 'text-size': [ + 'step', + ['zoom'], + ['step', ['get', 'sizerank'], 18, 5, 12], + 17, + ['step', ['get', 'sizerank'], 18, 13, 12], + ], + 'text-max-angle': 30, + 'text-field': ['coalesce', ['get', 'name_en'], ['get', 'name']], + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Regular'], + 'symbol-placement': 'line-center', + 'text-pitch-alignment': 'viewport', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['glacier', 'landform'], true, false], + ['==', ['geometry-type'], 'LineString'], + ['<=', ['get', 'filterrank'], 4], + ], + type: 'symbol', + source: 'composite', + id: 'natural-line-label', + paint: { + 'text-halo-width': 0.5, + 'text-halo-color': 'hsl(0, 0%, 0%)', + 'text-halo-blur': 0.5, + 'text-color': 'hsl(200, 10%, 80%)', + }, + 'source-layer': 'natural_label', + }, + { + minzoom: 4, + layout: { + 'text-size': [ + 'step', + ['zoom'], + ['step', ['get', 'sizerank'], 18, 5, 12], + 17, + ['step', ['get', 'sizerank'], 18, 13, 12], + ], + 'text-field': ['coalesce', ['get', 'name_en'], ['get', 'name']], + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Regular'], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'step', + ['get', 'sizerank'], + ['literal', [0, 0]], + 5, + ['literal', [0, 0.75]], + ], + 17, + [ + 'step', + ['get', 'sizerank'], + ['literal', [0, 0]], + 13, + ['literal', [0, 0.75]], + ], + ], + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['dock', 'glacier', 'landform', 'water_feature', 'wetland'], + true, + false, + ], + ['==', ['geometry-type'], 'Point'], + ['<=', ['get', 'filterrank'], 4], + ], + type: 'symbol', + source: 'composite', + id: 'natural-point-label', + paint: { + 'icon-opacity': [ + 'step', + ['zoom'], + ['step', ['get', 'sizerank'], 0, 5, 1], + 17, + ['step', ['get', 'sizerank'], 0, 13, 1], + ], + 'text-halo-color': 'hsl(0, 0%, 0%)', + 'text-halo-width': 0.5, + 'text-halo-blur': 0.5, + 'text-color': 'hsl(200, 10%, 80%)', + }, + 'source-layer': 'natural_label', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-subway_underground_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['metro'], true, false], + ['match', ['get', 'descend'], ['yes'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-metro-steps', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-subway_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['metro'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-metro-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-train_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['rail'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-rail-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-train_underground_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['rail'], true, false], + ['match', ['get', 'descend'], ['yes'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-rail-steps', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2020-c5044e-bus_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['bus'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-bus-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-airplane_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['air'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-airport-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-ferry_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['water'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-water-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-tram_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['', 'tram'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-tram-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + id: 'building-number-label', + type: 'symbol', + source: 'composite', + 'source-layer': 'housenum_label', + minzoom: 17, + layout: { + 'text-field': ['get', 'house_num'], + 'text-font': ['DIN Offc Pro Italic', 'Arial Unicode MS Regular'], + 'text-padding': 4, + 'text-max-width': 7, + 'text-size': 12, + }, + paint: { + 'text-color': 'hsl(200, 25%, 80%)', + 'text-halo-color': 'hsl(200, 25%, 10%)', + 'text-halo-width': 0.5, + 'text-opacity': ['interpolate', ['linear'], ['zoom'], 17, 0, 18, 1], + }, + }, + { + minzoom: 10, + layout: { + 'text-field': ['get', 'name'], + 'text-transform': 'uppercase', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-letter-spacing': [ + 'match', + ['get', 'type'], + 'suburb', + 0.15, + 0.1, + ], + 'text-max-width': 7, + 'text-padding': 3, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.5, 0, 1, 1], + ['zoom'], + 11, + ['match', ['get', 'type'], 'suburb', 11, 10.5], + 15, + ['match', ['get', 'type'], 'suburb', 17, 16], + ], + }, + maxzoom: 15, + filter: [ + 'all', + ['==', ['get', 'class'], 'settlement_subdivision'], + ['<=', ['get', 'filterrank'], 4], + ], + type: 'symbol', + source: 'composite', + id: 'settlement-subdivision-label', + paint: { + 'text-halo-color': 'hsl(200, 25%, 10%)', + 'text-halo-width': 1, + 'text-color': 'hsl(200, 25%, 80%)', + 'text-halo-blur': 0.5, + }, + 'source-layer': 'place_label', + }, + { + layout: { + 'text-line-height': 1.1, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 3, + [ + 'step', + ['get', 'symbolrank'], + 12, + 9, + 11, + 10, + 10.5, + 12, + 9.5, + 14, + 8.5, + 16, + 6.5, + 17, + 4, + ], + 15, + [ + 'step', + ['get', 'symbolrank'], + 28, + 9, + 26, + 10, + 23, + 11, + 21, + 12, + 20, + 13, + 19, + 15, + 17, + ], + ], + 'icon-image': [ + 'case', + ['==', ['get', 'capital'], 2], + 'border-dot-13', + ['step', ['get', 'symbolrank'], 'dot-11', 9, 'dot-10', 11, 'dot-9'], + ], + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + 'text-justify': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + ['left', 'bottom-left', 'top-left'], + 'left', + ['right', 'bottom-right', 'top-right'], + 'right', + 'center', + ], + 8, + 'center', + ], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'capital'], + 2, + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.3]], + 'bottom-left', + ['literal', [0.3, -0.1]], + 'left', + ['literal', [0.45, 0.1]], + 'top-left', + ['literal', [0.3, 0.1]], + 'top', + ['literal', [0, 0.3]], + 'top-right', + ['literal', [-0.3, 0.1]], + 'right', + ['literal', [-0.45, 0]], + 'bottom-right', + ['literal', [-0.3, -0.1]], + ['literal', [0, -0.3]], + ], + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.25]], + 'bottom-left', + ['literal', [0.2, -0.05]], + 'left', + ['literal', [0.4, 0.05]], + 'top-left', + ['literal', [0.2, 0.05]], + 'top', + ['literal', [0, 0.25]], + 'top-right', + ['literal', [-0.2, 0.05]], + 'right', + ['literal', [-0.4, 0.05]], + 'bottom-right', + ['literal', [-0.2, -0.05]], + ['literal', [0, -0.25]], + ], + ], + 8, + ['literal', [0, 0]], + ], + 'text-anchor': [ + 'step', + ['zoom'], + ['get', 'text_anchor'], + 8, + 'center', + ], + 'text-field': ['get', 'name'], + 'text-max-width': 7, + }, + maxzoom: 15, + filter: [ + 'all', + ['<=', ['get', 'filterrank'], 5], + ['==', ['get', 'class'], 'settlement'], + [ + 'step', + ['zoom'], + true, + 13, + ['>=', ['get', 'symbolrank'], 11], + 14, + ['>=', ['get', 'symbolrank'], 13], + ], + ['match', ['get', 'iso_3166_1'], ['NO'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'settlement-label', + paint: { + 'text-color': 'hsl(200, 25%, 80%)', + 'text-halo-color': 'hsl(200, 25%, 10%)', + 'text-halo-width': 1, + 'icon-opacity': ['step', ['zoom'], 1, 8, 0], + 'text-halo-blur': 1, + }, + 'source-layer': 'place_label', + }, + { + layout: { + 'text-line-height': 1.1, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 3, + [ + 'step', + ['get', 'symbolrank'], + 12, + 9, + 11, + 10, + 10.5, + 12, + 9.5, + 14, + 8.5, + 16, + 6.5, + 17, + 4, + ], + 15, + [ + 'step', + ['get', 'symbolrank'], + 28, + 9, + 26, + 10, + 23, + 11, + 21, + 12, + 20, + 13, + 19, + 15, + 17, + ], + ], + 'icon-image': [ + 'case', + ['==', ['get', 'capital'], 2], + 'border-dot-13', + ['step', ['get', 'symbolrank'], 'dot-11', 9, 'dot-10', 11, 'dot-9'], + ], + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + 'text-justify': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + ['left', 'bottom-left', 'top-left'], + 'left', + ['right', 'bottom-right', 'top-right'], + 'right', + 'center', + ], + 8, + 'center', + ], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'capital'], + 2, + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.3]], + 'bottom-left', + ['literal', [0.3, -0.1]], + 'left', + ['literal', [0.45, 0.1]], + 'top-left', + ['literal', [0.3, 0.1]], + 'top', + ['literal', [0, 0.3]], + 'top-right', + ['literal', [-0.3, 0.1]], + 'right', + ['literal', [-0.45, 0]], + 'bottom-right', + ['literal', [-0.3, -0.1]], + ['literal', [0, -0.3]], + ], + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.25]], + 'bottom-left', + ['literal', [0.2, -0.05]], + 'left', + ['literal', [0.4, 0.05]], + 'top-left', + ['literal', [0.2, 0.05]], + 'top', + ['literal', [0, 0.25]], + 'top-right', + ['literal', [-0.2, 0.05]], + 'right', + ['literal', [-0.4, 0.05]], + 'bottom-right', + ['literal', [-0.2, -0.05]], + ['literal', [0, -0.25]], + ], + ], + 8, + ['literal', [0, 0]], + ], + 'text-anchor': [ + 'step', + ['zoom'], + ['get', 'text_anchor'], + 8, + 'center', + ], + 'text-field': ['get', 'name'], + 'text-max-width': 7, + }, + maxzoom: 15, + filter: [ + 'all', + ['<=', ['get', 'filterrank'], 5], + ['==', ['get', 'class'], 'settlement'], + [ + 'step', + ['zoom'], + true, + 13, + ['>=', ['get', 'symbolrank'], 11], + 14, + ['>=', ['get', 'symbolrank'], 13], + ], + ['match', ['get', 'iso_3166_1'], ['SE'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'settlement-label utland', + paint: { + 'text-color': 'hsl(200, 25%, 80%)', + 'text-halo-color': 'hsl(200, 25%, 10%)', + 'text-halo-width': 1, + 'icon-opacity': ['step', ['zoom'], 1, 8, 0], + 'text-halo-blur': 1, + }, + 'source-layer': 'place_label', + }, + { + minzoom: 3, + layout: { + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.85, 0.7, 0.65, 1], + ['zoom'], + 4, + ['step', ['get', 'symbolrank'], 10, 6, 9.5, 7, 9], + 9, + ['step', ['get', 'symbolrank'], 24, 6, 18, 7, 14], + ], + 'text-transform': 'uppercase', + 'text-font': ['DIN Offc Pro Bold', 'Arial Unicode MS Bold'], + 'text-field': [ + 'step', + ['zoom'], + [ + 'step', + ['get', 'symbolrank'], + ['coalesce', ['get', 'name_en'], ['get', 'name']], + 5, + [ + 'coalesce', + ['get', 'abbr'], + ['get', 'name_en'], + ['get', 'name'], + ], + ], + 5, + ['get', 'name'], + ], + 'text-letter-spacing': 0.15, + 'text-max-width': 6, + }, + maxzoom: 9, + filter: ['==', ['get', 'class'], 'state'], + type: 'symbol', + source: 'composite', + id: 'state-label', + paint: { + 'text-color': 'hsl(200, 25%, 80%)', + 'text-halo-color': 'hsl(200, 25%, 10%)', + 'text-halo-width': 1, + }, + 'source-layer': 'place_label', + }, + { + minzoom: 1, + layout: { + 'text-line-height': 1.1, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.7, 1], + ['zoom'], + 1, + ['step', ['get', 'symbolrank'], 11, 4, 9, 5, 8], + 9, + ['step', ['get', 'symbolrank'], 28, 4, 22, 5, 21], + ], + 'icon-image': 'dot-11', + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Regular'], + 'text-justify': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + ['left', 'bottom-left', 'top-left'], + 'left', + ['right', 'bottom-right', 'top-right'], + 'right', + 'center', + ], + 7, + 'center', + ], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.25]], + 'bottom-left', + ['literal', [0.2, -0.05]], + 'left', + ['literal', [0.4, 0.05]], + 'top-left', + ['literal', [0.2, 0.05]], + 'top', + ['literal', [0, 0.25]], + 'top-right', + ['literal', [-0.2, 0.05]], + 'right', + ['literal', [-0.4, 0.05]], + 'bottom-right', + ['literal', [-0.2, -0.05]], + ['literal', [0, -0.25]], + ], + 7, + ['literal', [0, 0]], + ], + 'text-anchor': [ + 'step', + ['zoom'], + ['coalesce', ['get', 'text_anchor'], 'center'], + 7, + 'center', + ], + 'text-field': ['get', 'name'], + 'text-max-width': 6, + }, + maxzoom: 10, + filter: ['==', ['get', 'class'], 'country'], + type: 'symbol', + source: 'composite', + id: 'country-label', + paint: { + 'icon-opacity': [ + 'step', + ['zoom'], + ['case', ['has', 'text_anchor'], 1, 0], + 7, + 0, + ], + 'text-color': 'hsl(200, 25%, 80%)', + 'text-halo-color': 'hsl(100, 0%, 15%)', + 'text-halo-width': 1.25, + }, + 'source-layer': 'place_label', + }, + { + minzoom: 15, + layout: { + 'text-field': ['to-string', ['get', 'name']], + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 15, + 12, + 19, + 16, + ], + 'text-line-height': 1.1, + 'text-max-width': 7, + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + }, + filter: [ + 'all', + ['match', ['get', 'type'], ['Park'], true, false], + ['==', ['get', ''], ''], + ], + type: 'symbol', + source: 'composite', + id: 'poi-parks_graves', + paint: { + 'text-color': 'hsl(200, 10%, 80%)', + 'text-halo-color': 'hsl(0, 0%, 0%)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + 'source-layer': 'poi_label', + }, + { + minzoom: 15, + layout: { + 'text-field': ['to-string', ['get', 'name']], + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 15, + 12, + 19, + 16, + ], + 'text-line-height': 1.1, + 'text-max-width': 7, + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + }, + filter: ['match', ['get', 'type'], ['Hospital'], true, false], + type: 'symbol', + source: 'composite', + id: 'poi-sykehus', + paint: { + 'text-color': 'hsl(200, 10%, 80%)', + 'text-halo-color': 'hsl(0, 0%, 0%)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + 'source-layer': 'poi_label', + }, + { + minzoom: 15, + layout: { + 'text-field': ['to-string', ['get', 'name']], + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 15, + 12, + 19, + 16, + ], + 'text-line-height': 1.1, + 'text-max-width': 7, + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + }, + filter: [ + 'match', + ['get', 'type'], + ['Stadium', 'Cemetery'], + true, + false, + ], + type: 'symbol', + source: 'composite', + id: 'poi-stadium', + paint: { + 'text-halo-color': 'hsl(0, 0%, 0%)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'text-color': 'hsl(200, 10%, 80%)', + }, + 'source-layer': 'poi_label', + }, + ], + }; +}; diff --git a/src/mapbox-styles/get-mapbox-light-style.ts b/src/mapbox-styles/get-mapbox-light-style.ts new file mode 100644 index 0000000..69bf9ae --- /dev/null +++ b/src/mapbox-styles/get-mapbox-light-style.ts @@ -0,0 +1,5457 @@ +export const getMapboxLightStyle = ( + mapboxUserName: string, + mapboxNsrTilesetId: string, +) => { + /** + * Based on + * "version":8, + * "name":"AtB-Prod-Light-V2" + * "id":"cm4si9gl500cx01r15pn8f8vh" + */ + return { + sources: { + composite: { + url: `mapbox://mapbox.mapbox-terrain-v2,mapbox.mapbox-streets-v8,${mapboxNsrTilesetId}`, + type: 'vector', + }, + }, + glyphs: `mapbox://fonts/${mapboxUserName}/{fontstack}/{range}.pbf`, + layers: [ + { + id: 'land', + type: 'background', + layout: {}, + paint: { + 'background-color': 'hsl(200, 30%, 95%)', + }, + }, + { + id: 'landcover', + type: 'fill', + source: 'composite', + 'source-layer': 'landcover', + maxzoom: 12, + layout: {}, + paint: { + 'fill-color': [ + 'match', + ['get', 'class'], + 'snow', + 'hsl(0, 0%, 100%)', + 'hsl(70, 50%, 75%)', + ], + 'fill-opacity': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 2, + 0.4, + 12, + 0, + ], + 'fill-antialias': false, + }, + }, + { + minzoom: 5, + layout: {}, + filter: ['==', ['get', 'class'], 'national_park'], + type: 'fill', + source: 'composite', + id: 'national-park', + paint: { + 'fill-color': 'hsl(100, 40%, 80%)', + 'fill-opacity': 0, + }, + 'source-layer': 'landuse_overlay', + }, + { + minzoom: 5, + layout: {}, + filter: [ + 'match', + ['get', 'class'], + [ + 'park', + 'airport', + 'cemetery', + 'glacier', + 'hospital', + 'pitch', + 'sand', + 'school', + 'agriculture', + 'wood', + 'grass', + 'scrub', + ], + true, + false, + ], + type: 'fill', + source: 'composite', + id: 'landuse', + paint: { + 'fill-color': [ + 'match', + ['get', 'class'], + ['park', 'grass'], + 'hsl(125, 40%, 90%)', + 'airport', + 'hsl(100, 10%, 85%)', + 'cemetery', + 'hsl(125, 40%, 85%)', + 'glacier', + 'hsl(200, 70%, 93%)', + 'hospital', + 'hsl(200, 30%, 95%)', + 'pitch', + 'hsl(125, 40%, 85%)', + 'sand', + 'hsl(55, 50%, 90%)', + 'school', + 'hsl(200, 30%, 95%)', + 'agriculture', + 'hsl(125, 40%, 90%)', + ['wood', 'scrub'], + 'hsl(125, 40%, 85%)', + 'hsla(0, 0%, 0%, 0)', + ], + 'fill-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 5, + 0, + 6, + [ + 'match', + ['get', 'class'], + ['agriculture', 'wood', 'grass', 'scrub'], + 0, + 'glacier', + 0.5, + 1, + ], + 15, + 1, + ], + }, + 'source-layer': 'landuse', + }, + { + minzoom: 13, + layout: {}, + filter: [ + 'all', + ['==', ['geometry-type'], 'Polygon'], + ['==', ['get', 'class'], 'land'], + ], + type: 'fill', + source: 'composite', + id: 'land-structure-polygon', + paint: { + 'fill-color': 'hsl(200, 30%, 95%)', + }, + 'source-layer': 'structure', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + }, + filter: [ + 'all', + ['==', ['geometry-type'], 'LineString'], + ['==', ['get', 'class'], 'land'], + ], + type: 'line', + source: 'composite', + id: 'land-structure-line', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.99], + ['zoom'], + 14, + 0.75, + 20, + 40, + ], + 'line-color': 'hsl(190, 20%, 95%)', + }, + 'source-layer': 'structure', + }, + { + id: 'hillshade', + type: 'fill', + source: 'composite', + 'source-layer': 'hillshade', + maxzoom: 16, + layout: {}, + paint: { + 'fill-color': [ + 'match', + ['get', 'class'], + 'shadow', + 'hsl(200, 20%, 50%)', + 'hsl(0, 0%, 100%)', + ], + 'fill-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 14, + ['match', ['get', 'level'], [67, 56], 0.08, [89, 78], 0.07, 0.15], + 16, + 0, + ], + 'fill-antialias': false, + }, + }, + { + id: 'waterway-shadow', + type: 'line', + source: 'composite', + 'source-layer': 'waterway', + minzoom: 8, + layout: { + 'line-cap': ['step', ['zoom'], 'butt', 11, 'round'], + 'line-join': 'round', + }, + paint: { + 'line-color': 'hsl(190, 40%, 70%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.3], + ['zoom'], + 9, + ['match', ['get', 'class'], ['canal', 'river'], 0.1, 0], + 20, + ['match', ['get', 'class'], ['canal', 'river'], 8, 3], + ], + 'line-translate': [ + 'interpolate', + ['exponential', 1.2], + ['zoom'], + 7, + ['literal', [0, 0]], + 16, + ['literal', [-1, -1]], + ], + 'line-translate-anchor': 'viewport', + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 8.5, 1], + }, + }, + { + id: 'water-shadow', + type: 'fill', + source: 'composite', + 'source-layer': 'water', + layout: {}, + paint: { + 'fill-color': 'hsl(190, 40%, 70%)', + 'fill-translate': [ + 'interpolate', + ['exponential', 1.2], + ['zoom'], + 7, + ['literal', [0, 0]], + 16, + ['literal', [-1, -1]], + ], + 'fill-translate-anchor': 'viewport', + }, + }, + { + id: 'waterway', + type: 'line', + source: 'composite', + 'source-layer': 'waterway', + minzoom: 8, + layout: { + 'line-cap': ['step', ['zoom'], 'butt', 11, 'round'], + 'line-join': 'round', + }, + paint: { + 'line-color': 'hsl(190, 40%, 85%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.3], + ['zoom'], + 9, + ['match', ['get', 'class'], ['canal', 'river'], 1, 0.5], + 20, + ['match', ['get', 'class'], ['canal', 'river'], 8, 4], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 13, 0, 14, 1], + }, + }, + { + id: 'water', + type: 'fill', + source: 'composite', + 'source-layer': 'water', + paint: { + 'fill-color': 'hsl(200, 40%, 80%)', + }, + layout: {}, + }, + { + minzoom: 5, + layout: {}, + filter: [ + 'match', + ['get', 'class'], + ['wetland', 'wetland_noveg'], + true, + false, + ], + type: 'fill', + source: 'composite', + id: 'wetland', + paint: { + 'fill-color': 'hsl(125, 40%, 83%)', + }, + 'source-layer': 'landuse_overlay', + }, + { + minzoom: 5, + filter: [ + 'match', + ['get', 'class'], + ['wetland', 'wetland_noveg'], + true, + false, + ], + type: 'fill', + source: 'composite', + id: 'wetland-pattern', + paint: { + 'fill-color': 'hsl(190, 50%, 80%)', + 'fill-opacity': 0, + 'fill-pattern': 'wetland', + 'fill-translate-anchor': 'viewport', + }, + 'source-layer': 'landuse_overlay', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-street-minor-low', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-opacity': ['step', ['zoom'], 1, 14, 0], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-street-minor-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': [ + 'match', + ['get', 'class'], + 'track', + 'hsl(50, 100%, 40%)', + 'hsl(230, 19%, 75%)', + ], + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'track', 1, 0], + 14, + 1, + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-primary-secondary-tertiary-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + ['match', ['get', 'class'], 'primary', 1, 0.75], + 18, + 2, + ], + 'line-color': 'hsl(200, 20%, 75%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-major-link-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-motorway-trunk-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-dasharray': [3, 3], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'construction'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-construction', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [0.4, 0.8]], + 15, + ['literal', [0.3, 0.6]], + 16, + ['literal', [0.2, 0.3]], + 17, + ['literal', [0.2, 0.25]], + 18, + ['literal', [0.15, 0.15]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'path'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + ], + true, + false, + ], + 16, + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + 'corridor', + 'sidewalk', + 'crossing', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-path-smooth-rough', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 0.4]], + 15, + ['literal', [3, 0.4]], + 16, + ['literal', [3, 0.35]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'path'], + ['match', ['get', 'type'], ['cycleway', 'piste'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-path-cycleway-piste', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'steps'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-steps', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 16, + 1.6, + 18, + 6, + ], + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.75, 1]], + 16, + ['literal', [1, 0.75]], + 17, + ['literal', [0.3, 0.3]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-major-link', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'class'], 'pedestrian'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-pedestrian', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 18, + 12, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.5, 0.4]], + 16, + ['literal', [1, 0.2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-street-minor', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': [ + 'match', + ['get', 'class'], + 'street_limited', + 'hsl(35, 14%, 93%)', + 'hsl(0, 0%, 100%)', + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'track', 1, 0], + 14, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-primary-secondary-tertiary', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-color': 'hsl(0, 0%, 100%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-small', + 17, + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + 'oneway-large', + 'oneway-small', + ], + 18, + 'oneway-large', + ], + 'symbol-spacing': 200, + 'icon-rotation-alignment': 'map', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['==', ['get', 'oneway'], 'true'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'street', 'street_limited', 'tertiary'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'street', + 'street_limited', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'path', + 'pedestrian', + 'service', + 'track', + ], + true, + false, + ], + ], + ], + type: 'symbol', + source: 'composite', + id: 'tunnel-oneway-arrow-blue', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'tunnel-motorway-trunk', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + }, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-white-small', + 17, + 'oneway-white-large', + ], + 'symbol-spacing': 200, + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'tunnel'], + [ + 'match', + ['get', 'class'], + ['motorway', 'motorway_link', 'trunk', 'trunk_link'], + true, + false, + ], + ['==', ['get', 'oneway'], 'true'], + ], + type: 'symbol', + source: 'composite', + id: 'tunnel-oneway-arrow-white', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane tunnel', + paint: { + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 3, + ], + 'line-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 0, + 11.5, + 0.3, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane tracks tunnel', + paint: { + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 3, + 20, + 7, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 11.5, 1], + 'line-dasharray': [0.1, 12], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['minor_rail'], true, false], + ['match', ['get', 'type'], ['tram', 'light_rail'], true, false], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ], + type: 'line', + source: 'composite', + id: 'tram tunnel', + paint: { + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 3, + ], + 'line-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 15, + 0, + 15.5, + 0.3, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['tunnel'], true, false], + [ + 'match', + ['get', 'type'], + ['narrow_gauge', 'preserved'], + true, + false, + ], + ], + type: 'line', + source: 'composite', + id: 'narrow-rail tunnel', + paint: { + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.4, + 20, + 0.7, + ], + 'line-opacity': 0.4, + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail tunnel', + paint: { + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 1, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 12, 0.4], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['tunnel'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail-tracks tunnel', + paint: { + 'line-color': 'hsla(200, 10%, 90%, 0.6)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 4, + 20, + 8, + ], + 'line-dasharray': [0.1, 15], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 14, 0.4], + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: {}, + filter: [ + 'all', + ['!=', ['get', 'type'], 'building:part'], + ['==', ['get', 'underground'], 'false'], + ], + type: 'line', + source: 'composite', + id: 'building-outline', + paint: { + 'line-color': 'hsl(200, 10%, 80%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 0.75, + 20, + 3, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 15, 0, 16, 1], + }, + 'source-layer': 'building', + }, + { + minzoom: 15, + layout: {}, + filter: [ + 'all', + ['!=', ['get', 'type'], 'building:part'], + ['==', ['get', 'underground'], 'false'], + ], + type: 'fill', + source: 'composite', + id: 'building', + paint: { + 'fill-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 14, + 'hsl(200, 30%, 95%)', + 16, + 'hsl(200, 30%, 93%)', + ], + 'fill-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 14.5, + 0, + 15.5, + 1, + ], + 'fill-outline-color': 'hsl(200, 30%, 90%)', + }, + 'source-layer': 'building', + }, + { + minzoom: 8, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: ['==', ['get', 'type'], 'ferry'], + type: 'line', + source: 'composite', + id: 'ferry', + paint: { + 'line-width': ['interpolate', ['linear'], ['zoom'], 14, 1, 16, 1], + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [10, 4, 2, 4]], + 13, + ['literal', [12, 4]], + ], + 'line-color': 'hsl(195, 50%, 60%)', + }, + 'source-layer': 'road', + }, + { + id: 'ferry-auto', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: ['==', ['get', 'type'], 'ferry_auto'], + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 1, + 20, + 1, + ], + 'line-color': 'hsl(195, 50%, 60%)', + 'line-dasharray': [5, 5], + }, + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'pedestrian'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-pedestrian-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 14.5, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 11, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-street-low', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-opacity': ['step', ['zoom'], 1, 14, 0], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'step', + ['zoom'], + ['==', ['get', 'class'], 'track'], + 14, + [ + 'match', + ['get', 'class'], + ['track', 'secondary_link', 'tertiary_link', 'service'], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-minor-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + ['match', ['get', 'class'], 'track', 1, 0.5], + 18, + 12, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 11, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-street-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + id: 'road-secondary-tertiary-case', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['secondary', 'tertiary'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 0.75, + 18, + 2, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.1, + 18, + 26, + ], + 'line-opacity': ['step', ['zoom'], 0, 10, 1], + }, + }, + { + id: 'road-primary-case', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['==', ['get', 'class'], 'primary'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-opacity': ['step', ['zoom'], 0, 10, 1], + }, + }, + { + minzoom: 10, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-major-link-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-opacity': ['step', ['zoom'], 0, 11, 1], + }, + 'source-layer': 'road', + }, + { + id: 'road-motorway-trunk-case', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 20%, 87%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'motorway', 1, 0], + 6, + 1, + ], + }, + }, + { + minzoom: 14, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'class'], 'construction'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-construction', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(100, 10%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [0.4, 0.8]], + 15, + ['literal', [0.3, 0.6]], + 16, + ['literal', [0.2, 0.3]], + 17, + ['literal', [0.2, 0.25]], + 18, + ['literal', [0.15, 0.15]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'path'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'type'], + ['bridleway', 'footway', 'path'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'corridor', + 'sidewalk', + 'crossing', + ], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-path-smooth', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsl(100, 10%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 0.4]], + 15, + ['literal', [3, 0.4]], + 16, + ['literal', [3, 0.35]], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 16.5, 0, 17, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'path'], + [ + 'match', + ['get', 'type'], + ['hiking', 'mountain_bike', 'trail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-path-rough', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsl(100, 10%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 0.4]], + 15, + ['literal', [1.75, 0.4]], + 16, + ['literal', [1, 0.4]], + 17, + ['literal', [1, 0.35]], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 16, 0, 17, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'path'], + ['match', ['get', 'type'], ['cycleway'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-path-cycleway-piste', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.61], + ['zoom'], + 14, + 2, + 22, + 12, + ], + 'line-color': 'hsl(345, 50%, 100%)', + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 14, 0, 16, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'type'], 'steps'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-steps', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 16, + 1.6, + 18, + 6, + ], + 'line-color': 'hsl(100, 10%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.75, 1]], + 16, + ['literal', [1, 0.75]], + 17, + ['literal', [0.3, 0.3]], + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 16, 0, 17, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-major-link', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(100, 10%, 97%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'class'], 'pedestrian'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-pedestrian', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 18, + 12, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.5, 0.4]], + 16, + ['literal', [1, 0.2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + filter: [ + 'all', + ['==', ['geometry-type'], 'Polygon'], + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'street', + 'street_limited', + 'track', + 'service', + ], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ], + type: 'fill', + source: 'composite', + id: 'road-polygon', + paint: { + 'fill-color': 'hsl(0, 0%, 100%)', + 'fill-outline-color': '#d6d9e6', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'step', + ['zoom'], + ['==', ['get', 'class'], 'track'], + 14, + [ + 'match', + ['get', 'class'], + ['secondary_link', 'tertiary_link', 'service'], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-minor', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + ['match', ['get', 'class'], 'track', 1, 0.5], + 18, + 12, + ], + 'line-color': 'hsl(0, 0%, 100%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 11, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'road-street', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': [ + 'match', + ['get', 'class'], + 'street_limited', + 'hsl(35, 14%, 100%)', + 'hsl(0, 0%, 100%)', + ], + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + id: 'road-secondary-tertiary', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['secondary', 'tertiary'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.1, + 18, + 26, + ], + 'line-color': 'hsl(0, 0%, 100%)', + }, + }, + { + id: 'road-primary', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['==', ['get', 'class'], 'primary'], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsl(0, 0%, 100%)', + }, + }, + { + minzoom: 15, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-small', + 17, + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + 'oneway-large', + 'oneway-small', + ], + 18, + 'oneway-large', + ], + 'symbol-spacing': 200, + 'icon-rotation-alignment': 'map', + }, + filter: [ + 'all', + ['==', ['get', 'oneway'], 'true'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'street', + 'street_limited', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'path', + 'pedestrian', + 'service', + 'track', + ], + true, + false, + ], + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'road-oneway-arrow-blue', + paint: {}, + 'source-layer': 'road', + }, + { + id: 'road-motorway-trunk', + type: 'line', + source: 'composite', + 'source-layer': 'road', + filter: [ + 'all', + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsl(100, 10%, 100%)', + }, + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + '#bbaba5', + 16, + '#bbaba5', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 0.5, + 20, + 3, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 11.5, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['major_rail'], true, false], + ['match', ['get', 'type'], ['subway'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 't-bane tracks', + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + '#bbaba5', + 16, + '#bbaba5', + ], + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 3, + 20, + 7, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 11, 0, 11.5, 1], + 'line-dasharray': [0.1, 12], + }, + 'source-layer': 'road', + }, + { + minzoom: 10, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['minor_rail'], true, false], + ['match', ['get', 'type'], ['tram', 'light_rail'], true, false], + ['match', ['get', 'structure'], ['none', 'bridge'], true, false], + ], + type: 'line', + source: 'composite', + id: 'tram', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 1, + 20, + 3, + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 15, 0, 15.5, 1], + 'line-dasharray': [6, 2], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail', 'minor_rail'], + true, + false, + ], + [ + 'match', + ['get', 'structure'], + ['none', 'ford', 'bridge'], + true, + false, + ], + [ + 'match', + ['get', 'type'], + ['narrow_gauge', 'preserved'], + true, + false, + ], + ], + type: 'line', + source: 'composite', + id: 'narrow-rail', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 20, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + [ + 'match', + ['get', 'type'], + ['narrow_gauge', 'preserved'], + true, + false, + ], + ], + type: 'line', + source: 'composite', + id: 'narrow-rail-tracks', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 4, + 20, + 8, + ], + 'line-dasharray': [0.1, 4], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 11, + 1, + 20, + 2, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 7, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['major_rail', 'service_rail'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'heavy-rail-tracks', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 6, + 20, + 10, + ], + 'line-dasharray': [0.1, 15], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 8, 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['major_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'bridge-heavy-rail', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 1, + 20, + 2, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['major_rail', 'minor_rail'], + true, + false, + ], + ['match', ['get', 'type'], ['rail'], true, false], + ], + type: 'line', + source: 'composite', + id: 'bridge-heavy-rail-tracks', + paint: { + 'line-color': 'hsl(200, 10%, 72%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 6, + 20, + 10, + ], + 'line-dasharray': [0.1, 15], + 'line-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 13.75, + 0, + 14, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'icon-image': 'level-crossing', + 'icon-allow-overlap': true, + }, + filter: ['==', ['get', 'class'], 'level_crossing'], + type: 'symbol', + source: 'composite', + id: 'level-crossing', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-white-small', + 17, + 'oneway-white-large', + ], + 'symbol-spacing': 200, + }, + filter: [ + 'all', + ['==', ['get', 'oneway'], 'true'], + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'motorway_link', 'trunk_link'], + true, + false, + ], + ['match', ['get', 'structure'], ['none', 'ford'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'road-oneway-arrow-white', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'text-field': ['get', 'ref'], + 'text-size': 9, + 'icon-image': [ + 'concat', + 'motorway-exit-', + ['to-string', ['get', 'reflen']], + ], + 'text-font': ['DIN Offc Pro Bold', 'Arial Unicode MS Bold'], + }, + filter: ['all', ['has', 'reflen'], ['<=', ['get', 'reflen'], 9]], + type: 'symbol', + source: 'composite', + id: 'road-exit-shield', + paint: { + 'text-color': 'hsl(0, 0%, 100%)', + 'text-translate': [0, 0], + }, + 'source-layer': 'motorway_junction', + }, + { + minzoom: 6, + layout: { + 'text-size': 9, + 'icon-image': [ + 'concat', + ['get', 'shield'], + '-', + ['to-string', ['get', 'reflen']], + ], + 'icon-rotation-alignment': 'viewport', + 'text-max-angle': 38, + 'symbol-spacing': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 150, + 14, + 200, + ], + 'text-font': ['DIN Offc Pro Bold', 'Arial Unicode MS Bold'], + 'symbol-placement': ['step', ['zoom'], 'point', 11, 'line'], + 'text-rotation-alignment': 'viewport', + 'text-field': ['get', 'ref'], + 'text-letter-spacing': 0.05, + }, + filter: [ + 'all', + ['has', 'reflen'], + ['<=', ['get', 'reflen'], 6], + [ + 'step', + ['zoom'], + ['==', ['geometry-type'], 'Point'], + 11, + ['>', ['get', 'len'], 5000], + 12, + ['>', ['get', 'len'], 2500], + 13, + ['>', ['get', 'len'], 1000], + 14, + true, + ], + ], + type: 'symbol', + source: 'composite', + id: 'road-number-shield', + paint: { + 'text-color': [ + 'match', + ['get', 'shield_text_color'], + 'black', + 'hsl(100, 10%, 20%)', + 'yellow', + 'hsl(50, 81%, 74%)', + 'orange', + 'hsl(25, 73%, 63%)', + 'blue', + 'hsl(230, 40%, 58%)', + 'hsl(190, 20%, 75%)', + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'type'], 'steps'], + ['==', ['get', 'structure'], 'bridge'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-steps-bg', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 2.5, + 18, + 7, + ], + 'line-color': 'hsl(200, 20%, 80%)', + 'line-opacity': 0.75, + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'pedestrian'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-pedestrian-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 14.5, + ], + 'line-color': 'hsl(200, 20%, 85%)', + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-street-minor-low', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-opacity': ['step', ['zoom'], 1, 14, 0], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-street-minor-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': [ + 'match', + ['get', 'class'], + 'track', + 'hsl(50, 100%, 40%)', + 'hsl(230, 24%, 87%)', + ], + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-opacity': [ + 'step', + ['zoom'], + ['match', ['get', 'class'], 'track', 1, 0], + 14, + 1, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-primary-secondary-tertiary-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + ['match', ['get', 'class'], 'primary', 1, 0.75], + 18, + 2, + ], + 'line-color': 'hsl(200, 20%, 85%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-opacity': ['step', ['zoom'], 0, 10, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 10%, 85%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 10%, 85%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'construction'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-construction', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(200, 10%, 85%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [0.4, 0.8]], + 15, + ['literal', [0.3, 0.6]], + 16, + ['literal', [0.2, 0.3]], + 17, + ['literal', [0.2, 0.25]], + 18, + ['literal', [0.15, 0.15]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'path'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + ], + true, + false, + ], + 16, + [ + 'match', + ['get', 'type'], + [ + 'bridleway', + 'footway', + 'path', + 'hiking', + 'mountain_bike', + 'trail', + 'corridor', + 'sidewalk', + 'crossing', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-path-smooth-rough', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 2, + 18, + 6, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [4, 2]], + 15, + ['literal', [3, 2]], + 16, + ['literal', [3, 2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'path'], + ['match', ['get', 'type'], ['cycleway', 'piste'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-path-cycleway', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 18, + 4, + ], + 'line-color': 'hsl(0, 0%, 100%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 14, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'type'], 'steps'], + ['==', ['get', 'structure'], 'bridge'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-steps', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 15, + 1, + 16, + 1.6, + 18, + 6, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.75, 1]], + 16, + ['literal', [1, 0.75]], + 17, + ['literal', [0.3, 0.3]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(190, 20%, 97%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'class'], 'pedestrian'], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-pedestrian', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 18, + 12, + ], + 'line-color': 'hsl(0, 0%, 100%)', + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [1, 0]], + 15, + ['literal', [1.5, 0.4]], + 16, + ['literal', [1, 0.2]], + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'track', 'primary_link'], + true, + false, + ], + 14, + [ + 'match', + ['get', 'class'], + [ + 'street', + 'street_limited', + 'track', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'service', + ], + true, + false, + ], + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-street-minor', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 2, + 'track', + 1, + 0.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['street', 'street_limited', 'primary_link'], + 18, + 12, + ], + ], + 'line-color': [ + 'match', + ['get', 'class'], + 'street_limited', + 'hsl(35, 14%, 93%)', + 'hsl(0, 0%, 100%)', + ], + 'line-opacity': ['step', ['zoom'], 0, 14, 1], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-primary-secondary-tertiary', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + ['match', ['get', 'class'], 'primary', 0.75, 0.1], + 18, + ['match', ['get', 'class'], 'primary', 32, 26], + ], + 'line-color': 'hsl(0, 0%, 100%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-small', + 17, + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + 'oneway-large', + 'oneway-small', + ], + 18, + 'oneway-large', + ], + 'symbol-spacing': 200, + 'icon-rotation-alignment': 'map', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['==', ['get', 'oneway'], 'true'], + [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['primary', 'secondary', 'tertiary', 'street', 'street_limited'], + true, + false, + ], + 16, + [ + 'match', + ['get', 'class'], + [ + 'primary', + 'secondary', + 'tertiary', + 'street', + 'street_limited', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'path', + 'pedestrian', + 'track', + 'service', + ], + true, + false, + ], + ], + ], + type: 'symbol', + source: 'composite', + id: 'bridge-oneway-arrow-blue', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['<=', ['get', 'layer'], 1], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-translate': [0, 0], + 'line-color': 'hsl(195, 20%, 100%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link-2-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.75, + 20, + 2, + ], + 'line-color': 'hsl(200, 10%, 85%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk-2-case', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 10, + 1, + 18, + 2, + ], + 'line-color': 'hsl(200, 10%, 85%)', + 'line-gap-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + [ + 'match', + ['get', 'class'], + ['motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-major-link-2', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 0.5, + 14, + 2, + 18, + 18, + ], + 'line-color': 'hsl(100, 10%, 97%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 13, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + ['>=', ['get', 'layer'], 2], + ['match', ['get', 'class'], ['motorway', 'trunk'], true, false], + ['==', ['geometry-type'], 'LineString'], + ], + type: 'line', + source: 'composite', + id: 'bridge-motorway-trunk-2', + paint: { + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 5, + 0.75, + 18, + 32, + ], + 'line-color': 'hsl(51, 100%, 100%)', + }, + 'source-layer': 'road', + }, + { + minzoom: 16, + layout: { + 'symbol-placement': 'line', + 'icon-image': [ + 'step', + ['zoom'], + 'oneway-white-small', + 17, + 'oneway-white-large', + ], + 'symbol-spacing': 200, + }, + filter: [ + 'all', + ['==', ['get', 'structure'], 'bridge'], + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'motorway_link', 'trunk_link'], + true, + false, + ], + ['==', ['get', 'oneway'], 'true'], + ], + type: 'symbol', + source: 'composite', + id: 'bridge-oneway-arrow-white', + paint: {}, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: ['==', ['get', 'class'], 'aerialway'], + type: 'line', + source: 'composite', + id: 'aerialway-bg', + paint: { + 'line-color': 'hsl(0, 0%, 100%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 2.5, + 20, + 3, + ], + 'line-blur': 0.5, + }, + 'source-layer': 'road', + }, + { + minzoom: 12, + layout: { + 'line-join': 'round', + }, + filter: ['==', ['get', 'class'], 'aerialway'], + type: 'line', + source: 'composite', + id: 'aerialway', + paint: { + 'line-color': 'hsl(230, 4%, 29%)', + 'line-width': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + 0.5, + 20, + 1, + ], + }, + 'source-layer': 'road', + }, + { + id: 'admin-1-boundary-bg', + type: 'line', + source: 'composite', + 'source-layer': 'admin', + filter: [ + 'all', + ['==', ['get', 'admin_level'], 1], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + layout: { + 'line-join': 'bevel', + }, + paint: { + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 6, + 'hsl(100, 10%, 90%)', + 8, + 'hsl(100, 40%, 90%)', + ], + 'line-width': ['interpolate', ['linear'], ['zoom'], 7, 3.75, 12, 5.5], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 7, 0, 8, 0.75], + 'line-dasharray': [1, 0], + 'line-translate': [0, 0], + 'line-blur': ['interpolate', ['linear'], ['zoom'], 3, 0, 8, 3], + }, + }, + { + minzoom: 1, + layout: {}, + filter: [ + 'all', + ['==', ['get', 'admin_level'], 0], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + type: 'line', + source: 'composite', + id: 'admin-0-boundary-bg', + paint: { + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 3.5, 10, 8], + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 6, + 'hsl(100, 10%, 90%)', + 8, + 'hsl(100, 40%, 90%)', + ], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 3, 0, 4, 0.5], + 'line-translate': [0, 0], + 'line-blur': ['interpolate', ['linear'], ['zoom'], 3, 0, 10, 2], + }, + 'source-layer': 'admin', + }, + { + id: 'admin-1-boundary', + type: 'line', + source: 'composite', + 'source-layer': 'admin', + filter: [ + 'all', + ['==', ['get', 'admin_level'], 1], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + paint: { + 'line-dasharray': [ + 'step', + ['zoom'], + ['literal', [2, 0]], + 7, + ['literal', [2, 2, 6, 2]], + ], + 'line-width': ['interpolate', ['linear'], ['zoom'], 7, 0.75, 12, 1.5], + 'line-opacity': ['interpolate', ['linear'], ['zoom'], 2, 0, 3, 1], + 'line-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 3, + 'hsl(100, 10%, 60%)', + 7, + 'hsl(100, 10%, 50%)', + ], + }, + }, + { + minzoom: 1, + layout: { + 'line-join': 'round', + 'line-cap': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'admin_level'], 0], + ['==', ['get', 'disputed'], 'false'], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + type: 'line', + source: 'composite', + id: 'admin-0-boundary', + paint: { + 'line-color': 'hsl(100, 10%, 50%)', + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 0.5, 10, 2], + }, + 'source-layer': 'admin', + }, + { + minzoom: 1, + layout: { + 'line-join': 'round', + }, + filter: [ + 'all', + ['==', ['get', 'disputed'], 'true'], + ['==', ['get', 'admin_level'], 0], + ['==', ['get', 'maritime'], 'false'], + ['match', ['get', 'worldview'], ['all', 'US'], true, false], + ], + type: 'line', + source: 'composite', + id: 'admin-0-boundary-disputed', + paint: { + 'line-dasharray': [1.5, 1.5], + 'line-color': 'hsl(100, 10%, 50%)', + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 0.5, 10, 2], + }, + 'source-layer': 'admin', + }, + { + minzoom: 4, + layout: { + 'text-size': [ + 'step', + ['zoom'], + ['step', ['get', 'sizerank'], 18, 5, 12], + 17, + ['step', ['get', 'sizerank'], 18, 13, 12], + ], + 'text-max-angle': 30, + 'text-field': ['coalesce', ['get', 'name_en'], ['get', 'name']], + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Regular'], + 'symbol-placement': 'line-center', + 'text-pitch-alignment': 'viewport', + }, + filter: [ + 'all', + ['match', ['get', 'class'], ['glacier', 'landform'], true, false], + ['==', ['geometry-type'], 'LineString'], + ['<=', ['get', 'filterrank'], 4], + ], + type: 'symbol', + source: 'composite', + id: 'natural-line-label', + paint: { + 'text-halo-width': 0.5, + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-blur': 0.5, + 'text-color': [ + 'step', + ['zoom'], + [ + 'step', + ['get', 'sizerank'], + 'hsl(26, 20%, 42%)', + 5, + 'hsl(26, 25%, 32%)', + ], + 17, + [ + 'step', + ['get', 'sizerank'], + 'hsl(26, 20%, 42%)', + 13, + 'hsl(26, 25%, 32%)', + ], + ], + }, + 'source-layer': 'natural_label', + }, + { + minzoom: 4, + layout: { + 'text-size': [ + 'step', + ['zoom'], + ['step', ['get', 'sizerank'], 18, 5, 12], + 17, + ['step', ['get', 'sizerank'], 18, 13, 12], + ], + 'text-field': ['coalesce', ['get', 'name_en'], ['get', 'name']], + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Regular'], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'step', + ['get', 'sizerank'], + ['literal', [0, 0]], + 5, + ['literal', [0, 0.75]], + ], + 17, + [ + 'step', + ['get', 'sizerank'], + ['literal', [0, 0]], + 13, + ['literal', [0, 0.75]], + ], + ], + }, + filter: [ + 'all', + [ + 'match', + ['get', 'class'], + ['dock', 'glacier', 'landform', 'water_feature', 'wetland'], + true, + false, + ], + ['==', ['geometry-type'], 'Point'], + ['<=', ['get', 'filterrank'], 4], + ], + type: 'symbol', + source: 'composite', + id: 'natural-point-label', + paint: { + 'icon-opacity': [ + 'step', + ['zoom'], + ['step', ['get', 'sizerank'], 0, 5, 1], + 17, + ['step', ['get', 'sizerank'], 0, 13, 1], + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 0.5, + 'text-halo-blur': 0.5, + 'text-color': [ + 'step', + ['zoom'], + [ + 'step', + ['get', 'sizerank'], + 'hsl(190, 10%, 40%)', + 5, + 'hsl(190, 10%, 30%)', + ], + 17, + [ + 'step', + ['get', 'sizerank'], + 'hsl(190, 10%, 40%)', + 13, + 'hsl(190, 10%, 30%)', + ], + ], + }, + 'source-layer': 'natural_label', + }, + { + minzoom: 10, + layout: { + 'text-size': [ + 'interpolate', + ['linear'], + ['zoom'], + 10, + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'primary', 'secondary', 'tertiary'], + 10, + [ + 'motorway_link', + 'trunk_link', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'pedestrian', + 'street', + 'street_limited', + 'track', + 'path', + 'aerialway', + ], + 9, + 6.5, + ], + 18, + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'primary', 'secondary', 'tertiary'], + 16, + [ + 'motorway_link', + 'trunk_link', + 'primary_link', + 'secondary_link', + 'tertiary_link', + 'pedestrian', + 'street', + 'street_limited', + 'path', + ], + 14, + 13, + ], + ], + 'text-max-angle': 30, + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'symbol-placement': 'line', + 'text-padding': 1, + 'text-rotation-alignment': 'map', + 'text-pitch-alignment': 'viewport', + 'text-field': ['coalesce', ['get', 'name_en'], ['get', 'name']], + 'text-letter-spacing': 0.01, + }, + filter: [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'class'], + ['motorway', 'trunk', 'primary', 'secondary', 'tertiary'], + true, + false, + ], + 12, + [ + 'match', + ['get', 'class'], + [ + 'motorway', + 'trunk', + 'primary', + 'secondary', + 'tertiary', + 'pedestrian', + 'street', + 'street_limited', + 'track', + 'path', + 'aerialway', + ], + true, + false, + ], + 15, + ['match', ['get', 'class'], 'golf', false, true], + ], + type: 'symbol', + source: 'composite', + id: 'road-label', + paint: { + 'text-color': [ + 'match', + ['get', 'class'], + 'ferry', + 'hsl(190, 20%, 20%)', + 'hsl(100, 10%, 20%)', + ], + 'text-halo-color': [ + 'match', + ['get', 'class'], + 'ferry', + 'hsl(190, 60%, 75%)', + 'hsl(0, 0%, 100%)', + ], + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + 'source-layer': 'road', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-subway_underground_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['metro'], true, false], + ['match', ['get', 'descend'], ['yes'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-metro-steps', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-subway_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['metro'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-metro-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-train_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['rail'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-rail-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-train_underground_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['rail'], true, false], + ['match', ['get', 'descend'], ['yes'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-rail-steps', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2020-c5044e-bus_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['bus'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-bus-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-airplane_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['air'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-airport-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-ferry_entrance-13', // icon NOT EXISTING ATM, fix! + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['water'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-water-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + minzoom: 15, + layout: { + 'text-line-height': 0.9, + 'text-size': [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 12, + 11, + 22, + 24, + ], + 'text-allow-overlap': true, + 'icon-image': '2019-tram_entrance-13', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-padding': 0, + 'text-anchor': 'top', + 'text-field': ['to-string', ['get', 'stopaccess']], + 'icon-padding': 0, + 'text-max-width': 5, + }, + filter: [ + 'all', + ['match', ['get', 'stopaccess:suspended'], ['yes'], false, true], + ['match', ['get', 'type'], ['', 'tram'], true, false], + ['match', ['get', 'descend'], ['no'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'access-tram-doors', + paint: { + 'text-color': '#181c56', + 'text-opacity': [ + 'interpolate', + ['linear'], + ['zoom'], + 16.5, + 0, + 16.75, + 1, + ], + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1.25, + 'text-translate': [0, 13], + }, + 'source-layer': 'stoppestedsinnganger', + }, + { + id: 'building-number-label', + type: 'symbol', + source: 'composite', + 'source-layer': 'housenum_label', + minzoom: 17, + layout: { + 'text-field': ['get', 'house_num'], + 'text-font': ['DIN Offc Pro Italic', 'Arial Unicode MS Regular'], + 'text-padding': 4, + 'text-max-width': 7, + 'text-size': 12, + }, + paint: { + 'text-color': 'hsl(100, 10%, 30%)', + 'text-halo-color': 'hsl(35, 8%, 85%)', + 'text-halo-width': 0.5, + 'text-opacity': ['interpolate', ['linear'], ['zoom'], 17, 0, 18, 1], + }, + }, + { + minzoom: 10, + layout: { + 'text-field': ['get', 'name'], + 'text-transform': 'uppercase', + 'text-font': ['DIN Offc Pro Regular', 'Arial Unicode MS Regular'], + 'text-letter-spacing': [ + 'match', + ['get', 'type'], + 'suburb', + 0.15, + 0.1, + ], + 'text-max-width': 7, + 'text-padding': 3, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.5, 0, 1, 1], + ['zoom'], + 11, + ['match', ['get', 'type'], 'suburb', 11, 10.5], + 15, + ['match', ['get', 'type'], 'suburb', 17, 16], + ], + }, + maxzoom: 15, + filter: [ + 'all', + ['==', ['get', 'class'], 'settlement_subdivision'], + ['<=', ['get', 'filterrank'], 4], + ], + type: 'symbol', + source: 'composite', + id: 'settlement-subdivision-label', + paint: { + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1, + 'text-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 11, + 'hsl(100, 10%, 20%)', + 14, + 'hsl(100, 10%, 30%)', + ], + 'text-halo-blur': 0.5, + }, + 'source-layer': 'place_label', + }, + { + layout: { + 'text-line-height': 1.1, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 3, + [ + 'step', + ['get', 'symbolrank'], + 12, + 9, + 11, + 10, + 10.5, + 12, + 9.5, + 14, + 8.5, + 16, + 6.5, + 17, + 4, + ], + 15, + [ + 'step', + ['get', 'symbolrank'], + 28, + 9, + 26, + 10, + 23, + 11, + 21, + 12, + 20, + 13, + 19, + 15, + 17, + ], + ], + 'icon-image': [ + 'case', + ['==', ['get', 'capital'], 2], + 'border-dot-13', + ['step', ['get', 'symbolrank'], 'dot-11', 9, 'dot-10', 11, 'dot-9'], + ], + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + 'text-justify': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + ['left', 'bottom-left', 'top-left'], + 'left', + ['right', 'bottom-right', 'top-right'], + 'right', + 'center', + ], + 8, + 'center', + ], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'capital'], + 2, + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.3]], + 'bottom-left', + ['literal', [0.3, -0.1]], + 'left', + ['literal', [0.45, 0.1]], + 'top-left', + ['literal', [0.3, 0.1]], + 'top', + ['literal', [0, 0.3]], + 'top-right', + ['literal', [-0.3, 0.1]], + 'right', + ['literal', [-0.45, 0]], + 'bottom-right', + ['literal', [-0.3, -0.1]], + ['literal', [0, -0.3]], + ], + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.25]], + 'bottom-left', + ['literal', [0.2, -0.05]], + 'left', + ['literal', [0.4, 0.05]], + 'top-left', + ['literal', [0.2, 0.05]], + 'top', + ['literal', [0, 0.25]], + 'top-right', + ['literal', [-0.2, 0.05]], + 'right', + ['literal', [-0.4, 0.05]], + 'bottom-right', + ['literal', [-0.2, -0.05]], + ['literal', [0, -0.25]], + ], + ], + 8, + ['literal', [0, 0]], + ], + 'text-anchor': [ + 'step', + ['zoom'], + ['get', 'text_anchor'], + 8, + 'center', + ], + 'text-field': ['get', 'name'], + 'text-max-width': 7, + }, + maxzoom: 15, + filter: [ + 'all', + ['<=', ['get', 'filterrank'], 5], + ['==', ['get', 'class'], 'settlement'], + [ + 'step', + ['zoom'], + true, + 13, + ['>=', ['get', 'symbolrank'], 11], + 14, + ['>=', ['get', 'symbolrank'], 13], + ], + ['match', ['get', 'iso_3166_1'], ['NO'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'settlement-label', + paint: { + 'text-color': 'hsl(100, 10%, 15%)', + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1, + 'icon-opacity': ['step', ['zoom'], 1, 8, 0], + 'text-halo-blur': 1, + }, + 'source-layer': 'place_label', + }, + { + layout: { + 'text-line-height': 1.1, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 3, + [ + 'step', + ['get', 'symbolrank'], + 12, + 9, + 11, + 10, + 10.5, + 12, + 9.5, + 14, + 8.5, + 16, + 6.5, + 17, + 4, + ], + 15, + [ + 'step', + ['get', 'symbolrank'], + 28, + 9, + 26, + 10, + 23, + 11, + 21, + 12, + 20, + 13, + 19, + 15, + 17, + ], + ], + 'icon-image': [ + 'case', + ['==', ['get', 'capital'], 2], + 'border-dot-13', + ['step', ['get', 'symbolrank'], 'dot-11', 9, 'dot-10', 11, 'dot-9'], + ], + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + 'text-justify': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + ['left', 'bottom-left', 'top-left'], + 'left', + ['right', 'bottom-right', 'top-right'], + 'right', + 'center', + ], + 8, + 'center', + ], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'capital'], + 2, + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.3]], + 'bottom-left', + ['literal', [0.3, -0.1]], + 'left', + ['literal', [0.45, 0.1]], + 'top-left', + ['literal', [0.3, 0.1]], + 'top', + ['literal', [0, 0.3]], + 'top-right', + ['literal', [-0.3, 0.1]], + 'right', + ['literal', [-0.45, 0]], + 'bottom-right', + ['literal', [-0.3, -0.1]], + ['literal', [0, -0.3]], + ], + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.25]], + 'bottom-left', + ['literal', [0.2, -0.05]], + 'left', + ['literal', [0.4, 0.05]], + 'top-left', + ['literal', [0.2, 0.05]], + 'top', + ['literal', [0, 0.25]], + 'top-right', + ['literal', [-0.2, 0.05]], + 'right', + ['literal', [-0.4, 0.05]], + 'bottom-right', + ['literal', [-0.2, -0.05]], + ['literal', [0, -0.25]], + ], + ], + 8, + ['literal', [0, 0]], + ], + 'text-anchor': [ + 'step', + ['zoom'], + ['get', 'text_anchor'], + 8, + 'center', + ], + 'text-field': ['get', 'name'], + 'text-max-width': 7, + }, + maxzoom: 15, + filter: [ + 'all', + ['<=', ['get', 'filterrank'], 5], + ['==', ['get', 'class'], 'settlement'], + [ + 'step', + ['zoom'], + true, + 13, + ['>=', ['get', 'symbolrank'], 11], + 14, + ['>=', ['get', 'symbolrank'], 13], + ], + ['match', ['get', 'iso_3166_1'], ['SE'], true, false], + ], + type: 'symbol', + source: 'composite', + id: 'settlement-label utland', + paint: { + 'text-color': '#37424a', + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1, + 'icon-opacity': ['step', ['zoom'], 1, 8, 0], + 'text-halo-blur': 1, + }, + 'source-layer': 'place_label', + }, + { + minzoom: 3, + layout: { + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.85, 0.7, 0.65, 1], + ['zoom'], + 4, + ['step', ['get', 'symbolrank'], 10, 6, 9.5, 7, 9], + 9, + ['step', ['get', 'symbolrank'], 24, 6, 18, 7, 14], + ], + 'text-transform': 'uppercase', + 'text-font': ['DIN Offc Pro Bold', 'Arial Unicode MS Bold'], + 'text-field': [ + 'step', + ['zoom'], + [ + 'step', + ['get', 'symbolrank'], + ['coalesce', ['get', 'name_en'], ['get', 'name']], + 5, + [ + 'coalesce', + ['get', 'abbr'], + ['get', 'name_en'], + ['get', 'name'], + ], + ], + 5, + ['get', 'name'], + ], + 'text-letter-spacing': 0.15, + 'text-max-width': 6, + }, + maxzoom: 9, + filter: ['==', ['get', 'class'], 'state'], + type: 'symbol', + source: 'composite', + id: 'state-label', + paint: { + 'text-color': '#37424a', + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1, + }, + 'source-layer': 'place_label', + }, + { + minzoom: 1, + layout: { + 'text-line-height': 1.1, + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.7, 1], + ['zoom'], + 1, + ['step', ['get', 'symbolrank'], 11, 4, 9, 5, 8], + 9, + ['step', ['get', 'symbolrank'], 28, 4, 22, 5, 21], + ], + 'icon-image': 'dot-11', + 'text-font': ['DIN Offc Pro Medium', 'Arial Unicode MS Regular'], + 'text-justify': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + ['left', 'bottom-left', 'top-left'], + 'left', + ['right', 'bottom-right', 'top-right'], + 'right', + 'center', + ], + 7, + 'center', + ], + 'text-offset': [ + 'step', + ['zoom'], + [ + 'match', + ['get', 'text_anchor'], + 'bottom', + ['literal', [0, -0.25]], + 'bottom-left', + ['literal', [0.2, -0.05]], + 'left', + ['literal', [0.4, 0.05]], + 'top-left', + ['literal', [0.2, 0.05]], + 'top', + ['literal', [0, 0.25]], + 'top-right', + ['literal', [-0.2, 0.05]], + 'right', + ['literal', [-0.4, 0.05]], + 'bottom-right', + ['literal', [-0.2, -0.05]], + ['literal', [0, -0.25]], + ], + 7, + ['literal', [0, 0]], + ], + 'text-anchor': [ + 'step', + ['zoom'], + ['coalesce', ['get', 'text_anchor'], 'center'], + 7, + 'center', + ], + 'text-field': ['get', 'name'], + 'text-max-width': 6, + }, + maxzoom: 10, + filter: ['==', ['get', 'class'], 'country'], + type: 'symbol', + source: 'composite', + id: 'country-label', + paint: { + 'icon-opacity': [ + 'step', + ['zoom'], + ['case', ['has', 'text_anchor'], 1, 0], + 7, + 0, + ], + 'text-color': '#37424a', + 'text-halo-color': [ + 'interpolate', + ['linear'], + ['zoom'], + 2, + 'rgba(255,255,255,0.75)', + 3, + 'hsl(0, 0%, 100%)', + ], + 'text-halo-width': 1.25, + }, + 'source-layer': 'place_label', + }, + { + minzoom: 15, + layout: { + 'text-field': ['to-string', ['get', 'name']], + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 15, + 12, + 19, + 16, + ], + 'text-line-height': 1.1, + 'text-max-width': 7, + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + }, + filter: [ + 'all', + ['match', ['get', 'type'], ['Park'], true, false], + ['==', ['get', ''], ''], + ], + type: 'symbol', + source: 'composite', + id: 'poi-parks_graves', + paint: { + 'text-color': '#178038', + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + 'source-layer': 'poi_label', + }, + { + minzoom: 15, + layout: { + 'text-field': ['to-string', ['get', 'name']], + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 15, + 12, + 19, + 16, + ], + 'text-line-height': 1.1, + 'text-max-width': 7, + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + }, + filter: ['match', ['get', 'type'], ['Hospital'], true, false], + type: 'symbol', + source: 'composite', + id: 'poi-sykehus', + paint: { + 'text-color': 'hsl(100, 0%, 40%)', + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + 'source-layer': 'poi_label', + }, + { + minzoom: 15, + layout: { + 'text-field': ['to-string', ['get', 'name']], + 'text-size': [ + 'interpolate', + ['cubic-bezier', 0.2, 0, 0.9, 1], + ['zoom'], + 15, + 12, + 19, + 16, + ], + 'text-line-height': 1.1, + 'text-max-width': 7, + 'text-font': [ + 'step', + ['zoom'], + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + 8, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 11, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 10, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 12, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 11, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 13, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 12, + [ + 'step', + ['get', 'symbolrank'], + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + 15, + ['literal', ['DIN Offc Pro Regular', 'Arial Unicode MS Regular']], + ], + 13, + ['literal', ['DIN Offc Pro Medium', 'Arial Unicode MS Regular']], + ], + }, + filter: [ + 'match', + ['get', 'type'], + ['Stadium', 'Cemetery'], + true, + false, + ], + type: 'symbol', + source: 'composite', + id: 'poi-stadium', + paint: { + 'text-halo-color': '#fff', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'text-color': '#178038', + }, + 'source-layer': 'poi_label', + }, + ], + }; +}; diff --git a/src/mapbox-styles/mapbox-color-theme-data.json b/src/mapbox-styles/mapbox-color-theme-data.json new file mode 100644 index 0000000..51a39f6 --- /dev/null +++ b/src/mapbox-styles/mapbox-color-theme-data.json @@ -0,0 +1,3 @@ +{ + "data": "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" +} diff --git a/src/mapbox-styles/mapbox-color-theme.ts b/src/mapbox-styles/mapbox-color-theme.ts new file mode 100644 index 0000000..0fcfdab --- /dev/null +++ b/src/mapbox-styles/mapbox-color-theme.ts @@ -0,0 +1,11 @@ +/** + * https://docs.mapbox.com/help/tutorials/create-a-custom-color-theme/?step=7 + * colorTheme has data created based on ./mapbox-color-theme.png, + * which in turn is a customized version of ./mapbox-color-theme-standard-neutral.png, which is used by default by mapbox if no colorTheme is specified. + * + * Changes applied: + * - slightly brighter + * - slightly less saturation + */ +import data from './mapbox-color-theme-data.json'; +export const colorTheme = data; // To avoid slow ts processing, the data is in its own json file. diff --git a/src/mapbox-styles/pin-types.ts b/src/mapbox-styles/pin-types.ts new file mode 100644 index 0000000..b17f035 --- /dev/null +++ b/src/mapbox-styles/pin-types.ts @@ -0,0 +1,36 @@ +import {Theme, Themes} from '@atb-as/theme'; + +export type NsrPinIconCode = + | 'commuterparking' + | 'boat' + | 'tram' + | 'metroandtram' + | 'metro' + | 'ferry' + | 'plane' + | 'helicopter' + | 'train' + | 'busandtram' + | 'bus'; + +export type VehicleIconCode = + 'boat' | 'citybike' | 'citybus' | 'scooter' | 'sharedcar' | 'train' | 'tram'; + +export type StationIconCode = 'sharedcar' | 'citybike'; + +export type PinScooterCompany = 'generic' | 'voi' | 'ryde' | 'dott'; + +export type LiveVehiclePinState = + 'active' | 'activeerror' | 'activewaiting' | 'indicator'; + +export type PinType = 'vehicle' | 'station' | 'stop' | 'unknown'; // 'unknown' is used for features that does not match the expected schemas +export type PinIconCode = NsrPinIconCode | VehicleIconCode | StationIconCode; +export type PinState = + 'default' | 'minimized' | 'selected' | 'cluster' | LiveVehiclePinState; +export type PinTheme = keyof Themes; // 'light' | 'dark' + +// examples: stoppin_bus_default_light, vehiclepin_scooter_active_light, vehiclepin_scooter_minimized_generic_light +// todo if possible: use for mapbox style expression with type safety (and ensure only existing combinations are allowed in this type) +export type PinIcon = + | `${PinType}pin_${PinIconCode}_${PinState}_${PinTheme}` + | `${PinType}pin_${PinIconCode}_${PinState}_${PinScooterCompany}_${PinTheme}`; diff --git a/src/national-stop-registry/nsr-layers.ts b/src/national-stop-registry/nsr-layers.ts new file mode 100644 index 0000000..95ab3f7 --- /dev/null +++ b/src/national-stop-registry/nsr-layers.ts @@ -0,0 +1,245 @@ +import {Expression, FilterExpression, TextField} from '../types'; +type ExpressionField = Expression[1]; + +import {NsrPinIconCode} from '../mapbox-styles/pin-types'; + +/** + * An NsrLayer represents core static data for a layer, specific for National Stop Registry (NSR) data. + * Further dynamic props are added with hooks to get all props needed for a layer. + * @property {string} id - A unique identifier for the layer. + * @property {number} reachFullScaleAtZoomLevel - The zoom level at which the icon reaches full size (and opacity 1) when zooming in. + * @property {FilterExpression} filter - Filter to select specific NSR items relevant to the layer. + */ +export type NsrLayer = { + id: string; + reachFullScaleAtZoomLevel: number; + filter: FilterExpression; + textField?: TextField; +}; + +/** + * An NsrCircleLayer is an NsrLayer displayed with circles. + */ +type NsrCircleLayer = NsrLayer; + +/** + * Whether the text should be displayed under the icon or in the middle. + */ +export enum NsrSymbolLayerTextLocation { + BelowIcon, + InsideCircle, +} +/** + * An NsrSymbolLayer is an NsrLayer displayed with icons. + * @property {NsrPinIconCode} iconCode - The icon code associated with this layer. Should match part of file names chosen for icons in sprites. + * @property {NsrSymbolLayerTextLocation} textLocation + */ +type NsrSymbolLayer = NsrLayer & + ( + | { + iconCode: NsrPinIconCode; + textLocation: NsrSymbolLayerTextLocation.BelowIcon; + } + | { + iconCode: undefined; + textLocation: NsrSymbolLayerTextLocation.InsideCircle; + } + ); + +const quaysBaseLayer: NsrLayer = { + // Note: Quays from mapbox geojson via the asag repo do not contain info to know which stopPlaceType it belongs to. As a Martin Tile Vector Source though, we can add add this. E.g. then we can select boat instead of city for boat harbour quays. + id: 'quays.nsr.api', + reachFullScaleAtZoomLevel: 17.5, + filter: ['all', ['match', ['get', 'entityType'], ['Quay'], true, false]], + textField: ['get', 'publicCode'], +}; + +export const nsrCircleLayers: NsrCircleLayer[] = [ + {...quaysBaseLayer, id: quaysBaseLayer.id + '_circle'}, +]; + +/** + * Always use type 'all', which is extendable by appending. + * Note: cannot include hideItemsInTheDistanceFilter here as this part of the filter + * is also used not as the root, and ['pitch'] must be used as root in style. + */ +const getAllFilter: ( + filterConditions: ExpressionField[], +) => FilterExpression = (filterConditions) => ['all', ...filterConditions]; + +const isStopPlaceEntityType: Expression = [ + 'match', + ['get', 'entityType'], + ['StopPlace'], + true, + false, +]; +const stopPlaceType: Expression = ['get', 'stopPlaceType']; +const hasAdjacentSites: Expression = ['has', 'adjacentSites']; +const nameTextField: NsrLayer['textField'] = ['get', 'name']; +const busMetroTramStopZoomLevel = 13; + +export const nsrSymbolLayers: NsrSymbolLayer[] = [ + { + ...quaysBaseLayer, + id: quaysBaseLayer.id + '_text', + iconCode: undefined, + textLocation: NsrSymbolLayerTextLocation.InsideCircle, + }, + { + id: 'carparking.nsr.api', + iconCode: 'commuterparking', + reachFullScaleAtZoomLevel: 13, + filter: getAllFilter([ + ['match', ['get', 'entityType'], ['Parking'], true, false], + ['match', ['get', 'parkingVehicleTypes'], ['car'], true, false], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'tram.nsr.api', + iconCode: 'tram', + reachFullScaleAtZoomLevel: busMetroTramStopZoomLevel, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['onstreetTram'], true, false], + ['!', hasAdjacentSites], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'metro.tram.nsr.api', + iconCode: 'metroandtram', // Bekkestua seems to be the only one matching this + reachFullScaleAtZoomLevel: busMetroTramStopZoomLevel, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', ['get', 'isPrimaryAdjacentSite'], ['true'], true, false], + [ + 'match', + ['get', 'finalStopPlaceType'], + ['localTram_metroStation'], + true, + false, + ], + hasAdjacentSites, + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'metro.nsr.api', + reachFullScaleAtZoomLevel: busMetroTramStopZoomLevel, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['metroStation'], true, false], + ['!', hasAdjacentSites], + ]), + iconCode: 'metro', + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + + { + id: 'bus.tram.nsr.api', + iconCode: 'busandtram', + reachFullScaleAtZoomLevel: busMetroTramStopZoomLevel, + filter: getAllFilter([ + isStopPlaceEntityType, + hasAdjacentSites, + [ + 'match', + ['get', 'finalStopPlaceType'], + ['onstreetBus_onstreetTram', 'localTram_onstreetBus'], + true, + false, + ], + ['match', ['get', 'isPrimaryAdjacentSite'], ['true'], true, false], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'bussterminal.nsr.api', + iconCode: 'bus', + reachFullScaleAtZoomLevel: busMetroTramStopZoomLevel, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['busStation'], true, false], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'bus.nsr.api', + iconCode: 'bus', + reachFullScaleAtZoomLevel: busMetroTramStopZoomLevel, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['onstreetBus'], true, false], + ['match', ['get', 'submode'], ['railReplacementBus'], false, true], + ['!', hasAdjacentSites], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'ferjekai.nsr.api', + iconCode: 'ferry', + reachFullScaleAtZoomLevel: 12, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['harbourPort'], true, false], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'boat.nsr.api', + iconCode: 'boat', + reachFullScaleAtZoomLevel: 12, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['ferryStop'], true, false], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'railway.nsr.api', + iconCode: 'train', + reachFullScaleAtZoomLevel: 12, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['railStation'], true, false], + ['match', ['get', 'submode'], ['touristRailway'], false, true], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'helicopter.nsr.api', + iconCode: 'helicopter', + reachFullScaleAtZoomLevel: 10, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['airport'], true, false], + ['match', ['get', 'submode'], ['helicopterService'], true, false], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, + { + id: 'airport.nsr.api', + iconCode: 'plane', + reachFullScaleAtZoomLevel: 9, + filter: getAllFilter([ + isStopPlaceEntityType, + ['match', stopPlaceType, ['airport'], true, false], + ['match', ['get', 'submode'], ['helicopterService'], false, true], + ]), + textField: nameTextField, + textLocation: NsrSymbolLayerTextLocation.BelowIcon, + }, +]; diff --git a/src/national-stop-registry/nsr-utils.ts b/src/national-stop-registry/nsr-utils.ts new file mode 100644 index 0000000..e7417ee --- /dev/null +++ b/src/national-stop-registry/nsr-utils.ts @@ -0,0 +1,181 @@ +import {Expression, FilterExpression} from '../types'; +import {NsrLayer} from './nsr-layers'; +import {NsrPinIconCode, PinTheme, PinType} from '../mapbox-styles/pin-types'; + +export const getNsrLayerSourceProps = ( + mapboxNsrSourceLayerId: string, + layerId: string, +): {sourceID: string; sourceLayerID: string; id: string} => ({ + sourceID: 'composite', + sourceLayerID: mapboxNsrSourceLayerId, + id: layerId, +}); + +export const getFilterWhichAlsoHidesSelectedFeature = ( + /** + * @property {FilterExpression} filter should be an array with 'all' as the first element + */ + filter: FilterExpression, + selectedFeaturePropertyId: string | undefined, +): FilterExpression => [ + ...filter, + ['!=', ['get', 'id'], selectedFeaturePropertyId ?? ''], +]; + +const scaleTransitionZoomRange = 1.5; // icon starts very small and then reaches full size across this zoom range +const opacityTransitionExtraZoomRange = scaleTransitionZoomRange / 8; + +type IconImageProps = { + iconCode: NsrPinIconCode; + themeName: PinTheme; +}; + +const nsrPinType: PinType = 'stop'; // pinType = 'stop' for all NSR items + +const getExpressionForNsrIconImage = ( + iconType: 'default' | 'minimized', + iconImageProps: IconImageProps, + aFeatureIsSelected: boolean, +): Expression => [ + 'concat', + nsrPinType, + 'pin_', + iconImageProps.iconCode, + '_', + ['case', aFeatureIsSelected, 'minimized', iconType], + '_', + iconImageProps.themeName, +]; + +export type LayerPropsDeterminedByZoomLevelParams = { + reachFullScaleAtZoomLevel: NsrLayer['reachFullScaleAtZoomLevel']; + selectedFeaturePropertyId: string | undefined; + iconImageProps?: IconImageProps; + opacityTransitionZoomRangeDelay?: number; + showTextWhileAFeatureIsSelected?: boolean; + iconFullSize?: number; + textSizeFactor?: number; +}; + +type LayerPropsDeterminedByZoomLevel = { + minZoomLevel: number; + style: { + iconImage: Expression | string; + iconSize: Expression; + iconOpacity: Expression; + textSize: Expression; + textOpacity: Expression | number; + }; +}; + +/* + * Standardized calculations for icon size and opacity zoom transitions. + * (Inlined from the mobile app's map utils.) + */ +const getIconZoomTransitionStyle = ( + reachFullScaleAtZoomLevel: number, + iconFullSize: number | Expression, + scaleTransitionZoomRangeArg: number, + opacityTransitionExtraZoomRangeArg: number, +): {iconSize: Expression; iconOpacity: Expression} => { + const iconOpacity: Expression = [ + 'interpolate', + ['linear'], + ['zoom'], + reachFullScaleAtZoomLevel - scaleTransitionZoomRangeArg, + 0, + reachFullScaleAtZoomLevel - + scaleTransitionZoomRangeArg + + opacityTransitionExtraZoomRangeArg, + 1, + ]; + + const iconSize: Expression = [ + 'interpolate', + ['linear'], + ['zoom'], + reachFullScaleAtZoomLevel - scaleTransitionZoomRangeArg, + 0.3, + reachFullScaleAtZoomLevel, + iconFullSize, + ]; + + return {iconSize, iconOpacity}; +}; + +export const getLayerPropsDeterminedByZoomLevel: ( + layerPropsDeterminedByZoomLevelProps: LayerPropsDeterminedByZoomLevelParams, +) => LayerPropsDeterminedByZoomLevel = ({ + reachFullScaleAtZoomLevel, + selectedFeaturePropertyId, + iconImageProps, + opacityTransitionZoomRangeDelay = 0.8, + showTextWhileAFeatureIsSelected = false, + iconFullSize = 1, + textSizeFactor = 1, +}) => { + const aFeatureIsSelected = + !!selectedFeaturePropertyId && selectedFeaturePropertyId !== ''; + + const iconImage = !iconImageProps + ? '' + : getExpressionForNsrIconImage( + 'default', + iconImageProps, + aFeatureIsSelected, + ); + + // mapbox breaks unless iconImage is either a string literal directly, or in a zoom step or interpolate function, + // so here it is wrapped with a step function that always returns the same + const iconImageWrapped: Expression = [ + 'step', + ['zoom'], + iconImage, + reachFullScaleAtZoomLevel, + iconImage, + ]; + + const {iconOpacity, iconSize} = getIconZoomTransitionStyle( + reachFullScaleAtZoomLevel, + iconFullSize, + scaleTransitionZoomRange, + opacityTransitionExtraZoomRange, + ); + + // Icons and labels start small and invisible, then grow and become more visible and prominent as you zoom in. + return { + minZoomLevel: reachFullScaleAtZoomLevel - scaleTransitionZoomRange, + style: { + iconImage: iconImageWrapped, + iconOpacity, + iconSize, + textSize: [ + 'interpolate', + ['exponential', 1.5], + ['zoom'], + 14, + textSizeFactor * 13, + 22, + textSizeFactor * 27, + ], + textOpacity: + aFeatureIsSelected && !showTextWhileAFeatureIsSelected + ? 0 + : [ + 'interpolate', + ['linear'], + ['zoom'], + Math.max( + reachFullScaleAtZoomLevel + opacityTransitionZoomRangeDelay, + 13.75, + ) - opacityTransitionExtraZoomRange, + 0, + Math.max( + reachFullScaleAtZoomLevel + opacityTransitionZoomRangeDelay, + 13.75, + ), + 1, + ], + }, + }; +}; diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..d4f9846 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,117 @@ +// Style-spec expression types, vendored from `@rnmapbox/maps`'s +// `MapboxStyles.d.ts`. We can't re-export from `@rnmapbox/maps` directly +// because its `package.json` `exports` field blocks the deep import path +// under `nodenext` / `bundler` module resolution, and inlining the types +// keeps this package free of an `@rnmapbox/maps` peer dependency (which +// would be surprising for web-only consumers). +// +// Using the strict literal-union `ExpressionName` (rather than +// `Expression = any[]`) gives us: +// - Autocomplete + typo detection on operator names inside this package. +// - Cross-platform drift caught at the construction site: an operator not +// in this union fails to compile here, before it can reach a consumer. +// - Zero casts for the app-side consumer (types match `@rnmapbox/maps`). +// - Zero casts for the web-side consumer: `mapbox-gl`'s +// `ExpressionSpecification` is `[string, ...any[]]` (looser), so a value +// typed as `readonly [ExpressionName, ...]` flows in without a cast. +// +// Keep in sync with `@rnmapbox/maps` if their `ExpressionName` union grows. + +type ExpressionName = + | 'array' + | 'boolean' + | 'collator' + | 'format' + | 'image' + | 'literal' + | 'number' + | 'number-format' + | 'object' + | 'string' + | 'to-boolean' + | 'to-color' + | 'to-number' + | 'to-string' + | 'typeof' + | 'accumulated' + | 'feature-state' + | 'geometry-type' + | 'id' + | 'line-progress' + | 'properties' + | 'at' + | 'get' + | 'has' + | 'in' + | 'index-of' + | 'length' + | 'slice' + | '!' + | '!=' + | '<' + | '<=' + | '==' + | '>' + | '>=' + | 'all' + | 'any' + | 'case' + | 'match' + | 'coalesce' + | 'within' + | 'interpolate' + | 'interpolate-hcl' + | 'interpolate-lab' + | 'step' + | 'let' + | 'var' + | 'concat' + | 'downcase' + | 'is-supported-script' + | 'resolved-locale' + | 'upcase' + | 'rgb' + | 'rgba' + | 'to-rgba' + | '-' + | '*' + | '/' + | '%' + | '^' + | '+' + | 'abs' + | 'acos' + | 'asin' + | 'atan' + | 'ceil' + | 'cos' + | 'distance' + | 'e' + | 'floor' + | 'ln' + | 'ln2' + | 'log10' + | 'log2' + | 'max' + | 'min' + | 'pi' + | 'round' + | 'sin' + | 'sqrt' + | 'tan' + | 'zoom' + | 'heatmap-density'; + +type ExpressionField = + | string + | number + | boolean + | Expression + | ExpressionField[] + | {[key: string]: ExpressionField}; + +export type Expression = readonly [ExpressionName, ...ExpressionField[]]; +export type FilterExpression = Expression; + +// Value of a text-field property — a string or expression that produces a string. +export type TextField = string | Expression; From 1a528c1ca41e66264fbea7ee2fdc5cb278275857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B8ran=20Dalum?= Date: Thu, 9 Jul 2026 14:48:10 +0200 Subject: [PATCH 2/2] move two functions --- src/index.ts | 7 ++- ...ilter-which-also-hides-selected-feature.ts | 18 +++++++ .../get-icon-zoom-transition-style.ts | 35 +++++++++++++ src/national-stop-registry/nsr-utils.ts | 49 +------------------ 4 files changed, 61 insertions(+), 48 deletions(-) create mode 100644 src/mapbox-styles/get-filter-which-also-hides-selected-feature.ts create mode 100644 src/mapbox-styles/get-icon-zoom-transition-style.ts diff --git a/src/index.ts b/src/index.ts index e1300c3..fed1371 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,9 @@ export {getMapboxDarkStyle} from './mapbox-styles/get-mapbox-dark-style'; // Standard basemap color-theme (used inside style imports). export {colorTheme} from './mapbox-styles/mapbox-color-theme'; +// Standardized calculations for icon size and opacity zoom transitions. +export {getIconZoomTransitionStyle} from './mapbox-styles/get-icon-zoom-transition-style'; + // Pin naming (used for sprite icon references like `stoppin_bus_default_light`). export type { NsrPinIconCode, @@ -20,6 +23,9 @@ export type { PinIcon, } from './mapbox-styles/pin-types'; +// Filter helper for hiding the currently-selected feature from a layer. +export {getFilterWhichAlsoHidesSelectedFeature} from './mapbox-styles/get-filter-which-also-hides-selected-feature'; + // National Stop Registry (NSR) — layer definitions + zoom-transition math. export { nsrCircleLayers, @@ -29,7 +35,6 @@ export { export type {NsrLayer} from './national-stop-registry/nsr-layers'; export { getNsrLayerSourceProps, - getFilterWhichAlsoHidesSelectedFeature, getLayerPropsDeterminedByZoomLevel, } from './national-stop-registry/nsr-utils'; export type {LayerPropsDeterminedByZoomLevelParams} from './national-stop-registry/nsr-utils'; diff --git a/src/mapbox-styles/get-filter-which-also-hides-selected-feature.ts b/src/mapbox-styles/get-filter-which-also-hides-selected-feature.ts new file mode 100644 index 0000000..5994898 --- /dev/null +++ b/src/mapbox-styles/get-filter-which-also-hides-selected-feature.ts @@ -0,0 +1,18 @@ +import {FilterExpression} from '../types'; + +/** + * Extends a layer filter with a condition that hides the currently selected + * feature. Useful when the selected feature is rendered separately (e.g. in + * its own layer with different styling), so it should be omitted from the + * default layer to avoid rendering it twice. + * + * @param filter - existing filter, must be an array with 'all' as the first element + * @param selectedFeaturePropertyId - id of the feature to hide, or undefined for none + */ +export const getFilterWhichAlsoHidesSelectedFeature = ( + filter: FilterExpression, + selectedFeaturePropertyId: string | undefined, +): FilterExpression => [ + ...filter, + ['!=', ['get', 'id'], selectedFeaturePropertyId ?? ''], +]; diff --git a/src/mapbox-styles/get-icon-zoom-transition-style.ts b/src/mapbox-styles/get-icon-zoom-transition-style.ts new file mode 100644 index 0000000..bb48d71 --- /dev/null +++ b/src/mapbox-styles/get-icon-zoom-transition-style.ts @@ -0,0 +1,35 @@ +import {Expression} from '../types'; + +/* + * Standardized calculations for icon size and opacity zoom transitions. + */ +export const getIconZoomTransitionStyle = ( + reachFullScaleAtZoomLevel: number, + iconFullSize: number | Expression, + scaleTransitionZoomRange: number, + opacityTransitionExtraZoomRange: number, +): {iconSize: Expression; iconOpacity: Expression} => { + const iconOpacity: Expression = [ + 'interpolate', + ['linear'], + ['zoom'], + reachFullScaleAtZoomLevel - scaleTransitionZoomRange, + 0, + reachFullScaleAtZoomLevel - + scaleTransitionZoomRange + + opacityTransitionExtraZoomRange, + 1, + ]; + + const iconSize: Expression = [ + 'interpolate', + ['linear'], + ['zoom'], + reachFullScaleAtZoomLevel - scaleTransitionZoomRange, + 0.3, + reachFullScaleAtZoomLevel, + iconFullSize, + ]; + + return {iconSize, iconOpacity}; +}; diff --git a/src/national-stop-registry/nsr-utils.ts b/src/national-stop-registry/nsr-utils.ts index e7417ee..1f6cbbb 100644 --- a/src/national-stop-registry/nsr-utils.ts +++ b/src/national-stop-registry/nsr-utils.ts @@ -1,6 +1,7 @@ -import {Expression, FilterExpression} from '../types'; +import {Expression} from '../types'; import {NsrLayer} from './nsr-layers'; import {NsrPinIconCode, PinTheme, PinType} from '../mapbox-styles/pin-types'; +import {getIconZoomTransitionStyle} from '../mapbox-styles/get-icon-zoom-transition-style'; export const getNsrLayerSourceProps = ( mapboxNsrSourceLayerId: string, @@ -11,17 +12,6 @@ export const getNsrLayerSourceProps = ( id: layerId, }); -export const getFilterWhichAlsoHidesSelectedFeature = ( - /** - * @property {FilterExpression} filter should be an array with 'all' as the first element - */ - filter: FilterExpression, - selectedFeaturePropertyId: string | undefined, -): FilterExpression => [ - ...filter, - ['!=', ['get', 'id'], selectedFeaturePropertyId ?? ''], -]; - const scaleTransitionZoomRange = 1.5; // icon starts very small and then reaches full size across this zoom range const opacityTransitionExtraZoomRange = scaleTransitionZoomRange / 8; @@ -68,41 +58,6 @@ type LayerPropsDeterminedByZoomLevel = { }; }; -/* - * Standardized calculations for icon size and opacity zoom transitions. - * (Inlined from the mobile app's map utils.) - */ -const getIconZoomTransitionStyle = ( - reachFullScaleAtZoomLevel: number, - iconFullSize: number | Expression, - scaleTransitionZoomRangeArg: number, - opacityTransitionExtraZoomRangeArg: number, -): {iconSize: Expression; iconOpacity: Expression} => { - const iconOpacity: Expression = [ - 'interpolate', - ['linear'], - ['zoom'], - reachFullScaleAtZoomLevel - scaleTransitionZoomRangeArg, - 0, - reachFullScaleAtZoomLevel - - scaleTransitionZoomRangeArg + - opacityTransitionExtraZoomRangeArg, - 1, - ]; - - const iconSize: Expression = [ - 'interpolate', - ['linear'], - ['zoom'], - reachFullScaleAtZoomLevel - scaleTransitionZoomRangeArg, - 0.3, - reachFullScaleAtZoomLevel, - iconFullSize, - ]; - - return {iconSize, iconOpacity}; -}; - export const getLayerPropsDeterminedByZoomLevel: ( layerPropsDeterminedByZoomLevelProps: LayerPropsDeterminedByZoomLevelParams, ) => LayerPropsDeterminedByZoomLevel = ({