From 891caa1c5fd147d772551c90ccacfb8bf0904810 Mon Sep 17 00:00:00 2001 From: araharah-executor Date: Thu, 22 Oct 2026 08:05:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(01-design-tokens-rams-foundation-03):=20Ra?= =?UTF-8?q?ms=20cartography=20basemap=20=E2=80=94=20liberty=20fork=20deriv?= =?UTF-8?q?ed=20from=20token=20package?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.mjs: fetches OpenFreeMap liberty style, parses theme/src/tokens.css, derives the full role palette in-script via desaturate(tokenHex, satMultiplier, lightnessPerRole) — no hand-tuned cartography hex (D-09) - liberty-rams.json (110 layers): grayscale/muted land + water, desaturated roads (hierarchy by weight only), muted matte-black labels at reduced opacity, zero-radius aesthetic enforced (halo-blur zeroed, building-3d faux-3D removed) (D-08) - accent guard: build fails if #EB8008/#ED3F1C/#736B1E (or rgb forms) leak into layers — route accent reserved for Phase 5 - D-10 font fallback: Space Grotesk/Geist probed on glyphs endpoint (404) → Noto Sans Bold/Regular substituted, recorded in style.metadata rams-font-substitutions - raster relief desaturated (raster-saturation -1); derivation provenance embedded in style.metadata rams-cartography - theme/package.json: basemap script --- theme/basemap/build.mjs | 445 +++ theme/basemap/liberty-rams.json | 6089 +++++++++++++++++++++++++++++++ theme/package.json | 3 +- 3 files changed, 6536 insertions(+), 1 deletion(-) create mode 100644 theme/basemap/build.mjs create mode 100644 theme/basemap/liberty-rams.json diff --git a/theme/basemap/build.mjs b/theme/basemap/build.mjs new file mode 100644 index 0000000..0b59b5d --- /dev/null +++ b/theme/basemap/build.mjs @@ -0,0 +1,445 @@ +#!/usr/bin/env node +/* + * araharah — Rams cartography basemap builder (D-08 / D-09 / D-10) + * ------------------------------------------------------------------ + * Forks the OpenFreeMap `liberty` vector style into the Telemetry + * Rams cartography: calibrated grayscale/muted grounding, desaturated + * roads (hierarchy by weight only), muted labels, zero accent colors. + * + * D-09: every cartographic value is DERIVED from the token package + * (theme/src/tokens.css) inside this script — no hand-tuned hex in + * the style JSON. The only literals below are the derivation + * parameters (saturation multipliers, lightness targets per role) + * that shape token genes into cartographic roles. + * + * D-08: signal-orange / functional-red / olive-green are reserved + * for the route line + hazard semantics rendered by later phases + * (Phase 5 owns the route vector). The accent guard at the bottom of + * this script fails the build if any of the three accents leak into + * the output layers. + * + * D-10: intended Rams label stacks (Space Grotesk for major place + * labels, Geist for minor) are probed on the OpenFreeMap glyphs + * endpoint at build time. The endpoint does not self-host them in + * Phase 1 (pbf glyph ranges), so the closest HOSTED stack is + * substituted and recorded in style.metadata["rams-font-substitutions"] + * — honest fallback provenance; Phase 5+ may move to self-hosted + * glyphs served from the Worker. + * + * Node >= 18 (global fetch). No dependencies beyond node builtins. + * + * Usage: npm run basemap --workspace theme + */ + +import { readFile, writeFile } from 'node:fs/promises'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const HERE = dirname(fileURLToPath(import.meta.url)); +const TOKENS_CSS = join(HERE, '../src/tokens.css'); // D-09 derivation source +const OUT_JSON = join(HERE, 'liberty-rams.json'); +const LIBERTY_URL = 'https://tiles.openfreemap.org/styles/liberty'; + +/* ———————————————————— color math (pure helpers) ———————————————————— */ + +const SAT_BAND = [0.06, 0.12]; // calibrated low-saturation band (Interfaces) + +const hexToRgb = (hex) => { + const n = Number.parseInt(hex.slice(1), 16); + return [(n >> 16) & 255, (n >> 8) & 255, n & 255]; +}; + +const rgbToHex = ([r, g, b]) => + '#' + [r, g, b].map((v) => v.toString(16).padStart(2, '0')).join('').toUpperCase(); + +/** average two token hexes — "between soft-beige and chassis-subtle" */ +const mixHex = (a, b) => { + const A = hexToRgb(a); + const B = hexToRgb(b); + return rgbToHex(A.map((v, i) => Math.round((v + B[i]) / 2))); +}; + +const rgbToHsl = ([r0, g0, b0]) => { + const r = r0 / 255, g = g0 / 255, b = b0 / 255; + const max = Math.max(r, g, b), min = Math.min(r, g, b); + let h = 0, s = 0; + const l = (max + min) / 2; + if (max !== min) { + const d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + default: h = (r - g) / d + 4; + } + h *= 60; + } + return [h, s, l]; +}; + +const hslToRgb = ([hDeg, s, l]) => { + const h = hDeg / 360; + const q = l < 0.5 ? l * (1 + s) : l + s - l * s; + const p = 2 * l - q; + const f = (t0) => { + const t = (t0 % 1 + 1) % 1; + if (t < 1 / 6) return p + (q - p) * 6 * t; + if (t < 1 / 2) return q; + if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; + return p; + }; + return [f(h + 1 / 3), f(h), f(h - 1 / 3)].map((v) => Math.round(v * 255)); +}; + +/** + * desaturate(hex, satMultiplier, lightness?) — the D-09 derivation core. + * hex→HSL, multiply saturation, clamp into the calibrated band + * [0.06, 0.12], then adjust lightness to the role target (Interfaces + * table). Hue genes from the source token are preserved — the whole + * palette stays one warm-neutral instrument family. + */ +const desaturate = (hex, satMultiplier, lightness) => { + const [h, s, l] = rgbToHsl(hexToRgb(hex)); + const sat = Math.min(Math.max(s * satMultiplier, SAT_BAND[0]), SAT_BAND[1]); + const lig = lightness === undefined ? l : lightness; + return rgbToHex(hslToRgb([h, sat, lig])); +}; + +/** token hex → rgba() string (labels, halos — matte-black at reduced opacity) */ +const rgba = (hex, alpha) => { + const [r, g, b] = hexToRgb(hex); + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +}; + +/* ———————————————————— token parsing (D-09) ———————————————————— */ + +const TOKEN_RE = /--color-([a-z0-9-]+):\s*(#[0-9A-Fa-f]{6})/g; + +function parseTokens(css) { + const map = new Map(); + for (const m of css.matchAll(TOKEN_RE)) map.set(m[1], m[2].toUpperCase()); + return map; +} + +/* Accent tokens are excluded from the derivation set by name AND by + * value (primary-container aliases the signal-orange hex) — D-08. */ +const EXCLUDED_TOKENS = new Set(['signal-orange', 'functional-red', 'olive-green']); +const ACCENT_HEXES = new Set(['#EB8008', '#ED3F1C', '#736B1E']); +const ACCENT_RGB_RES = [ + /\brgba?\(\s*235\s*,\s*128\s*,\s*8\b/i, // signal-orange + /\brgba?\(\s*237\s*,\s*63\s*,\s*28\b/i, // functional-red + /\brgba?\(\s*115\s*,\s*107\s*,\s*30\b/i, // olive-green +]; + +function token(tokens, name) { + const hex = tokens.get(name); + if (!hex) throw new Error(`token not found in tokens.css: --color-${name}`); + if (EXCLUDED_TOKENS.has(name)) { + throw new Error(`accent token excluded from basemap derivation: ${name} (D-08)`); + } + if (ACCENT_HEXES.has(hex)) { + throw new Error(`token ${name} carries an accent hex (${hex}) excluded from derivation (D-08)`); + } + return hex; +} + +/* ———————————————————— role palette (all derived) ———————————————————— */ + +function buildRoles(tokens) { + const T = (name) => token(tokens, name); + const roles = { + /* land ground: between soft-beige and chassis-subtle (Interfaces) */ + ground: desaturate(mixHex(T('soft-beige'), T('chassis-subtle')), 0.4), + /* parcel step slightly darker than ground (parks, landcover, landuse) */ + groundSubtle: desaturate(T('chassis-subtle'), 0.45), + /* mid-dark rule for parcel outlines / park rings */ + groundEdge: desaturate(T('matte-black'), 1, 0.62), + /* water: desaturated mid-gray derived from matte-black (Interfaces) */ + water: desaturate(T('matte-black'), 1, 0.71), + /* minor road cores — lightest neutral */ + roadFillMinor: desaturate(T('pure-white'), 1, 0.96), + /* major road cores — slightly darker than minor; hierarchy by weight */ + roadFillMajor: desaturate(T('surface-container-low'), 0.12, 0.92), + /* machined dark rule around road cores (1px/2px solid rules per design doc) */ + casing: desaturate(T('matte-black'), 1, 0.34), + rail: desaturate(T('matte-black'), 1, 0.48), + /* buildings: light gray within the calibrated band, darker than ground */ + buildingFill: desaturate(T('soft-beige'), 0.5, 0.76), + buildingEdge: desaturate(T('matte-black'), 1, 0.68), + boundary: desaturate(T('matte-black'), 1, 0.4), + aeroway: desaturate(T('chassis-subtle'), 0.5, 0.7), + }; + const derivations = { + ground: 'mix(soft-beige, chassis-subtle) · sat ×0.4 · band [0.06, 0.12]', + groundSubtle: 'chassis-subtle · sat ×0.45 (parcel step darker than ground)', + groundEdge: 'matte-black · sat ×1 (band-min) · L 0.62', + water: 'matte-black · sat ×1 (band-min) · L 0.71 (mid-gray)', + roadFillMinor: 'pure-white · sat ×1 (band-min) · L 0.96', + roadFillMajor: 'surface-container-low · sat ×0.12 · L 0.92 (slightly darker than minor)', + casing: 'matte-black · sat ×1 (band-min) · L 0.34 (machined rule)', + rail: 'matte-black · sat ×1 (band-min) · L 0.48', + buildingFill: 'soft-beige · sat ×0.5 · L 0.76', + buildingEdge: 'matte-black · sat ×1 (band-min) · L 0.68', + boundary: 'matte-black · sat ×1 (band-min) · L 0.40', + aeroway: 'chassis-subtle · sat ×0.5 · L 0.70', + }; + return { roles, derivations }; +} + +/* Labels: matte-black at reduced opacity (Interfaces); halo = ground tone */ +function buildLabelColors(roles, tokens) { + const matte = token(tokens, 'matte-black'); // allowed — not an accent + return { + minor: rgba(matte, 0.6), + major: rgba(matte, 0.82), + halo: rgba(roles.ground, 0.9), + }; +} + +/* ———————————————————— layer classification ———————————————————— */ + +/* Major place labels: city and above ("place-city, place-subtown and + * above" — liberty has no subtown layer; city-class and everything + * above it in the place hierarchy). Town/village/other, POIs, water + * names, highway names/shields, airports → minor. */ +const MAJOR_LABEL_IDS = new Set([ + 'label_country_1', + 'label_country_2', + 'label_country_3', + 'label_state', + 'label_city', + 'label_city_capital', +]); + +const ROAD_BODY_MAJOR = new Set(['motorway', 'motorway_link', 'trunk_primary', 'secondary_tertiary', 'link']); +const ROAD_BODY_MINOR = new Set(['minor', 'street', 'service_track', 'path_pedestrian']); + +function classifyRoadBody(body) { + if (/^(major_rail|transit_rail)(_hatching)?$/.test(body)) return 'rail'; + if (body.endsWith('_casing')) return 'casing'; + if (ROAD_BODY_MAJOR.has(body)) return 'roadFillMajor'; + if (ROAD_BODY_MINOR.has(body)) return 'roadFillMinor'; + return null; // road_area_pattern / one-way arrow symbols — untouched +} + +function classify(layer) { + const id = layer.id; + + /* all label-bearing symbols first (waterway_line_label etc.) */ + if (layer.type === 'symbol') { + if (layer.layout && Array.isArray(layer.layout['text-font'])) { + return { kind: 'label', major: MAJOR_LABEL_IDS.has(id) }; + } + return null; // icon-only symbols (one-way arrows) — untouched + } + + if (id === 'background') return { kind: 'role', role: 'ground' }; + if (id === 'building') return { kind: 'role', role: 'buildingFill', outline: 'buildingEdge' }; + if (id === 'water' || id.startsWith('waterway_')) return { kind: 'role', role: 'water' }; + if (id === 'park') return { kind: 'role', role: 'groundSubtle', outline: 'groundEdge' }; + if (id === 'park_outline') return { kind: 'role', role: 'groundEdge' }; + if (id.startsWith('landcover_') || id.startsWith('landuse_') || id === 'aeroway_fill') { + return { kind: 'role', role: 'groundSubtle', outline: 'groundEdge' }; + } + if (id.startsWith('aeroway_')) return { kind: 'role', role: 'aeroway' }; + if (id.startsWith('boundary_')) return { kind: 'role', role: 'boundary' }; + if (/^(road|tunnel|bridge)_/.test(id)) { + const role = classifyRoadBody(id.replace(/^(road|tunnel|bridge)_/, '')); + return role ? { kind: 'role', role } : null; + } + return null; +} + +/* ———————————————————— transform ———————————————————— */ + +function transformLayer(layer, ctx) { + if (layer.id === 'natural_earth') { + /* shaded-relief raster → fully desaturated (grayscale grounding) */ + layer.paint = layer.paint || {}; + layer.paint['raster-saturation'] = -1; + ctx.touched.push(`${layer.id} → raster-saturation −1`); + return layer; + } + + const spec = classify(layer); + if (!spec) { + ctx.untouched.push(layer.id); + return layer; + } + + const p = (layer.paint = layer.paint || {}); + + if (spec.kind === 'role') { + /* zoom-interpolated color ramps flatten to the role constant; + * width/opacity ramps are preserved — hierarchy by weight only */ + if ('background-color' in p) p['background-color'] = ctx.roles[spec.role]; + if ('fill-color' in p) p['fill-color'] = ctx.roles[spec.role]; + if ('fill-outline-color' in p) p['fill-outline-color'] = ctx.roles[spec.outline || spec.role]; + if ('line-color' in p) p['line-color'] = ctx.roles[spec.role]; + ctx.touched.push(`${layer.id} → ${spec.role}`); + } + + if (spec.kind === 'label') { + /* muted labels: matte-black at reduced opacity, ground-tone halo */ + p['text-color'] = spec.major ? ctx.labelColors.major : ctx.labelColors.minor; + p['text-halo-color'] = ctx.labelColors.halo; + if ('text-halo-blur' in p) p['text-halo-blur'] = 0; // Rams: zero blur + layer.layout['text-font'] = (spec.major ? ctx.fonts.served.major : ctx.fonts.served.minor).slice(); + ctx.touched.push(`${layer.id} → label(${spec.major ? 'major' : 'minor'})`); + } + + return layer; +} + +/* ———————————————————— font probing (D-10 fallback) ———————————————————— */ + +const FONT_INTENT = { + major: ['Space Grotesk Medium'], // Rams headline face for city-and-above + minor: ['Geist Regular', 'Space Grotesk Regular'], // Rams body face for the rest +}; +const FONT_FALLBACK = { + major: ['Noto Sans Bold'], // closest hosted stack to the headline-weight role + minor: ['Noto Sans Regular'], +}; + +async function probeGlyph(glyphsUrl, stack) { + const url = glyphsUrl + .replace('{fontstack}', encodeURIComponent(stack)) + .replace('{range}', '0-255'); + try { + const res = await fetch(url, { redirect: 'follow' }); + return res.ok; // 404 → false → substitution path + } catch { + return false; + } +} + +async function resolveFontStacks(glyphsUrl) { + const served = {}; + const substitutions = {}; + + for (const [kind, intentStacks] of Object.entries(FONT_INTENT)) { + const hosted = []; + for (const stack of intentStacks) { + if (await probeGlyph(glyphsUrl, stack)) hosted.push(stack); + } + if (hosted.length > 0) { + served[kind] = hosted; + } else { + for (const stack of FONT_FALLBACK[kind]) { + if (!(await probeGlyph(glyphsUrl, stack))) { + throw new Error(`fallback glyph stack not hosted either: ${stack}`); + } + } + served[kind] = FONT_FALLBACK[kind]; + substitutions[kind] = { + intended: intentStacks, + served: FONT_FALLBACK[kind], + reason: + 'not hosted on tiles.openfreemap.org glyphs endpoint (HTTP 404 at build time); ' + + 'closest hosted stack substituted. Self-hosted Rams woff2 (theme/fonts) cannot ' + + 'serve pbf glyph ranges in Phase 1 — revisit with a Worker-served glyphs route.', + }; + } + } + return { served, substitutions }; +} + +/* ———————————————————— accent guard (D-08) ———————————————————— */ + +function assertNoAccent(style) { + const json = JSON.stringify(style.layers); + for (const hex of ACCENT_HEXES) { + if (json.toUpperCase().includes(hex)) { + throw new Error(`accent leak: ${hex} present in output layers (D-08 violation)`); + } + } + for (const re of ACCENT_RGB_RES) { + if (re.test(json)) { + throw new Error(`accent leak (rgb form): ${re} matched output layers (D-08 violation)`); + } + } +} + +/* ———————————————————— main ———————————————————— */ + +async function main() { + const [tokensCss, styleRes] = await Promise.all([ + readFile(TOKENS_CSS, 'utf8'), + fetch(LIBERTY_URL, { redirect: 'follow' }), + ]); + if (!styleRes.ok) throw new Error(`liberty style fetch failed: HTTP ${styleRes.status}`); + const style = await styleRes.json(); + + const tokens = parseTokens(tokensCss); + if (tokens.size < 40) throw new Error(`token parse suspiciously thin: ${tokens.size} tokens`); + const { roles, derivations } = buildRoles(tokens); + const labelColors = buildLabelColors(roles, tokens); + const fonts = await resolveFontStacks(style.glyphs); + + /* glyphs endpoint kept as hosted OpenFreeMap (Phase 1: no self-hosted pbf) */ + if (!style.glyphs || !style.glyphs.includes('tiles.openfreemap.org/fonts')) { + throw new Error(`unexpected glyphs endpoint: ${style.glyphs}`); + } + + const ctx = { roles, labelColors, fonts, touched: [], untouched: [] }; + const removedLayers = []; + + const layers = []; + for (const layer of style.layers) { + /* building-3d is fill-extrusion — faux 3D dimensionality is + * rejected by the Rams design system (Elevation & Depth) */ + if (layer.id === 'building-3d') { + removedLayers.push({ + id: layer.id, + reason: 'fill-extrusion = faux 3D — rejected by Telemetry Rams (Elevation & Depth: Physical Planarity)', + }); + continue; + } + layers.push(transformLayer(layer, ctx)); + } + style.layers = layers; + + style.name = 'Telemetry Rams Basemap'; + style.metadata = { + ...(style.metadata || {}), + 'rams-cartography': { + 'derived-from': 'theme/src/tokens.css', + 'derivation-mechanism': 'desaturate(tokenHex, satMultiplier, lightnessPerRole) — hue genes from tokens, saturation clamped to [0.06, 0.12]', + 'source-style': LIBERTY_URL, + roles: Object.fromEntries( + Object.entries(roles).map(([k, v]) => [k, { color: v, derivation: derivations[k] }]) + ), + 'excluded-accent-tokens': [...EXCLUDED_TOKENS], + 'untouched-layers': ctx.untouched, + }, + 'rams-font-substitutions': fonts.substitutions, + 'rams-removed-layers': removedLayers, + }; + + assertNoAccent(style); + + const out = JSON.stringify(style, null, 2) + '\n'; + await writeFile(OUT_JSON, out, 'utf8'); + + /* build report — provenance for human review */ + console.log('Telemetry Rams basemap — derivation report'); + console.log(` tokens parsed: ${tokens.size} from ${TOKENS_CSS}`); + console.log(' role palette:'); + for (const [k, v] of Object.entries(roles)) console.log(` ${k.padEnd(15)} ${v} (${derivations[k]})`); + console.log(` labels: major ${labelColors.major} / minor ${labelColors.minor} / halo ${labelColors.halo}`); + console.log(` fonts (served): major ${fonts.served.major} / minor ${fonts.served.minor}`); + if (Object.keys(fonts.substitutions).length > 0) { + for (const [kind, s] of Object.entries(fonts.substitutions)) { + console.log(` font substitution: [${kind}] ${s.intended.join(', ')} → ${s.served.join(', ')}`); + } + } + console.log(` layers: ${ctx.touched.length} transformed, ${ctx.untouched.length} untouched (${ctx.untouched.join(', ')}), ${removedLayers.length} removed`); + console.log(' accent guard: PASS (no #EB8008 / #ED3F1C / #736B1E in layers)'); + console.log(` written: ${OUT_JSON} (${(out.length / 1024).toFixed(1)} KB)`); +} + +main().catch((err) => { + console.error(`basemap build failed: ${err.message}`); + process.exit(1); +}); diff --git a/theme/basemap/liberty-rams.json b/theme/basemap/liberty-rams.json new file mode 100644 index 0000000..348e52c --- /dev/null +++ b/theme/basemap/liberty-rams.json @@ -0,0 +1,6089 @@ +{ + "version": 8, + "sources": { + "ne2_shaded": { + "maxzoom": 6, + "tileSize": 256, + "tiles": [ + "https://tiles.openfreemap.org/natural_earth/ne2sr/{z}/{x}/{y}.png" + ], + "type": "raster" + }, + "openmaptiles": { + "type": "vector", + "url": "https://tiles.openfreemap.org/planet" + } + }, + "sprite": "https://tiles.openfreemap.org/sprites/ofm_f384/ofm", + "glyphs": "https://tiles.openfreemap.org/fonts/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#CDCAC4" + } + }, + { + "id": "natural_earth", + "type": "raster", + "source": "ne2_shaded", + "maxzoom": 7, + "paint": { + "raster-opacity": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 0, + 0.6, + 6, + 0.1 + ], + "raster-saturation": -1 + } + }, + { + "id": "park", + "type": "fill", + "source": "openmaptiles", + "source-layer": "park", + "paint": { + "fill-color": "#C6C2BB", + "fill-opacity": 0.7, + "fill-outline-color": "#A49898" + } + }, + { + "id": "park_outline", + "type": "line", + "source": "openmaptiles", + "source-layer": "park", + "paint": { + "line-color": "#A49898", + "line-dasharray": [ + 1, + 1.5 + ] + } + }, + { + "id": "landuse_residential", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "maxzoom": 12, + "filter": [ + "==", + [ + "get", + "class" + ], + "residential" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "landcover_wood", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "wood" + ], + "paint": { + "fill-antialias": false, + "fill-color": "#C6C2BB", + "fill-opacity": 0.4 + } + }, + { + "id": "landcover_grass", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "grass" + ], + "paint": { + "fill-antialias": false, + "fill-color": "#C6C2BB", + "fill-opacity": 0.3 + } + }, + { + "id": "landcover_ice", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "ice" + ], + "paint": { + "fill-antialias": false, + "fill-color": "#C6C2BB", + "fill-opacity": 0.8 + } + }, + { + "id": "landcover_wetland", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "minzoom": 12, + "filter": [ + "==", + [ + "get", + "class" + ], + "wetland" + ], + "paint": { + "fill-antialias": true, + "fill-opacity": 0.8, + "fill-pattern": "wetland_bg_11", + "fill-translate-anchor": "map" + } + }, + { + "id": "landuse_pitch", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + [ + "get", + "class" + ], + "pitch" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "landuse_track", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + [ + "get", + "class" + ], + "track" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "landuse_cemetery", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + [ + "get", + "class" + ], + "cemetery" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "landuse_hospital", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + [ + "get", + "class" + ], + "hospital" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "landuse_school", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + [ + "get", + "class" + ], + "school" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "waterway_tunnel", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + "paint": { + "line-color": "#B9B1B1", + "line-dasharray": [ + 3, + 3 + ], + "line-gap-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0, + 20, + 6 + ], + "line-opacity": 1, + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 8, + 1, + 20, + 2 + ] + } + }, + { + "id": "waterway_river", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "river" + ], + [ + "!=", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#B9B1B1", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 11, + 0.5, + 20, + 6 + ] + } + }, + { + "id": "waterway_other", + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + [ + "!=", + [ + "get", + "class" + ], + "river" + ], + [ + "!=", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#B9B1B1", + "line-width": [ + "interpolate", + [ + "exponential", + 1.3 + ], + [ + "zoom" + ], + 13, + 0.5, + 20, + 6 + ] + } + }, + { + "id": "water", + "type": "fill", + "source": "openmaptiles", + "source-layer": "water", + "filter": [ + "!=", + [ + "get", + "brunnel" + ], + "tunnel" + ], + "paint": { + "fill-color": "#B9B1B1" + } + }, + { + "id": "landcover_sand", + "type": "fill", + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + [ + "get", + "class" + ], + "sand" + ], + "paint": { + "fill-color": "#C6C2BB" + } + }, + { + "id": "aeroway_fill", + "type": "fill", + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "match", + [ + "geometry-type" + ], + [ + "MultiPolygon", + "Polygon" + ], + true, + false + ], + "paint": { + "fill-color": "#C6C2BB", + "fill-opacity": 0.7 + } + }, + { + "id": "aeroway_runway", + "type": "line", + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "==", + [ + "get", + "class" + ], + "runway" + ] + ], + "paint": { + "line-color": "#BAB5AB", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 11, + 3, + 20, + 16 + ] + } + }, + { + "id": "aeroway_taxiway", + "type": "line", + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 11, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "==", + [ + "get", + "class" + ], + "taxiway" + ] + ], + "paint": { + "line-color": "#BAB5AB", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 11, + 0.5, + 20, + 6 + ] + } + }, + { + "id": "tunnel_motorway_link_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 1, + 13, + 3, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "tunnel_service_track_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15, + 1, + 16, + 4, + 20, + 11 + ] + } + }, + { + "id": "tunnel_link_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 1, + 13, + 3, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "tunnel_street_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0, + 12.5, + 1 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 0.5, + 13, + 1, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "tunnel_secondary_tertiary_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 8, + 1.5, + 20, + 17 + ] + } + }, + { + "id": "tunnel_trunk_primary_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0.4, + 6, + 0.7, + 7, + 1.75, + 20, + 22 + ] + } + }, + { + "id": "tunnel_motorway_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0.4, + 6, + 0.7, + 7, + 1.75, + 20, + 22 + ] + } + }, + { + "id": "tunnel_path_pedestrian", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ] + ], + "paint": { + "line-color": "#F5F4F4", + "line-dasharray": [ + 1, + 0.75 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 14, + 0.5, + 20, + 10 + ] + } + }, + { + "id": "tunnel_motorway_link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12.5, + 0, + 13, + 1.5, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "tunnel_service_track", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15.5, + 0, + 16, + 2, + 20, + 7.5 + ] + } + }, + { + "id": "tunnel_link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12.5, + 0, + 13, + 1.5, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "tunnel_minor", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 13.5, + 0, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "tunnel_secondary_tertiary", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 6.5, + 0, + 7, + 0.5, + 20, + 10 + ] + } + }, + { + "id": "tunnel_trunk_primary", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0, + 7, + 1, + 20, + 18 + ] + } + }, + { + "id": "tunnel_motorway", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0, + 7, + 1, + 20, + 18 + ] + } + }, + { + "id": "tunnel_major_rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "rail" + ], + true, + false + ] + ], + "paint": { + "line-color": "#827373", + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14, + 0.4, + 15, + 0.75, + 20, + 2 + ] + } + }, + { + "id": "tunnel_major_rail_hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "rail" + ] + ], + "paint": { + "line-color": "#827373", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14.5, + 0, + 15, + 3, + 20, + 8 + ] + } + }, + { + "id": "tunnel_transit_rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "transit" + ], + true, + false + ] + ], + "paint": { + "line-color": "#827373", + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14, + 0.4, + 15, + 0.75, + 20, + 2 + ] + } + }, + { + "id": "tunnel_transit_rail_hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "tunnel" + ], + [ + "==", + [ + "get", + "class" + ], + "transit" + ] + ], + "paint": { + "line-color": "#827373", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14.5, + 0, + 15, + 3, + 20, + 8 + ] + } + }, + { + "id": "road_area_pattern", + "type": "fill", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "match", + [ + "geometry-type" + ], + [ + "MultiPolygon", + "Polygon" + ], + true, + false + ], + "paint": { + "fill-pattern": "pedestrian_polygon" + } + }, + { + "id": "road_motorway_link_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 1, + 13, + 3, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "road_service_track_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15, + 1, + 16, + 4, + 20, + 11 + ] + } + }, + { + "id": "road_link_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "path", + "pedestrian", + "service", + "track" + ], + false, + true + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 1, + 13, + 3, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "road_minor_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0, + 12.5, + 1 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 0.5, + 13, + 1, + 14, + 4, + 20, + 20 + ] + } + }, + { + "id": "road_secondary_tertiary_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 8, + 1.5, + 20, + 17 + ] + } + }, + { + "id": "road_trunk_primary_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0.4, + 6, + 0.7, + 7, + 1.75, + 20, + 22 + ] + } + }, + { + "id": "road_motorway_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0.4, + 6, + 0.7, + 7, + 1.75, + 20, + 22 + ] + } + }, + { + "id": "road_path_pedestrian", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 14, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-dasharray": [ + 1, + 0.7 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 14, + 1, + 20, + 10 + ] + } + }, + { + "id": "road_motorway_link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12.5, + 0, + 13, + 1.5, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "road_service_track", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15.5, + 0, + 16, + 2, + 20, + 7.5 + ] + } + }, + { + "id": "road_link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "path", + "pedestrian", + "service", + "track" + ], + false, + true + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12.5, + 0, + 13, + 1.5, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "road_minor", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 13.5, + 0, + 14, + 2.5, + 20, + 18 + ] + } + }, + { + "id": "road_secondary_tertiary", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 6.5, + 0, + 8, + 0.5, + 20, + 13 + ] + } + }, + { + "id": "road_trunk_primary", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0, + 7, + 1, + 20, + 18 + ] + } + }, + { + "id": "road_motorway", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0, + 7, + 1, + 20, + 18 + ] + } + }, + { + "id": "road_major_rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "rail" + ] + ], + "paint": { + "line-color": "#827373", + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14, + 0.4, + 15, + 0.75, + 20, + 2 + ] + } + }, + { + "id": "road_major_rail_hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "rail" + ] + ], + "paint": { + "line-color": "#827373", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14.5, + 0, + 15, + 3, + 20, + 8 + ] + } + }, + { + "id": "road_transit_rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "transit" + ] + ], + "paint": { + "line-color": "#827373", + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14, + 0.4, + 15, + 0.75, + 20, + 2 + ] + } + }, + { + "id": "road_transit_rail_hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "get", + "brunnel" + ], + [ + "bridge", + "tunnel" + ], + false, + true + ], + [ + "==", + [ + "get", + "class" + ], + "transit" + ] + ], + "paint": { + "line-color": "#827373", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14.5, + 0, + 15, + 3, + 20, + 8 + ] + } + }, + { + "id": "road_one_way_arrow", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 16, + "filter": [ + "==", + [ + "get", + "oneway" + ], + 1 + ], + "layout": { + "icon-image": "arrow", + "symbol-placement": "line" + } + }, + { + "id": "road_one_way_arrow_opposite", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 16, + "filter": [ + "==", + [ + "get", + "oneway" + ], + -1 + ], + "layout": { + "icon-image": "arrow", + "icon-rotate": 180, + "symbol-placement": "line" + } + }, + { + "id": "bridge_motorway_link_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 1, + 13, + 3, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "bridge_service_track_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15, + 1, + 16, + 4, + 20, + 11 + ] + } + }, + { + "id": "bridge_link_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "link" + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 1, + 13, + 3, + 14, + 4, + 20, + 15 + ] + } + }, + { + "id": "bridge_street_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "street", + "street_limited" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 12, + 0, + 12.5, + 1 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12, + 0.5, + 13, + 1, + 14, + 4, + 20, + 25 + ] + } + }, + { + "id": "bridge_path_pedestrian_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ] + ], + "paint": { + "line-color": "#5C5151", + "line-dasharray": [ + 1, + 0 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 14, + 1.5, + 20, + 18 + ] + } + }, + { + "id": "bridge_secondary_tertiary_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 8, + 1.5, + 20, + 17 + ] + } + }, + { + "id": "bridge_trunk_primary_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0.4, + 6, + 0.7, + 7, + 1.75, + 20, + 22 + ] + } + }, + { + "id": "bridge_motorway_casing", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#5C5151", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0.4, + 6, + 0.7, + 7, + 1.75, + 20, + 22 + ] + } + }, + { + "id": "bridge_path_pedestrian", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "path", + "pedestrian" + ], + true, + false + ] + ], + "paint": { + "line-color": "#F5F4F4", + "line-dasharray": [ + 1, + 0.3 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 14, + 0.5, + 20, + 10 + ] + } + }, + { + "id": "bridge_motorway_link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "==", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12.5, + 0, + 13, + 1.5, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "bridge_service_track", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 15.5, + 0, + 16, + 2, + 20, + 7.5 + ] + } + }, + { + "id": "bridge_link", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "link" + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 12.5, + 0, + 13, + 1.5, + 14, + 2.5, + 20, + 11.5 + ] + } + }, + { + "id": "bridge_street", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#F5F4F4", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 13.5, + 0, + 14, + 2.5, + 20, + 18 + ] + } + }, + { + "id": "bridge_secondary_tertiary", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "secondary", + "tertiary" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 6.5, + 0, + 7, + 0.5, + 20, + 10 + ] + } + }, + { + "id": "bridge_trunk_primary", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "trunk" + ], + true, + false + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0, + 7, + 1, + 20, + 18 + ] + } + }, + { + "id": "bridge_motorway", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "motorway" + ], + [ + "!=", + [ + "get", + "ramp" + ], + 1 + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#ECEBE9", + "line-width": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 5, + 0, + 7, + 1, + 20, + 18 + ] + } + }, + { + "id": "bridge_major_rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "rail" + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "paint": { + "line-color": "#827373", + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14, + 0.4, + 15, + 0.75, + 20, + 2 + ] + } + }, + { + "id": "bridge_major_rail_hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "rail" + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "paint": { + "line-color": "#827373", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14.5, + 0, + 15, + 3, + 20, + 8 + ] + } + }, + { + "id": "bridge_transit_rail", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "transit" + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "paint": { + "line-color": "#827373", + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14, + 0.4, + 15, + 0.75, + 20, + 2 + ] + } + }, + { + "id": "bridge_transit_rail_hatching", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "transit" + ], + [ + "==", + [ + "get", + "brunnel" + ], + "bridge" + ] + ], + "paint": { + "line-color": "#827373", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.4 + ], + [ + "zoom" + ], + 14.5, + 0, + 15, + 3, + 20, + 8 + ] + } + }, + { + "id": "building", + "type": "fill", + "source": "openmaptiles", + "source-layer": "building", + "minzoom": 13, + "maxzoom": 14, + "paint": { + "fill-color": "#C8C3BC", + "fill-outline-color": "#B2A9A9" + } + }, + { + "id": "boundary_3", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "minzoom": 5, + "filter": [ + "all", + [ + ">=", + [ + "get", + "admin_level" + ], + 3 + ], + [ + "<=", + [ + "get", + "admin_level" + ], + 6 + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ], + [ + "!=", + [ + "get", + "disputed" + ], + 1 + ], + [ + "!", + [ + "has", + "claimed_by" + ] + ] + ], + "paint": { + "line-color": "#6C6060", + "line-dasharray": [ + 1, + 1 + ], + "line-width": [ + "interpolate", + [ + "linear", + 1 + ], + [ + "zoom" + ], + 7, + 1, + 11, + 2 + ] + } + }, + { + "id": "boundary_2", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "==", + [ + "get", + "admin_level" + ], + 2 + ], + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ], + [ + "!=", + [ + "get", + "disputed" + ], + 1 + ], + [ + "!", + [ + "has", + "claimed_by" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#6C6060", + "line-opacity": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + 0.4, + 4, + 1 + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 1, + 5, + 1.2, + 12, + 3 + ] + } + }, + { + "id": "boundary_disputed", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "!=", + [ + "get", + "maritime" + ], + 1 + ], + [ + "==", + [ + "get", + "disputed" + ], + 1 + ] + ], + "paint": { + "line-color": "#6C6060", + "line-dasharray": [ + 1, + 2 + ], + "line-width": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 1, + 5, + 1.2, + 12, + 3 + ] + } + }, + { + "id": "waterway_line_label", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 10, + "filter": [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + " ", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-size": 14 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1.5 + } + }, + { + "id": "water_name_point_label", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": [ + "match", + [ + "geometry-type" + ], + [ + "MultiPoint", + "Point" + ], + true, + false + ], + "layout": { + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 0, + 10, + 8, + 14 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1.5 + } + }, + { + "id": "water_name_line_label", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + "layout": { + "symbol-placement": "line", + "symbol-spacing": 350, + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + " ", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-letter-spacing": 0.2, + "text-max-width": 5, + "text-size": 14 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1.5 + } + }, + { + "id": "poi_r20", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 17, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "MultiPoint", + "Point" + ], + true, + false + ], + [ + ">=", + [ + "get", + "rank" + ], + 20 + ] + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "florist", + "furniture" + ], + [ + "get", + "subclass" + ], + [ + "get", + "class" + ] + ], + "text-anchor": "top", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "poi_r7", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 16, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "MultiPoint", + "Point" + ], + true, + false + ], + [ + ">=", + [ + "get", + "rank" + ], + 7 + ], + [ + "<", + [ + "get", + "rank" + ], + 20 + ] + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "florist", + "furniture" + ], + [ + "get", + "subclass" + ], + [ + "get", + "class" + ] + ], + "text-anchor": "top", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "poi_r1", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 15, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "MultiPoint", + "Point" + ], + true, + false + ], + [ + ">=", + [ + "get", + "rank" + ], + 1 + ], + [ + "<", + [ + "get", + "rank" + ], + 7 + ] + ], + "layout": { + "icon-image": [ + "match", + [ + "get", + "subclass" + ], + [ + "florist", + "furniture" + ], + [ + "get", + "subclass" + ], + [ + "get", + "class" + ] + ], + "text-anchor": "top", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "poi_transit", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "airport", + "bus", + "rail" + ], + true, + false + ], + "layout": { + "icon-image": [ + "to-string", + [ + "get", + "class" + ] + ], + "icon-size": 0.7, + "text-anchor": "left", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 9, + "text-offset": [ + 0.9, + 0 + ], + "text-size": 12 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "highway-name-path", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15.5, + "filter": [ + "==", + [ + "get", + "class" + ], + "path" + ], + "layout": { + "symbol-placement": "line", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + " ", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-rotation-alignment": "map", + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 12, + 14, + 13 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 0.5 + } + }, + { + "id": "highway-name-minor", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15, + "filter": [ + "all", + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "class" + ], + [ + "minor", + "service", + "track" + ], + true, + false + ] + ], + "layout": { + "symbol-placement": "line", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + " ", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-rotation-alignment": "map", + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 12, + 14, + 13 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-width": 1, + "text-halo-color": "rgba(205, 202, 196, 0.9)" + } + }, + { + "id": "highway-name-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 12.2, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "primary", + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + "layout": { + "symbol-placement": "line", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + " ", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-rotation-alignment": "map", + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 13, + 12, + 14, + 13 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-width": 1, + "text-halo-color": "rgba(205, 202, 196, 0.9)" + } + }, + { + "id": "highway-shield-non-us", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 8, + "filter": [ + "all", + [ + "<=", + [ + "get", + "ref_length" + ], + 6 + ], + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "network" + ], + [ + "us-highway", + "us-interstate", + "us-state" + ], + false, + true + ] + ], + "layout": { + "icon-image": [ + "concat", + "road_", + [ + "get", + "ref_length" + ] + ], + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "symbol-spacing": 200, + "text-field": [ + "to-string", + [ + "get", + "ref" + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)" + } + }, + { + "id": "highway-shield-us-interstate", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 7, + "filter": [ + "all", + [ + "<=", + [ + "get", + "ref_length" + ], + 6 + ], + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "network" + ], + [ + "us-interstate" + ], + true, + false + ] + ], + "layout": { + "icon-image": [ + "concat", + [ + "get", + "network" + ], + "_", + [ + "get", + "ref_length" + ] + ], + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 7, + "line", + 8, + "line" + ], + "symbol-spacing": 200, + "text-field": [ + "to-string", + [ + "get", + "ref" + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)" + } + }, + { + "id": "road_shield_us", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 9, + "filter": [ + "all", + [ + "<=", + [ + "get", + "ref_length" + ], + 6 + ], + [ + "match", + [ + "geometry-type" + ], + [ + "LineString", + "MultiLineString" + ], + true, + false + ], + [ + "match", + [ + "get", + "network" + ], + [ + "us-highway", + "us-state" + ], + true, + false + ] + ], + "layout": { + "icon-image": [ + "concat", + [ + "get", + "network" + ], + "_", + [ + "get", + "ref_length" + ] + ], + "icon-rotation-alignment": "viewport", + "icon-size": 1, + "symbol-placement": [ + "step", + [ + "zoom" + ], + "point", + 11, + "line" + ], + "symbol-spacing": 200, + "text-field": [ + "to-string", + [ + "get", + "ref" + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-rotation-alignment": "viewport", + "text-size": 10 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-color": "rgba(205, 202, 196, 0.9)" + } + }, + { + "id": "airport", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "aerodrome_label", + "minzoom": 10, + "filter": [ + "all", + [ + "has", + "iata" + ] + ], + "layout": { + "icon-image": "airport_11", + "icon-size": 1, + "text-anchor": "top", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 9, + "text-offset": [ + 0, + 0.6 + ], + "text-optional": true, + "text-padding": 2, + "text-size": 12 + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 8, + "filter": [ + "match", + [ + "get", + "class" + ], + [ + "city", + "continent", + "country", + "state", + "town", + "village" + ], + false, + true + ], + "layout": { + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-letter-spacing": 0.1, + "text-max-width": 9, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 8, + 9, + 12, + 10 + ], + "text-transform": "uppercase" + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_village", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 9, + "filter": [ + "==", + [ + "get", + "class" + ], + "village" + ], + "layout": { + "icon-allow-overlap": true, + "icon-image": [ + "step", + [ + "zoom" + ], + "circle_11_black", + 10, + "" + ], + "icon-optional": false, + "icon-size": 0.2, + "text-anchor": "bottom", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 8, + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 7, + 10, + 11, + 12 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_town", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 6, + "filter": [ + "==", + [ + "get", + "class" + ], + "town" + ], + "layout": { + "icon-allow-overlap": true, + "icon-image": [ + "step", + [ + "zoom" + ], + "circle_11_black", + 10, + "" + ], + "icon-optional": false, + "icon-size": 0.2, + "text-anchor": "bottom", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Regular" + ], + "text-max-width": 8, + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 7, + 12, + 11, + 14 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.6)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_state", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 5, + "maxzoom": 8, + "filter": [ + "==", + [ + "get", + "class" + ], + "state" + ], + "layout": { + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-letter-spacing": 0.2, + "text-max-width": 9, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 5, + 10, + 8, + 14 + ], + "text-transform": "uppercase" + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.82)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_city", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 3, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "city" + ], + [ + "!=", + [ + "get", + "capital" + ], + 2 + ] + ], + "layout": { + "icon-allow-overlap": true, + "icon-image": [ + "step", + [ + "zoom" + ], + "circle_11_black", + 9, + "" + ], + "icon-optional": false, + "icon-size": 0.4, + "text-anchor": "bottom", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-max-width": 8, + "text-offset": [ + 0, + -0.1 + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 4, + 11, + 7, + 13, + 11, + 18 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.82)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_city_capital", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 3, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "city" + ], + [ + "==", + [ + "get", + "capital" + ], + 2 + ] + ], + "layout": { + "icon-allow-overlap": true, + "icon-image": [ + "step", + [ + "zoom" + ], + "circle_11_black", + 9, + "" + ], + "icon-optional": false, + "icon-size": 0.5, + "text-anchor": "bottom", + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-max-width": 8, + "text-offset": [ + 0, + -0.2 + ], + "text-size": [ + "interpolate", + [ + "exponential", + 1.2 + ], + [ + "zoom" + ], + 4, + 12, + 7, + 14, + 11, + 20 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.82)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_country_3", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "minzoom": 2, + "maxzoom": 9, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "country" + ], + [ + ">=", + [ + "get", + "rank" + ], + 3 + ] + ], + "layout": { + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-max-width": 6.25, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 3, + 9, + 7, + 17 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.82)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_country_2", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 9, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "country" + ], + [ + "==", + [ + "get", + "rank" + ], + 2 + ] + ], + "layout": { + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-max-width": 6.25, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 2, + 9, + 5, + 17 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.82)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + }, + { + "id": "label_country_1", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 9, + "filter": [ + "all", + [ + "==", + [ + "get", + "class" + ], + "country" + ], + [ + "==", + [ + "get", + "rank" + ], + 1 + ] + ], + "layout": { + "text-field": [ + "case", + [ + "has", + "name:nonlatin" + ], + [ + "concat", + [ + "get", + "name:latin" + ], + "\n", + [ + "get", + "name:nonlatin" + ] + ], + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ] + ], + "text-font": [ + "Noto Sans Bold" + ], + "text-max-width": 6.25, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 1, + 9, + 4, + 17 + ] + }, + "paint": { + "text-color": "rgba(26, 26, 26, 0.82)", + "text-halo-blur": 0, + "text-halo-color": "rgba(205, 202, 196, 0.9)", + "text-halo-width": 1 + } + } + ], + "name": "Telemetry Rams Basemap", + "metadata": { + "rams-cartography": { + "derived-from": "theme/src/tokens.css", + "derivation-mechanism": "desaturate(tokenHex, satMultiplier, lightnessPerRole) — hue genes from tokens, saturation clamped to [0.06, 0.12]", + "source-style": "https://tiles.openfreemap.org/styles/liberty", + "roles": { + "ground": { + "color": "#CDCAC4", + "derivation": "mix(soft-beige, chassis-subtle) · sat ×0.4 · band [0.06, 0.12]" + }, + "groundSubtle": { + "color": "#C6C2BB", + "derivation": "chassis-subtle · sat ×0.45 (parcel step darker than ground)" + }, + "groundEdge": { + "color": "#A49898", + "derivation": "matte-black · sat ×1 (band-min) · L 0.62" + }, + "water": { + "color": "#B9B1B1", + "derivation": "matte-black · sat ×1 (band-min) · L 0.71 (mid-gray)" + }, + "roadFillMinor": { + "color": "#F5F4F4", + "derivation": "pure-white · sat ×1 (band-min) · L 0.96" + }, + "roadFillMajor": { + "color": "#ECEBE9", + "derivation": "surface-container-low · sat ×0.12 · L 0.92 (slightly darker than minor)" + }, + "casing": { + "color": "#5C5151", + "derivation": "matte-black · sat ×1 (band-min) · L 0.34 (machined rule)" + }, + "rail": { + "color": "#827373", + "derivation": "matte-black · sat ×1 (band-min) · L 0.48" + }, + "buildingFill": { + "color": "#C8C3BC", + "derivation": "soft-beige · sat ×0.5 · L 0.76" + }, + "buildingEdge": { + "color": "#B2A9A9", + "derivation": "matte-black · sat ×1 (band-min) · L 0.68" + }, + "boundary": { + "color": "#6C6060", + "derivation": "matte-black · sat ×1 (band-min) · L 0.40" + }, + "aeroway": { + "color": "#BAB5AB", + "derivation": "chassis-subtle · sat ×0.5 · L 0.70" + } + }, + "excluded-accent-tokens": [ + "signal-orange", + "functional-red", + "olive-green" + ], + "untouched-layers": [ + "road_area_pattern", + "road_one_way_arrow", + "road_one_way_arrow_opposite" + ] + }, + "rams-font-substitutions": { + "major": { + "intended": [ + "Space Grotesk Medium" + ], + "served": [ + "Noto Sans Bold" + ], + "reason": "not hosted on tiles.openfreemap.org glyphs endpoint (HTTP 404 at build time); closest hosted stack substituted. Self-hosted Rams woff2 (theme/fonts) cannot serve pbf glyph ranges in Phase 1 — revisit with a Worker-served glyphs route." + }, + "minor": { + "intended": [ + "Geist Regular", + "Space Grotesk Regular" + ], + "served": [ + "Noto Sans Regular" + ], + "reason": "not hosted on tiles.openfreemap.org glyphs endpoint (HTTP 404 at build time); closest hosted stack substituted. Self-hosted Rams woff2 (theme/fonts) cannot serve pbf glyph ranges in Phase 1 — revisit with a Worker-served glyphs route." + } + }, + "rams-removed-layers": [ + { + "id": "building-3d", + "reason": "fill-extrusion = faux 3D — rejected by Telemetry Rams (Elevation & Depth: Physical Planarity)" + } + ] + } +} diff --git a/theme/package.json b/theme/package.json index 807fbc7..bdadd5a 100644 --- a/theme/package.json +++ b/theme/package.json @@ -11,6 +11,7 @@ "scripts": { "build": "tailwindcss -i ./src/theme.css -o ./dist/rams.css --minify", "send": "mkdir -p dist/fonts && cp -r fonts/geist fonts/space-grotesk dist/fonts/", - "sheet": "npm run build && echo 'open theme/src/sheet.html in browser ( Consumes theme/dist/rams.css )'" + "sheet": "npm run build && echo 'open theme/src/sheet.html in browser ( Consumes theme/dist/rams.css )'", + "basemap": "node basemap/build.mjs" } }