From b0b28ef82bcfe877be39da7608c277c2b6006f6f Mon Sep 17 00:00:00 2001 From: Russ Garrett Date: Thu, 16 May 2024 19:52:30 +0100 Subject: [PATCH] Refactor and new map style --- web/.gitignore | 1 + web/package-lock.json | 411 +++- web/package.json | 3 + web/public/fonts/Raleway SemiBold/0-255.pbf | Bin 0 -> 77427 bytes web/src/icons/bar.svg | 28 + web/src/icons/bus-stop.svg | 36 + web/src/icons/bus.svg | 95 + web/src/icons/bush-pale.svg | 45 + web/src/icons/bush.svg | 45 + web/src/icons/camping.svg | 34 + web/src/icons/golf-buggy.svg | 70 + web/src/icons/grass-pale.svg | 43 + web/src/icons/grass.svg | 43 + web/src/icons/no-access-pale.svg | 17 + web/src/icons/no-access.svg | 17 + web/src/icons/parking.svg | 44 + web/src/icons/shower.svg | 91 + web/src/icons/telehandler.svg | 564 +++++ web/src/icons/toilet.svg | 27 + web/src/icons/tree.svg | 72 + web/src/icons/water pale.svg | 39 + web/src/icons/water-point.svg | 22 + web/src/icons/water.svg | 39 + web/src/index.ts | 28 +- web/src/map_style.ts | 2335 ------------------- web/src/style/basemap.ts | 773 ++++++ web/src/style/map_style.ts | 1165 +++++++++ web/src/style/types.ts | 5 + web/vite.config.ts | 6 + 29 files changed, 3679 insertions(+), 2419 deletions(-) create mode 100644 web/public/fonts/Raleway SemiBold/0-255.pbf create mode 100644 web/src/icons/bar.svg create mode 100644 web/src/icons/bus-stop.svg create mode 100644 web/src/icons/bus.svg create mode 100644 web/src/icons/bush-pale.svg create mode 100644 web/src/icons/bush.svg create mode 100644 web/src/icons/camping.svg create mode 100644 web/src/icons/golf-buggy.svg create mode 100644 web/src/icons/grass-pale.svg create mode 100644 web/src/icons/grass.svg create mode 100644 web/src/icons/no-access-pale.svg create mode 100644 web/src/icons/no-access.svg create mode 100644 web/src/icons/parking.svg create mode 100644 web/src/icons/shower.svg create mode 100644 web/src/icons/telehandler.svg create mode 100644 web/src/icons/toilet.svg create mode 100644 web/src/icons/tree.svg create mode 100644 web/src/icons/water pale.svg create mode 100644 web/src/icons/water-point.svg create mode 100644 web/src/icons/water.svg delete mode 100644 web/src/map_style.ts create mode 100644 web/src/style/basemap.ts create mode 100644 web/src/style/map_style.ts create mode 100644 web/src/style/types.ts diff --git a/web/.gitignore b/web/.gitignore index cdd5d87..9ec2c47 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -1,6 +1,7 @@ node_modules dist dev-dist +**/.DS_Store public/pwa-*.png public/maskable-icon-*.png diff --git a/web/package-lock.json b/web/package-lock.json index aceb795..37a7ed1 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,6 +8,9 @@ "name": "map.emfcamp.org", "version": "1.0.0", "license": "ISC", + "dependencies": { + "vite-plugin-render-svg": "^1.1.1" + }, "devDependencies": { "@russss/maplibregl-layer-switcher": "^1.2.4", "@turf/length": "^6.5.0", @@ -1911,7 +1914,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" @@ -1927,7 +1929,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -1943,7 +1944,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1959,7 +1959,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1975,7 +1974,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1991,7 +1989,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -2007,7 +2004,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -2023,7 +2019,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -2039,7 +2034,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2055,7 +2049,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2071,7 +2064,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2087,7 +2079,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2103,7 +2094,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2119,7 +2109,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2135,7 +2124,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2151,7 +2139,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2167,7 +2154,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2183,7 +2169,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -2199,7 +2184,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -2215,7 +2199,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -2231,7 +2214,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2247,7 +2229,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2263,7 +2244,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2418,7 +2398,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2432,7 +2412,7 @@ "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2442,7 +2422,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -2451,7 +2431,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -2460,7 +2440,7 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -2470,7 +2450,7 @@ "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2480,7 +2460,7 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", @@ -2575,7 +2555,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2588,7 +2567,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -2597,7 +2575,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2606,6 +2583,208 @@ "node": ">= 8" } }, + "node_modules/@resvg/resvg-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", + "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.2", + "@resvg/resvg-js-android-arm64": "2.6.2", + "@resvg/resvg-js-darwin-arm64": "2.6.2", + "@resvg/resvg-js-darwin-x64": "2.6.2", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", + "@resvg/resvg-js-linux-arm64-musl": "2.6.2", + "@resvg/resvg-js-linux-x64-gnu": "2.6.2", + "@resvg/resvg-js-linux-x64-musl": "2.6.2", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", + "@resvg/resvg-js-win32-x64-msvc": "2.6.2" + } + }, + "node_modules/@resvg/resvg-js-android-arm-eabi": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", + "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-android-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", + "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", + "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-x64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", + "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", + "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", + "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", + "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", + "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", + "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", + "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", + "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-x64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", + "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", @@ -2682,7 +2861,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -2695,7 +2873,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -2708,7 +2885,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -2721,7 +2897,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -2734,7 +2909,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2747,7 +2921,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2760,7 +2933,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2773,7 +2945,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2786,7 +2957,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2799,7 +2969,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2812,7 +2981,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2825,7 +2993,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2838,7 +3005,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2851,7 +3017,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2864,7 +3029,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2877,7 +3041,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -3012,8 +3175,7 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", @@ -3114,7 +3276,7 @@ "version": "20.12.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", - "dev": true, + "devOptional": true, "dependencies": { "undici-types": "~5.26.4" } @@ -3412,6 +3574,11 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@wasm-codecs/oxipng": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@wasm-codecs/oxipng/-/oxipng-1.0.1.tgz", + "integrity": "sha512-3+kFfX/nVvd96+HKNqX07QOQTMSTU9BMqnty58loVMnwFleORUII0guQh6o+qKv0k6Kl5OO1bsDWkWAO8p+N7w==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3429,7 +3596,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -3498,6 +3665,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -3738,6 +3917,17 @@ } ] }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -3801,7 +3991,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3869,7 +4058,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "devOptional": true }, "node_modules/builtin-modules": { "version": "3.3.0", @@ -3985,6 +4174,40 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -4042,7 +4265,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "devOptional": true }, "node_modules/common-tags": { "version": "1.8.2", @@ -4569,7 +4792,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -4927,7 +5149,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -4943,7 +5164,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -4968,7 +5188,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5017,7 +5236,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5155,7 +5373,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -5722,6 +5939,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -5820,7 +6048,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5829,7 +6056,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -5859,7 +6085,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -6372,7 +6597,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -6396,7 +6620,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -6496,7 +6719,6 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -6555,6 +6777,14 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -6750,14 +6980,12 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -6787,7 +7015,6 @@ "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -6975,7 +7202,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -7074,6 +7300,17 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/redom": { "version": "3.29.1", "resolved": "https://registry.npmjs.org/redom/-/redom-3.29.1.tgz", @@ -7222,7 +7459,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -7248,7 +7484,6 @@ "version": "4.17.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", - "dev": true, "dependencies": { "@types/estree": "1.0.5" }, @@ -7283,7 +7518,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -7698,7 +7932,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7707,7 +7940,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, + "devOptional": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -7717,7 +7950,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -8022,7 +8255,7 @@ "version": "5.31.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -8068,7 +8301,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -8334,7 +8566,7 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "devOptional": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -8504,7 +8736,6 @@ "version": "5.2.11", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", - "dev": true, "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", @@ -8585,6 +8816,20 @@ } } }, + "node_modules/vite-plugin-render-svg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vite-plugin-render-svg/-/vite-plugin-render-svg-1.1.1.tgz", + "integrity": "sha512-c6tOjFzJgSUZSkXIqld+v4UhN9qD7e+66+8kHLhK3xbYu3o0v8Bv51qQ8m46yCBVkA9ntV5TAm++GFfbTX6z7g==", + "dependencies": { + "@resvg/resvg-js": "^2.6.0", + "@wasm-codecs/oxipng": "^1.0.1", + "chokidar": "^3.5.3", + "fast-glob": "^3.3.2" + }, + "peerDependencies": { + "vite": ">2.0.0-0" + } + }, "node_modules/vt-pbf": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", diff --git a/web/package.json b/web/package.json index a6a958d..eb25bcd 100644 --- a/web/package.json +++ b/web/package.json @@ -50,5 +50,8 @@ "vite-plugin-pwa": "^0.19.2", "workbox-core": "^7.0.0", "workbox-window": "^7.0.0" + }, + "dependencies": { + "vite-plugin-render-svg": "^1.1.1" } } diff --git a/web/public/fonts/Raleway SemiBold/0-255.pbf b/web/public/fonts/Raleway SemiBold/0-255.pbf new file mode 100644 index 0000000000000000000000000000000000000000..3ce98a1b713e401853c15dec2202aff3e1ac2f22 GIT binary patch literal 77427 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 z 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 W2F8q0j!y%#i~;88`Hb=MGsd4bz3zMf literal 0 HcmV?d00001 diff --git a/web/src/icons/bar.svg b/web/src/icons/bar.svg new file mode 100644 index 0000000..9d49bf9 --- /dev/null +++ b/web/src/icons/bar.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/bus-stop.svg b/web/src/icons/bus-stop.svg new file mode 100644 index 0000000..3993447 --- /dev/null +++ b/web/src/icons/bus-stop.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/bus.svg b/web/src/icons/bus.svg new file mode 100644 index 0000000..5b6fb6d --- /dev/null +++ b/web/src/icons/bus.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/bush-pale.svg b/web/src/icons/bush-pale.svg new file mode 100644 index 0000000..030ebcc --- /dev/null +++ b/web/src/icons/bush-pale.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/bush.svg b/web/src/icons/bush.svg new file mode 100644 index 0000000..167c86a --- /dev/null +++ b/web/src/icons/bush.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/camping.svg b/web/src/icons/camping.svg new file mode 100644 index 0000000..87a22cf --- /dev/null +++ b/web/src/icons/camping.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/golf-buggy.svg b/web/src/icons/golf-buggy.svg new file mode 100644 index 0000000..ad02a8e --- /dev/null +++ b/web/src/icons/golf-buggy.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/grass-pale.svg b/web/src/icons/grass-pale.svg new file mode 100644 index 0000000..dd3db51 --- /dev/null +++ b/web/src/icons/grass-pale.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/grass.svg b/web/src/icons/grass.svg new file mode 100644 index 0000000..cba5f21 --- /dev/null +++ b/web/src/icons/grass.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/no-access-pale.svg b/web/src/icons/no-access-pale.svg new file mode 100644 index 0000000..423076c --- /dev/null +++ b/web/src/icons/no-access-pale.svg @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/no-access.svg b/web/src/icons/no-access.svg new file mode 100644 index 0000000..0abc62f --- /dev/null +++ b/web/src/icons/no-access.svg @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/parking.svg b/web/src/icons/parking.svg new file mode 100644 index 0000000..bbf164a --- /dev/null +++ b/web/src/icons/parking.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/shower.svg b/web/src/icons/shower.svg new file mode 100644 index 0000000..6ebdf04 --- /dev/null +++ b/web/src/icons/shower.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/telehandler.svg b/web/src/icons/telehandler.svg new file mode 100644 index 0000000..abb3602 --- /dev/null +++ b/web/src/icons/telehandler.svg @@ -0,0 +1,564 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/toilet.svg b/web/src/icons/toilet.svg new file mode 100644 index 0000000..6048c8d --- /dev/null +++ b/web/src/icons/toilet.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/tree.svg b/web/src/icons/tree.svg new file mode 100644 index 0000000..d4d05a5 --- /dev/null +++ b/web/src/icons/tree.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + diff --git a/web/src/icons/water pale.svg b/web/src/icons/water pale.svg new file mode 100644 index 0000000..cba63d6 --- /dev/null +++ b/web/src/icons/water pale.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/water-point.svg b/web/src/icons/water-point.svg new file mode 100644 index 0000000..71f10d3 --- /dev/null +++ b/web/src/icons/water-point.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/icons/water.svg b/web/src/icons/water.svg new file mode 100644 index 0000000..1019800 --- /dev/null +++ b/web/src/icons/water.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/index.ts b/web/src/index.ts index ebdb44f..7d8837e 100644 --- a/web/src/index.ts +++ b/web/src/index.ts @@ -1,7 +1,7 @@ import './index.css' import { registerSW } from 'virtual:pwa-register' import maplibregl from 'maplibre-gl' -import map_style from './map_style.ts' +import map_style from './style/map_style.ts' import Marker from './marker' import LayerSwitcher from '@russss/maplibregl-layer-switcher' import URLHash from '@russss/maplibregl-layer-switcher/urlhash' @@ -11,6 +11,7 @@ import VillagesEditor from './villages' import { roundPosition } from './util' import InstallControl from './installcontrol' import ExportControl from './export/export' +import { manifest } from 'virtual:render-svg' if (import.meta.env.DEV) { map_style.sources.villages.data = 'http://localhost:2342/api/villages.geojson' @@ -18,6 +19,30 @@ if (import.meta.env.DEV) { map_style.glyphs = 'http://localhost:8080/fonts/{fontstack}/{range}.pbf' } +async function loadIcons(map: maplibregl.Map) { + const ratio = Math.min(Math.round(window.devicePixelRatio), 2) + const icons = manifest[ratio.toString()] + + const images = ['camping', 'no-access', 'water'] + + Promise.all( + images + .map((image) => async () => { + const img = await map.loadImage(icons[image]) + map.addImage(image, img.data, { pixelRatio: ratio }) + }) + .map((f) => f()) + ) + /* + const sdfs = ['parking'] + + for (const sdf of sdfs) { + const img = await map.loadImage(`/sdf/${sdf}.png`) + map.addImage(sdf, img.data, { sdf: true }) + } + */ +} + class EventMap { layers: Record = { Background: 'background_', @@ -57,6 +82,7 @@ class EventMap { dragRotate: false, }) ) + loadIcons(this.map) this.map.touchZoomRotate.disableRotation() diff --git a/web/src/map_style.ts b/web/src/map_style.ts deleted file mode 100644 index bdffd72..0000000 --- a/web/src/map_style.ts +++ /dev/null @@ -1,2335 +0,0 @@ -export default { - version: 8, - name: 'EMF', - center: [-2.3784, 52.0411], - zoom: 16, - bearing: 0, - pitch: 0, - sources: { - openmaptiles: { - type: 'vector', - url: 'https://api.maptiler.com/tiles/v3/tiles.json?key=iiaOS0kq1MPr2LlHPTSa', - }, - site_plan: { - type: 'vector', - url: 'https://map.emfcamp.org/capabilities/buildmap', - }, - villages: { - type: 'geojson', - data: 'https://www.emfcamp.org/api/villages.geojson', - }, - slope: { - type: 'raster', - tiles: ['https://map.emfcamp.org/data/slope/{z}/{x}/{y}'], - attribution: 'Elevation data © Environment Agency 2022. All rights reserved.', - }, - hillshade: { - type: 'raster', - tiles: ['https://map.emfcamp.org/data/hillshade/{z}/{x}/{y}'], - attribution: 'Elevation data © Environment Agency 2022. All rights reserved.', - }, - ortho: { - type: 'raster', - tiles: ['https://map.emfcamp.org/data/ortho/{z}/{x}/{y}'], - }, - }, - sprite: 'https://openmaptiles.github.io/positron-gl-style/sprite', - glyphs: 'https://map.emfcamp.org/fonts/{fontstack}/{range}.pbf', - layers: [ - { - id: 'background', - type: 'background', - paint: { - 'background-color': 'rgba(240, 247, 240, 1)', - }, - }, - { - id: 'water', - type: 'fill', - source: 'openmaptiles', - 'source-layer': 'water', - filter: ['==', '$type', 'Polygon'], - layout: { - visibility: 'visible', - }, - paint: { - 'fill-color': 'rgb(194, 200, 202)', - 'fill-antialias': true, - }, - }, - { - id: 'landcover_ice_shelf', - type: 'fill', - source: 'openmaptiles', - 'source-layer': 'landcover', - maxzoom: 8, - filter: ['all', ['==', '$type', 'Polygon'], ['==', 'subclass', 'ice_shelf']], - layout: { - visibility: 'visible', - }, - paint: { - 'fill-color': 'hsl(0, 0%, 98%)', - 'fill-opacity': 0.7, - }, - }, - { - id: 'landcover_glacier', - type: 'fill', - source: 'openmaptiles', - 'source-layer': 'landcover', - maxzoom: 8, - filter: ['all', ['==', '$type', 'Polygon'], ['==', 'subclass', 'glacier']], - layout: { - visibility: 'visible', - }, - paint: { - 'fill-color': 'hsl(0, 0%, 98%)', - 'fill-opacity': { - base: 1, - stops: [ - [0, 1], - [8, 0.5], - ], - }, - }, - }, - { - id: 'landuse_residential', - type: 'fill', - source: 'openmaptiles', - 'source-layer': 'landuse', - maxzoom: 16, - filter: ['all', ['==', '$type', 'Polygon'], ['==', 'class', 'residential']], - layout: { - visibility: 'visible', - }, - paint: { - 'fill-color': 'rgb(234, 234, 230)', - 'fill-opacity': { - base: 0.6, - stops: [ - [8, 0.8], - [9, 0.6], - ], - }, - }, - }, - { - id: 'waterway', - type: 'line', - source: 'openmaptiles', - 'source-layer': 'waterway', - filter: ['all', ['==', '$type', 'LineString']], - layout: { - visibility: 'visible', - }, - paint: { - 'line-color': 'hsl(195, 17%, 78%)', - }, - }, - { - id: 'water_name', - type: 'symbol', - source: 'openmaptiles', - 'source-layer': 'water_name', - filter: ['==', '$type', 'LineString'], - layout: { - 'text-field': '{name:latin}\n{name:nonlatin}', - 'symbol-placement': 'line', - 'text-rotation-alignment': 'map', - 'symbol-spacing': 500, - 'text-font': ['Open Sans Regular'], - 'text-size': 12, - }, - paint: { - 'text-color': 'rgb(157,169,177)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - }, - }, - { - id: 'building', - type: 'fill', - source: 'openmaptiles', - 'source-layer': 'building', - minzoom: 12, - paint: { - 'fill-color': 'rgb(234, 234, 229)', - 'fill-outline-color': 'rgb(219, 219, 218)', - 'fill-antialias': true, - }, - }, - { - id: 'tunnel_motorway_casing', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 6, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'brunnel', 'tunnel'], ['==', 'class', 'motorway']], - ], - layout: { - 'line-cap': 'butt', - 'line-join': 'miter', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgb(213, 213, 213)', - 'line-width': { - base: 1.4, - stops: [ - [5.8, 0], - [6, 3], - [20, 40], - ], - }, - 'line-opacity': 1, - }, - }, - { - id: 'tunnel_motorway_inner', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 6, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'brunnel', 'tunnel'], ['==', 'class', 'motorway']], - ], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgb(234,234,234)', - 'line-width': { - base: 1.4, - stops: [ - [4, 2], - [6, 1.3], - [20, 30], - ], - }, - }, - }, - { - id: 'aeroway-taxiway', - type: 'line', - metadata: { - 'mapbox:group': '1444849345966.4436', - }, - source: 'openmaptiles', - 'source-layer': 'aeroway', - minzoom: 12, - filter: ['all', ['in', 'class', 'taxiway']], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'hsl(0, 0%, 88%)', - 'line-width': { - base: 1.55, - stops: [ - [13, 1.8], - [20, 20], - ], - }, - 'line-opacity': 1, - }, - }, - { - id: 'aeroway-runway-casing', - type: 'line', - metadata: { - 'mapbox:group': '1444849345966.4436', - }, - source: 'openmaptiles', - 'source-layer': 'aeroway', - minzoom: 11, - filter: ['all', ['in', 'class', 'runway']], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'hsl(0, 0%, 88%)', - 'line-width': { - base: 1.5, - stops: [ - [11, 6], - [17, 55], - ], - }, - 'line-opacity': 1, - }, - }, - { - id: 'aeroway-area', - type: 'fill', - metadata: { - 'mapbox:group': '1444849345966.4436', - }, - source: 'openmaptiles', - 'source-layer': 'aeroway', - minzoom: 4, - filter: ['all', ['==', '$type', 'Polygon'], ['in', 'class', 'runway', 'taxiway']], - layout: { - visibility: 'visible', - }, - paint: { - 'fill-opacity': { - base: 1, - stops: [ - [13, 0], - [14, 1], - ], - }, - 'fill-color': 'rgba(255, 255, 255, 1)', - }, - }, - { - id: 'aeroway-runway', - type: 'line', - metadata: { - 'mapbox:group': '1444849345966.4436', - }, - source: 'openmaptiles', - 'source-layer': 'aeroway', - minzoom: 11, - maxzoom: 24, - filter: ['all', ['in', 'class', 'runway'], ['==', '$type', 'LineString']], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgba(255, 255, 255, 1)', - 'line-width': { - base: 1.5, - stops: [ - [11, 4], - [17, 50], - ], - }, - 'line-opacity': 1, - }, - }, - { - id: 'highway_minor', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 8, - filter: ['all', ['==', '$type', 'LineString'], ['in', 'class', 'minor', 'service', 'track']], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'hsl(0, 0%, 88%)', - 'line-width': { - base: 1.55, - stops: [ - [13, 1.8], - [20, 20], - ], - }, - 'line-opacity': 0.9, - }, - }, - { - id: 'highway_major_casing', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 11, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['in', 'class', 'primary', 'secondary', 'tertiary', 'trunk'], - ], - layout: { - 'line-cap': 'butt', - 'line-join': 'miter', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgb(213, 213, 213)', - 'line-dasharray': [12, 0], - 'line-width': { - base: 1.3, - stops: [ - [10, 3], - [20, 23], - ], - }, - }, - }, - { - id: 'highway_major_inner', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 11, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['in', 'class', 'primary', 'secondary', 'tertiary', 'trunk'], - ], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': '#fff', - 'line-width': { - base: 1.3, - stops: [ - [10, 2], - [20, 20], - ], - }, - }, - }, - { - id: 'highway_major_subtle', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - maxzoom: 11, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['in', 'class', 'primary', 'secondary', 'tertiary', 'trunk'], - ], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'hsla(0, 0%, 85%, 0.69)', - 'line-width': 2, - }, - }, - { - id: 'highway_motorway_casing', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 6, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['!in', 'brunnel', 'bridge', 'tunnel'], ['==', 'class', 'motorway']], - ], - layout: { - 'line-cap': 'butt', - 'line-join': 'miter', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgb(213, 213, 213)', - 'line-width': { - base: 1.4, - stops: [ - [5.8, 0], - [6, 3], - [20, 40], - ], - }, - 'line-dasharray': [2, 0], - 'line-opacity': 1, - }, - }, - { - id: 'highway_motorway_inner', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 6, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['!in', 'brunnel', 'bridge', 'tunnel'], ['==', 'class', 'motorway']], - ], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': { - base: 1, - stops: [ - [5.8, 'hsla(0, 0%, 85%, 0.53)'], - [6, '#fff'], - ], - }, - 'line-width': { - base: 1.4, - stops: [ - [4, 2], - [6, 1.3], - [20, 30], - ], - }, - }, - }, - { - id: 'highway_motorway_subtle', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - maxzoom: 6, - filter: ['all', ['==', '$type', 'LineString'], ['==', 'class', 'motorway']], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'hsla(0, 0%, 85%, 0.53)', - 'line-width': { - base: 1.4, - stops: [ - [4, 2], - [6, 1.3], - ], - }, - }, - }, - { - id: 'railway_transit', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 16, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'class', 'transit'], ['!in', 'brunnel', 'tunnel']], - ], - layout: { - visibility: 'visible', - 'line-join': 'round', - }, - paint: { - 'line-color': '#dddddd', - 'line-width': 3, - }, - }, - { - id: 'railway_transit_dashline', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 16, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'class', 'transit'], ['!in', 'brunnel', 'tunnel']], - ], - layout: { - visibility: 'visible', - 'line-join': 'round', - }, - paint: { - 'line-color': '#fafafa', - 'line-width': 2, - 'line-dasharray': [3, 3], - }, - }, - { - id: 'railway_service', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 16, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'class', 'rail'], ['has', 'service']], - ], - layout: { - visibility: 'visible', - 'line-join': 'round', - }, - paint: { - 'line-color': '#dddddd', - 'line-width': 3, - }, - }, - { - id: 'railway_service_dashline', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 16, - filter: ['all', ['==', '$type', 'LineString'], ['==', 'class', 'rail'], ['has', 'service']], - layout: { - visibility: 'visible', - 'line-join': 'round', - }, - paint: { - 'line-color': '#fafafa', - 'line-width': 2, - 'line-dasharray': [3, 3], - }, - }, - { - id: 'railway', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 13, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['!has', 'service'], ['==', 'class', 'rail']], - ], - layout: { - visibility: 'visible', - 'line-join': 'round', - }, - paint: { - 'line-color': '#dddddd', - 'line-width': { - base: 1.3, - stops: [ - [16, 3], - [20, 7], - ], - }, - }, - }, - { - id: 'railway_dashline', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 13, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['!has', 'service'], ['==', 'class', 'rail']], - ], - layout: { - visibility: 'visible', - 'line-join': 'round', - }, - paint: { - 'line-color': '#fafafa', - 'line-width': { - base: 1.3, - stops: [ - [16, 2], - [20, 6], - ], - }, - 'line-dasharray': [3, 3], - }, - }, - { - id: 'highway_motorway_bridge_casing', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 6, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'brunnel', 'bridge'], ['==', 'class', 'motorway']], - ], - layout: { - 'line-cap': 'butt', - 'line-join': 'miter', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgb(213, 213, 213)', - 'line-width': { - base: 1.4, - stops: [ - [5.8, 0], - [6, 5], - [20, 45], - ], - }, - 'line-dasharray': [2, 0], - 'line-opacity': 1, - }, - }, - { - id: 'highway_motorway_bridge_inner', - type: 'line', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation', - minzoom: 6, - filter: [ - 'all', - ['==', '$type', 'LineString'], - ['all', ['==', 'brunnel', 'bridge'], ['==', 'class', 'motorway']], - ], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': { - base: 1, - stops: [ - [5.8, 'hsla(0, 0%, 85%, 0.53)'], - [6, '#fff'], - ], - }, - 'line-width': { - base: 1.4, - stops: [ - [4, 2], - [6, 1.3], - [20, 30], - ], - }, - }, - }, - { - id: 'highway_name_motorway', - type: 'symbol', - metadata: { - 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', - }, - source: 'openmaptiles', - 'source-layer': 'transportation_name', - filter: ['all', ['==', '$type', 'LineString'], ['==', 'class', 'motorway']], - layout: { - 'text-size': 10, - 'symbol-spacing': 350, - 'text-font': ['Open Sans Regular'], - 'symbol-placement': 'line', - visibility: 'visible', - 'text-rotation-alignment': 'viewport', - 'text-pitch-alignment': 'viewport', - 'text-field': '{ref}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'hsl(0, 0%, 100%)', - 'text-translate': [0, 2], - 'text-halo-width': 1, - 'text-halo-blur': 1, - }, - }, - { - id: 'boundary_state', - type: 'line', - metadata: { - 'mapbox:group': 'a14c9607bc7954ba1df7205bf660433f', - }, - source: 'openmaptiles', - 'source-layer': 'boundary', - filter: ['==', 'admin_level', 4], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - visibility: 'visible', - }, - paint: { - 'line-color': 'rgb(230, 204, 207)', - 'line-width': { - base: 1.3, - stops: [ - [3, 1], - [22, 15], - ], - }, - 'line-blur': 0.4, - 'line-dasharray': [2, 2], - 'line-opacity': 1, - }, - }, - { - id: 'boundary_country', - type: 'line', - metadata: { - 'mapbox:group': 'a14c9607bc7954ba1df7205bf660433f', - }, - source: 'openmaptiles', - 'source-layer': 'boundary', - filter: ['==', 'admin_level', 2], - layout: { - 'line-cap': 'round', - 'line-join': 'round', - }, - paint: { - 'line-color': 'rgb(230, 204, 207)', - 'line-width': { - base: 1.1, - stops: [ - [3, 1], - [22, 20], - ], - }, - 'line-blur': { - base: 1, - stops: [ - [0, 0.4], - [22, 4], - ], - }, - 'line-opacity': 1, - }, - }, - { - id: 'place_other', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 14, - filter: [ - 'all', - ['in', 'class', 'continent', 'hamlet', 'neighbourhood', 'isolated_dwelling'], - ['==', '$type', 'Point'], - ], - layout: { - 'text-size': 10, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'center', - visibility: 'visible', - 'text-offset': [0.5, 0], - 'text-anchor': 'center', - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - }, - }, - { - id: 'place_suburb', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 15, - filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'suburb']], - layout: { - 'text-size': 10, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'center', - visibility: 'visible', - 'text-offset': [0.5, 0], - 'text-anchor': 'center', - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - }, - }, - { - id: 'place_village', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 14, - filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'village']], - layout: { - 'text-size': 10, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'left', - visibility: 'visible', - 'text-offset': [0.5, 0.2], - 'icon-size': 0.4, - 'text-anchor': 'left', - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - 'icon-opacity': 0.7, - }, - }, - { - id: 'place_town', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 15, - filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'town']], - layout: { - 'text-size': 10, - 'icon-image': { - base: 1, - stops: [ - [0, 'circle-11'], - [8, ''], - ], - }, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'left', - visibility: 'visible', - 'text-offset': [0.5, 0.2], - 'icon-size': 0.4, - 'text-anchor': { - base: 1, - stops: [ - [0, 'left'], - [8, 'center'], - ], - }, - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - 'icon-opacity': 0.7, - }, - }, - { - id: 'place_city', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 14, - filter: [ - 'all', - ['==', '$type', 'Point'], - ['all', ['!=', 'capital', 2], ['==', 'class', 'city'], ['>', 'rank', 3]], - ], - layout: { - 'text-size': 10, - 'icon-image': { - base: 1, - stops: [ - [0, 'circle-11'], - [8, ''], - ], - }, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'left', - visibility: 'visible', - 'text-offset': [0.5, 0.2], - 'icon-size': 0.4, - 'text-anchor': { - base: 1, - stops: [ - [0, 'left'], - [8, 'center'], - ], - }, - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - 'icon-opacity': 0.7, - }, - }, - { - id: 'place_capital', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 12, - filter: ['all', ['==', '$type', 'Point'], ['all', ['==', 'capital', 2], ['==', 'class', 'city']]], - layout: { - 'text-size': 14, - 'icon-image': { - base: 1, - stops: [ - [0, 'star-11'], - [8, ''], - ], - }, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'left', - visibility: 'visible', - 'text-offset': [0.5, 0.2], - 'icon-size': 1, - 'text-anchor': { - base: 1, - stops: [ - [0, 'left'], - [8, 'center'], - ], - }, - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - 'icon-opacity': 0.7, - }, - }, - { - id: 'place_city_large', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 12, - filter: [ - 'all', - ['==', '$type', 'Point'], - ['all', ['!=', 'capital', 2], ['<=', 'rank', 3], ['==', 'class', 'city']], - ], - layout: { - 'text-size': 14, - 'icon-image': { - base: 1, - stops: [ - [0, 'circle-11'], - [8, ''], - ], - }, - 'text-transform': 'uppercase', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'left', - visibility: 'visible', - 'text-offset': [0.5, 0.2], - 'icon-size': 0.4, - 'text-anchor': { - base: 1, - stops: [ - [0, 'left'], - [8, 'center'], - ], - }, - 'text-field': '{name:latin}\n{name:nonlatin}', - }, - paint: { - 'text-color': 'rgb(117, 129, 145)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - 'icon-opacity': 0.7, - }, - }, - { - id: 'place_state', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 12, - filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'state']], - layout: { - visibility: 'visible', - 'text-field': '{name:latin}\n{name:nonlatin}', - 'text-font': ['Open Sans Regular'], - 'text-transform': 'uppercase', - 'text-size': 10, - }, - paint: { - 'text-color': 'rgb(113, 129, 144)', - 'text-halo-color': 'rgb(242,243,240)', - 'text-halo-width': 1, - 'text-halo-blur': 1, - }, - }, - { - id: 'place_country_other', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 8, - filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'country'], ['!has', 'iso_a2']], - layout: { - visibility: 'visible', - 'text-field': '{name:latin}', - 'text-font': ['Open Sans Regular'], - 'text-transform': 'uppercase', - 'text-size': { - base: 1, - stops: [ - [0, 9], - [6, 11], - ], - }, - }, - paint: { - 'text-halo-width': 1.4, - 'text-halo-color': 'rgba(236,236,234,0.7)', - 'text-color': { - base: 1, - stops: [ - [3, 'rgb(157,169,177)'], - [4, 'rgb(153, 153, 153)'], - ], - }, - }, - }, - { - id: 'place_country_minor', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 8, - filter: [ - 'all', - ['==', '$type', 'Point'], - ['==', 'class', 'country'], - ['>=', 'rank', 2], - ['has', 'iso_a2'], - ], - layout: { - visibility: 'visible', - 'text-field': '{name:latin}', - 'text-font': ['Open Sans Regular'], - 'text-transform': 'uppercase', - 'text-size': { - base: 1, - stops: [ - [0, 10], - [6, 12], - ], - }, - }, - paint: { - 'text-halo-width': 1.4, - 'text-halo-color': 'rgba(236,236,234,0.7)', - 'text-color': { - base: 1, - stops: [ - [3, 'rgb(157,169,177)'], - [4, 'rgb(153, 153, 153)'], - ], - }, - }, - }, - { - id: 'place_country_major', - type: 'symbol', - metadata: { - 'mapbox:group': '101da9f13b64a08fa4b6ac1168e89e5f', - }, - source: 'openmaptiles', - 'source-layer': 'place', - maxzoom: 6, - filter: [ - 'all', - ['==', '$type', 'Point'], - ['<=', 'rank', 1], - ['==', 'class', 'country'], - ['has', 'iso_a2'], - ], - layout: { - visibility: 'visible', - 'text-field': '{name:latin}', - 'text-font': ['Open Sans Regular'], - 'text-transform': 'uppercase', - 'text-size': { - base: 1.4, - stops: [ - [0, 10], - [3, 12], - [4, 14], - ], - }, - 'text-anchor': 'center', - }, - paint: { - 'text-halo-width': 1.4, - 'text-halo-color': 'rgba(236,236,234,0.7)', - 'text-color': { - base: 1, - stops: [ - [3, 'rgb(157,169,177)'], - [4, 'rgb(153, 153, 153)'], - ], - }, - }, - }, - { - id: 'bounding_box', - type: 'fill', - source: 'site_plan', - 'source-layer': 'bounding_box', - paint: { - 'fill-color': 'rgba(240, 247, 240, 1)', - }, - }, - { - id: 'slope', - type: 'raster', - source: 'slope', - minzoom: 5, - }, - { - id: 'hillshade', - type: 'raster', - source: 'hillshade', - minzoom: 5, - }, - { - id: 'ortho', - type: 'raster', - source: 'ortho', - minzoom: 15, - }, - { - id: 'background_areas_backstage', - type: 'fill', - source: 'site_plan', - 'source-layer': 'areas_backstage_polygon', - paint: { - 'fill-color': 'rgba(232, 225, 225, 1)', - }, - }, - { - id: 'background_areas_camping_polygon', - type: 'fill', - source: 'site_plan', - 'source-layer': 'areas_camping_polygon', - paint: { - 'fill-color': 'rgba(227, 245, 227, 1)', - }, - }, - { - id: 'background_areas_camping_outline', - type: 'line', - source: 'site_plan', - 'source-layer': 'areas_camping_polygon', - paint: { - 'line-color': 'rgba(10, 100, 10, 0.4)', - 'line-blur': 7, - 'line-width': 3, - }, - }, - { - id: 'background_natural_woodland_polygon', - type: 'fill', - source: 'site_plan', - 'source-layer': 'natural_woodland_polygon', - layout: {}, - paint: { - 'fill-color': 'rgba(139, 193, 105, 1)', - }, - }, - { - id: 'background_natural_hedges_polygon', - type: 'fill', - source: 'site_plan', - 'source-layer': 'natural_hedges_polygon', - layout: {}, - paint: { - 'fill-color': 'rgba(139, 193, 105, 1)', - }, - }, - { - id: 'background_water_linestring', - type: 'line', - source: 'site_plan', - 'source-layer': 'natural_water_linestring', - layout: { - 'line-cap': 'round', - 'line-join': 'round', - 'line-round-limit': 1.1, - }, - paint: { - 'line-color': 'rgba(78, 131, 199, 1)', - 'line-width': { - stops: [ - [13, 1], - [15, 2], - [18, 6], - ], - }, - }, - }, - { - id: 'background_water_polygon', - type: 'fill', - source: 'site_plan', - 'source-layer': 'natural_water_polygon', - layout: {}, - paint: { - 'fill-color': 'rgba(78, 131, 199, 1)', - 'fill-antialias': true, - }, - }, - { - id: 'background_water_polygon_shadow', - type: 'line', - source: 'site_plan', - 'source-layer': 'natural_water_polygon', - layout: {}, - paint: { - 'line-color': 'rgba(102, 102, 183, 1)', - 'line-width': { - stops: [ - [13, 0], - [18, 2], - ], - }, - }, - }, - { - id: 'heras', - type: 'line', - source: 'site_plan', - 'source-layer': 'heras_internal__linestring', - paint: { - 'line-color': 'rgba(148, 63, 63, 1)', - }, - }, - { - id: 'paths_fire', - type: 'fill', - source: 'site_plan', - 'source-layer': 'paths_fire_polygon', - layout: {}, - paint: { - 'fill-color': 'rgba(221, 226, 203, 1)', - }, - }, - { - id: 'paths_tracks_case', - type: 'line', - source: 'site_plan', - 'source-layer': 'paths_roads_polygon', - minzoom: 0, - layout: { - 'line-cap': 'round', - 'line-join': 'round', - }, - paint: { - 'line-width': { - stops: [ - [12, 0], - [17, 5], - ], - }, - 'line-color': 'rgba(132, 131, 131, 1)', - 'line-blur': 0.5, - }, - }, - { - id: 'paths_trackway_case', - type: 'line', - source: 'site_plan', - 'source-layer': 'paths_trackway_polygon', - layout: {}, - paint: { - 'line-width': 3, - 'line-color': 'rgba(140, 140, 140, 1)', - }, - }, - { - id: 'paths_trackway', - type: 'fill', - source: 'site_plan', - 'source-layer': 'paths_trackway_polygon', - layout: {}, - paint: { - 'fill-color': 'rgba(185, 185, 185, 1)', - }, - }, - { - id: 'paths_tracks', - type: 'fill', - source: 'site_plan', - 'source-layer': 'paths_roads_polygon', - minzoom: 0, - paint: { - 'fill-color': 'rgba(177, 165, 147, 1)', - 'fill-outline-color': 'rgba(98, 98, 97, 0)', - }, - }, - { - id: 'structures_shadow', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_polygon', - minzoom: 0, - layout: { - 'line-cap': 'round', - 'line-join': 'round', - }, - paint: { - 'line-color': 'rgba(0, 0, 0, 0.3)', - 'line-width': 6, - 'line-blur': 3, - }, - }, - { - id: 'structures_polygon', - type: 'fill', - source: 'site_plan', - 'source-layer': 'structures_polygon', - minzoom: 0, - paint: { - 'fill-color': 'rgb(144, 204, 214)', - }, - }, - { - id: 'structures_outline', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_polygon', - minzoom: 0, - layout: { - 'line-cap': 'round', - 'line-join': 'round', - }, - paint: { - 'line-color': 'rgba(90, 81, 31, 1)', - }, - }, - { - id: 'structures_linestring', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_linestring', - minzoom: 0, - layout: { - 'line-cap': 'round', - 'line-join': 'round', - }, - paint: { - 'line-color': 'rgba(90, 81, 31, 1)', - }, - }, - { - id: 'structures_guys', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_guys_&_poles_linestring', - minzoom: 0, - paint: { - 'line-color': 'rgb(153, 144, 93)', - }, - }, - { - id: 'structures_exits', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_exits_linestring', - minzoom: 0, - paint: { - 'line-width': 3, - 'line-color': 'rgb(153, 144, 93)', - }, - }, - { - id: 'structures_internal_linestring', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_internal_linestring', - minzoom: 0, - paint: { - 'line-color': 'rgba(90, 81, 31, 1)', - }, - }, - { - id: 'structures_internal_polygon', - type: 'line', - source: 'site_plan', - 'source-layer': 'structures_internal_polygon', - minzoom: 0, - paint: { - 'line-color': 'rgba(90, 81, 31, 1)', - }, - }, - { - id: 'walls', - type: 'line', - source: 'site_plan', - 'source-layer': 'walls_linestring', - }, - { - id: 'fences', - type: 'line', - source: 'site_plan', - 'source-layer': 'fences_linestring', - paint: { - 'line-color': 'rgba(134, 134, 101, 1)', - }, - }, - { - id: 'trees', - type: 'circle', - source: 'site_plan', - 'source-layer': 'natural_trees_point', - minzoom: 13, - maxzoom: 0, - layout: {}, - paint: { - 'circle-color': 'rgba(135, 118, 29, 1)', - 'circle-stroke-color': 'rgba(139, 193, 105, 1)', - 'circle-stroke-width': { - stops: [ - [15, 0.5], - [19, 10], - ], - }, - 'circle-radius': { - stops: [ - [15, 0], - [17, 3], - ], - }, - 'circle-blur': 0, - }, - }, - { - id: 'buildings', - type: 'fill-extrusion', - source: 'site_plan', - 'source-layer': 'buildings_polygon', - layout: {}, - paint: { - 'fill-extrusion-color': 'rgba(189, 170, 85, 1)', - 'fill-extrusion-height': 4, - }, - }, - { - id: 'services_comms_ducts_case', - type: 'line', - source: 'site_plan', - 'source-layer': 'services_comms_ducts_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(150, 150, 150, 1)', - 'line-width': 3, - }, - }, - { - id: 'services_comms_ducts', - type: 'line', - source: 'site_plan', - 'source-layer': 'services_comms_ducts_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(187, 0, 218, 1)', - 'line-width': 2, - }, - }, - { - id: 'services_comms_lines', - type: 'line', - source: 'site_plan', - 'source-layer': 'services_comms_buried_lines_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(187, 0, 218, 1)', - 'line-width': 2, - }, - }, - { - id: 'services_comms_manholes', - type: 'circle', - source: 'site_plan', - 'source-layer': 'services_comms_manholes_point', - minzoom: 15, - paint: { - 'circle-color': 'rgba(187, 0, 218, 1)', - 'circle-stroke-width': 1, - }, - }, - { - id: 'services_comms_bt_poles', - type: 'circle', - source: 'site_plan', - 'source-layer': 'services_comms_bt_poles_point', - minzoom: 15, - paint: { - 'circle-color': 'rgba(136, 89, 6, 1)', - 'circle-stroke-width': 1, - }, - }, - { - id: 'services_comms_cabinets', - type: 'circle', - source: 'site_plan', - 'source-layer': 'services_comms_cabinets_point', - minzoom: 15, - paint: { - 'circle-color': 'rgba(218, 0, 62, 1)', - 'circle-stroke-width': 1, - }, - }, - { - id: 'services_comms_manholes_label-copy', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'services_comms_manholes_point', - minzoom: 15, - layout: { - 'text-field': '{id}', - 'text-font': ['Open Sans Regular'], - 'text-size': 14, - 'text-offset': [-1, 0], - }, - paint: { - 'text-halo-color': 'rgba(255, 255, 255, 1)', - 'text-halo-width': 2, - }, - }, - { - id: 'services_comms_cabinets_label', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'services_comms_cabinets_point', - minzoom: 15, - layout: { - 'text-field': '{name}', - 'text-font': ['Open Sans Regular'], - 'text-size': 12, - 'text-offset': [-2, 0], - }, - paint: { - 'text-halo-color': 'rgba(255, 255, 255, 1)', - 'text-halo-width': 2, - }, - }, - { - id: 'services_water_lines', - type: 'line', - source: 'site_plan', - 'source-layer': 'services_water_lines_linestring', - layout: {}, - paint: { - 'line-color': '#00C5FF', - 'line-width': 2, - }, - }, - { - id: 'services_water_points', - type: 'circle', - source: 'site_plan', - 'source-layer': 'services_water_points_point', - paint: { - 'circle-color': 'rgba(0, 197, 255, 1)', - 'circle-stroke-color': 'rgba(22, 0, 195, 1)', - 'circle-stroke-width': 2, - 'circle-radius': 3, - }, - }, - { - id: 'site_water_pipes', - type: 'line', - source: 'site_plan', - 'source-layer': 'water_pipes_linestring', - paint: { - 'line-color': 'rgba(0, 89, 255, 1)', - 'line-width': 2, - }, - }, - { - id: 'license_boundary', - type: 'line', - source: 'site_plan', - 'source-layer': 'license_license_boundary_polygon', - layout: { - 'line-cap': 'round', - 'line-join': 'round', - }, - paint: { - 'line-color': 'rgba(226, 11, 11, 1)', - 'line-dasharray': [10, 3], - 'line-width': { - stops: [ - [10, 1], - [17, 2], - ], - }, - }, - }, - { - id: 'dk_radius', - type: 'fill', - source: 'site_plan', - 'source-layer': 'noc_dk_radius_polygon', - paint: { - 'fill-color': 'rgba(169, 105, 163, 1)', - 'fill-opacity': 0.3, - }, - }, - { - id: 'dk', - type: 'line', - source: 'site_plan', - 'source-layer': 'noc_dk_polygon', - layout: {}, - paint: {}, - }, - { - id: 'dk_names', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'noc_dk_names_point', - minzoom: 16, - maxzoom: 24, - layout: { - 'symbol-placement': 'point', - 'text-field': '{text}', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'center', - 'text-size': 14, - 'text-padding': 2, - 'symbol-avoid-edges': true, - 'text-max-width': 8, - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(169, 105, 163, 1)', - 'text-translate': [-4, 0], - }, - }, - { - id: 'noc_fiber', - type: 'line', - source: 'site_plan', - 'source-layer': 'noc_fibre_linestring', - paint: { - 'line-opacity': 1, - 'line-color': 'rgba(147, 84, 150, 1)', - 'line-width': 2, - }, - }, - { - id: 'noc_fiber_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'noc_fibre_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': 'Fiber ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(147, 84, 150, 1)', - }, - }, - { - id: 'noc_copper', - type: 'line', - source: 'site_plan', - 'source-layer': 'noc_copper_linestring', - minzoom: 0, - paint: { - 'line-opacity': 1, - 'line-color': 'rgba(174, 127, 176, 1)', - 'line-width': 2, - }, - }, - { - id: 'noc_copper_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'noc_copper_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': 'Cat5e ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(174, 127, 176, 1)', - }, - }, - { - id: 'noc_switch', - type: 'circle', - source: 'site_plan', - 'source-layer': 'noc_switch_point', - minzoom: 0, - maxzoom: 24, - layout: {}, - paint: { - 'circle-color': 'rgba(75, 0, 130, 1)', - 'circle-radius': 3, - }, - }, - { - id: 'noc_switch_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'noc_switch_point', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'point', - 'symbol-spacing': 1000, - 'symbol-avoid-edges': true, - 'text-field': '{switch}', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-anchor': 'right', - 'text-offset': [-1, 0], - 'text-justify': 'right', - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(75, 0, 130, 1)', - }, - }, - { - id: 'power_generator', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_generator_polygon', - layout: {}, - paint: { - 'line-color': 'magenta', - }, - }, - { - id: 'power_400_3', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_400_3_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(255, 68, 0, 1)', - 'line-width': 4, - }, - }, - { - id: 'power_125_3', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_125_3_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(199, 33, 33, 1)', - 'line-width': 3, - }, - }, - { - id: 'power_63_3', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_63_3_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(199, 33, 33, 1)', - 'line-width': 2, - }, - }, - { - id: 'power_32_3', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_32_3_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(199, 33, 33, 1)', - 'line-width': 1, - }, - }, - { - id: 'power_32_1', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_32_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(11, 11, 214, 1)', - 'line-width': 2, - }, - }, - { - id: 'power_16_1', - type: 'line', - source: 'site_plan', - 'source-layer': 'power_16_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(11, 11, 214, 1)', - 'line-width': 1, - }, - }, - { - id: 'power_400_3_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_400_3_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': '400A ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(199, 33, 33, 1)', - }, - }, - { - id: 'power_125_3_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_125_3_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': '125A ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(199, 33, 33, 1)', - }, - }, - { - id: 'power_63_3_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_63_3_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': '63A ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(199, 33, 33, 1)', - }, - }, - { - id: 'power_32_3_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_32_3_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': '32A ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(199, 33, 33, 1)', - }, - }, - { - id: 'power_32_1_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_32_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': '32A ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(11, 11, 214, 1)', - }, - }, - { - id: 'power_16_1_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_16_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'symbol-spacing': 1000, - 'text-field': '16A ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(11, 11, 214, 1)', - }, - }, - { - id: 'power_distro', - type: 'circle', - source: 'site_plan', - 'source-layer': 'power_distro_point', - layout: {}, - paint: { - 'circle-color': [ - 'match', - ['get', 'distro'], - 'TOB/32', - 'blue', - 'TOB/16', - 'blue', - 'CABIN', - 'blue', - 'ColdRoom', - 'blue', - 'SOB', - 'blue', - 'SSB 1', - 'blue', - 'SSB 2', - 'blue', - 'MD1 32 1', - 'blue', - 'rgba(199, 33, 33, 1)', - ], - 'circle-radius': 3, - }, - }, - { - id: 'power_distro_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'power_distro_point', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'point', - 'symbol-spacing': 1000, - 'symbol-avoid-edges': true, - 'text-field': '{name}\n({distro})', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-anchor': 'left', - 'text-offset': [1, 0], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': [ - 'match', - ['get', 'distro'], - 'TOB/32', - 'blue', - 'TOB/16', - 'blue', - 'CABIN', - 'blue', - 'ColdRoom', - 'blue', - 'SOB', - 'blue', - 'SSB 1', - 'blue', - 'SSB 2', - 'blue', - 'MD1 32 1', - 'blue', - 'rgba(199, 33, 33, 1)', - ], - }, - }, - { - id: 'lighting_festoon', - type: 'line', - source: 'site_plan', - 'source-layer': 'lighting_festoon_linestring', - layout: {}, - paint: { - 'line-color': 'rgba(200, 184, 42, 1)', - 'line-width': 2, - }, - }, - { - id: 'lighting_festoon_labels', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'lighting_festoon_linestring', - minzoom: 19, - maxzoom: 24, - layout: { - 'symbol-placement': 'line', - 'text-field': 'Festoon ({length}m)', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-allow-overlap': false, - 'text-offset': [0, -1], - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(200, 184, 42, 1)', - }, - }, - { - id: 'labels_camping', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'camping_centroid', - minzoom: 16, - maxzoom: 24, - layout: { - 'text-field': 'Camping: {camping}', - 'text-font': ['Open Sans Regular'], - 'text-justify': 'center', - 'text-size': 13, - 'text-padding': 2, - 'symbol-placement': 'point', - 'symbol-spacing': 1000, - 'symbol-avoid-edges': true, - 'text-max-width': 8, - }, - paint: { - 'text-halo-width': 3, - 'text-halo-blur': 1, - 'text-halo-color': 'rgba(255, 255, 255, 0.29)', - }, - }, - { - id: 'labels_gate', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'labels_gate_labels_point', - minzoom: 16, - maxzoom: 24, - layout: { - 'text-field': '{text}', - 'text-size': 12, - 'text-optional': false, - 'text-font': ['Open Sans Regular'], - 'text-keep-upright': true, - 'text-ignore-placement': false, - 'text-allow-overlap': false, - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(0, 0, 0, 1)', - }, - }, - { - id: 'labels_main', - type: 'symbol', - source: 'site_plan', - 'source-layer': 'labels_point', - minzoom: 16, - maxzoom: 24, - layout: { - 'text-field': '{text}', - 'text-font': ['Open Sans Regular'], - 'text-size': 12, - 'text-optional': false, - }, - paint: { - 'text-halo-color': 'rgba(241, 241, 241, 0.8)', - 'text-halo-width': 3, - 'text-color': 'rgba(0, 0, 0, 1)', - }, - }, - { - id: 'villages_symbol', - type: 'circle', - source: 'villages', - 'source-layer': '', - minzoom: 16, - paint: { - 'circle-color': 'rgb(246, 163, 24)', - 'circle-radius': { - stops: [ - [16, 6], - [24, 26], - ], - }, - 'circle-blur': 0.5, - 'circle-stroke-width': 0.5, - }, - }, - { - id: 'villages_text', - type: 'symbol', - source: 'villages', - 'source-layer': '', - minzoom: 17, - maxzoom: 24, - layout: { - 'text-field': '{name}', - 'text-font': ['Open Sans Regular'], - 'text-offset': [0, -1.8], - 'text-size': { - stops: [ - [17, 11], - [24, 16], - ], - }, - }, - paint: { - 'text-halo-color': 'rgba(244, 235, 247, 0.73)', - 'text-halo-width': 2, - 'text-halo-blur': 1, - }, - }, - ], - id: 'positron', - owner: '', -} diff --git a/web/src/style/basemap.ts b/web/src/style/basemap.ts new file mode 100644 index 0000000..ef5b050 --- /dev/null +++ b/web/src/style/basemap.ts @@ -0,0 +1,773 @@ +import { LayerSpecificationWithZIndex } from './types' + +const layers: LayerSpecificationWithZIndex[] = [ + { + id: 'water', + type: 'fill', + source: 'openmaptiles', + 'source-layer': 'water', + filter: ['==', '$type', 'Polygon'], + layout: { + visibility: 'visible', + }, + paint: { + 'fill-color': 'rgb(194, 200, 202)', + 'fill-antialias': true, + }, + }, + { + id: 'landcover_ice_shelf', + type: 'fill', + source: 'openmaptiles', + 'source-layer': 'landcover', + maxzoom: 8, + filter: ['all', ['==', '$type', 'Polygon'], ['==', 'subclass', 'ice_shelf']], + layout: { + visibility: 'visible', + }, + paint: { + 'fill-color': 'hsl(0, 0%, 98%)', + 'fill-opacity': 0.7, + }, + }, + { + id: 'landuse_residential', + type: 'fill', + source: 'openmaptiles', + 'source-layer': 'landuse', + maxzoom: 16, + filter: ['all', ['==', '$type', 'Polygon'], ['==', 'class', 'residential']], + layout: { + visibility: 'visible', + }, + paint: { + 'fill-color': 'rgb(234, 234, 230)', + 'fill-opacity': ['interpolate', ['exponential', 0.6], ['zoom'], 8, 0.8, 9, 0.6], + }, + }, + { + id: 'waterway', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'waterway', + filter: ['all', ['==', '$type', 'LineString']], + layout: { + visibility: 'visible', + }, + paint: { + 'line-color': 'hsl(195, 17%, 78%)', + }, + }, + { + id: 'water_name', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'water_name', + filter: ['==', '$type', 'LineString'], + layout: { + 'text-field': '{name:latin}\n{name:nonlatin}', + 'symbol-placement': 'line', + 'text-rotation-alignment': 'map', + 'symbol-spacing': 500, + 'text-font': ['Open Sans Regular'], + 'text-size': 12, + }, + paint: { + 'text-color': 'rgb(157,169,177)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + }, + { + id: 'building', + type: 'fill', + source: 'openmaptiles', + 'source-layer': 'building', + minzoom: 12, + paint: { + 'fill-color': 'rgb(234, 234, 229)', + 'fill-outline-color': 'rgb(219, 219, 218)', + 'fill-antialias': true, + }, + }, + { + id: 'tunnel_motorway_casing', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 6, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['==', 'brunnel', 'tunnel'], ['==', 'class', 'motorway']], + ], + layout: { + 'line-cap': 'butt', + 'line-join': 'miter', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgb(213, 213, 213)', + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 5.8, 0, 6, 3, 20, 40], + }, + }, + { + id: 'tunnel_motorway_inner', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 6, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['==', 'brunnel', 'tunnel'], ['==', 'class', 'motorway']], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgb(234,234,234)', + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 4, 2, 6, 1.3, 20, 30], + }, + }, + { + id: 'aeroway-taxiway', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'aeroway', + minzoom: 12, + filter: ['all', ['in', 'class', 'taxiway']], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'hsl(0, 0%, 88%)', + 'line-width': ['interpolate', ['exponential', 1.55], ['zoom'], 13, 1.8, 20, 20], + }, + }, + { + id: 'aeroway-runway-casing', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'aeroway', + minzoom: 11, + filter: ['all', ['in', 'class', 'runway']], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'hsl(0, 0%, 88%)', + 'line-width': ['interpolate', ['exponential', 1.5], ['zoom'], 11, 4, 17, 55], + }, + }, + { + id: 'aeroway-area', + type: 'fill', + source: 'openmaptiles', + 'source-layer': 'aeroway', + minzoom: 4, + filter: ['all', ['==', '$type', 'Polygon'], ['in', 'class', 'runway', 'taxiway']], + layout: { + visibility: 'visible', + }, + paint: { + 'fill-opacity': ['interpolate', ['linear'], ['zoom'], 13, 0, 14, 1], + 'fill-color': 'rgba(255, 255, 255, 1)', + }, + }, + { + id: 'aeroway-runway', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'aeroway', + minzoom: 11, + maxzoom: 24, + filter: ['all', ['in', 'class', 'runway'], ['==', '$type', 'LineString']], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgba(255, 255, 255, 1)', + 'line-width': ['interpolate', ['exponential', 1.5], ['zoom'], 11, 4, 17, 50], + }, + }, + { + id: 'highway_minor', + type: 'line', + metadata: { + 'mapbox:group': 'b6371a3f2f5a9932464fa3867530a2e5', + }, + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 8, + filter: ['all', ['==', '$type', 'LineString'], ['in', 'class', 'minor', 'service', 'track']], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'hsl(0, 0%, 88%)', + 'line-width': ['interpolate', ['exponential', 1.55], ['zoom'], 13, 1.8, 20, 20], + 'line-opacity': 0.9, + }, + }, + { + id: 'highway_major_casing', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 11, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['in', 'class', 'primary', 'secondary', 'tertiary', 'trunk'], + ], + layout: { + 'line-cap': 'butt', + 'line-join': 'miter', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgb(213, 213, 213)', + 'line-dasharray': [12, 0], + 'line-width': ['interpolate', ['exponential', 1.3], ['zoom'], 10, 3, 20, 23], + }, + }, + { + id: 'highway_major_inner', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 11, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['in', 'class', 'primary', 'secondary', 'tertiary', 'trunk'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': '#fff', + 'line-width': ['interpolate', ['exponential', 1.3], ['zoom'], 10, 2, 20, 20], + }, + }, + { + id: 'highway_major_subtle', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + maxzoom: 11, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['in', 'class', 'primary', 'secondary', 'tertiary', 'trunk'], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'hsla(0, 0%, 85%, 0.69)', + 'line-width': 2, + }, + }, + { + id: 'highway_motorway_casing', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 6, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['!in', 'brunnel', 'bridge', 'tunnel'], ['==', 'class', 'motorway']], + ], + layout: { + 'line-cap': 'butt', + 'line-join': 'miter', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgb(213, 213, 213)', + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 5.8, 0, 6, 3, 20, 40], + 'line-dasharray': [2, 0], + }, + }, + { + id: 'highway_motorway_inner', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 6, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['!in', 'brunnel', 'bridge', 'tunnel'], ['==', 'class', 'motorway']], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': ['interpolate-hcl', ['linear'], ['zoom'], 6, 'hsla(0, 0%, 85%, 0.53)', 8, '#fff'], + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 4, 2, 6, 1.3, 20, 30], + }, + }, + { + id: 'highway_motorway_subtle', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + maxzoom: 6, + filter: ['all', ['==', '$type', 'LineString'], ['==', 'class', 'motorway']], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'hsla(0, 0%, 85%, 0.53)', + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 4, 2, 6, 1.3], + }, + }, + { + id: 'railway_transit', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 16, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['==', 'class', 'transit'], ['!in', 'brunnel', 'tunnel']], + ], + layout: { + visibility: 'visible', + 'line-join': 'round', + }, + paint: { + 'line-color': '#dddddd', + 'line-width': 3, + }, + }, + { + id: 'railway_transit_dashline', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 16, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['==', 'class', 'transit'], ['!in', 'brunnel', 'tunnel']], + ], + layout: { + visibility: 'visible', + 'line-join': 'round', + }, + paint: { + 'line-color': '#fafafa', + 'line-width': 2, + 'line-dasharray': [3, 3], + }, + }, + { + id: 'railway_service', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 16, + filter: ['all', ['==', '$type', 'LineString'], ['all', ['==', 'class', 'rail'], ['has', 'service']]], + layout: { + visibility: 'visible', + 'line-join': 'round', + }, + paint: { + 'line-color': '#dddddd', + 'line-width': 3, + }, + }, + { + id: 'railway_service_dashline', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 16, + filter: ['all', ['==', '$type', 'LineString'], ['==', 'class', 'rail'], ['has', 'service']], + layout: { + visibility: 'visible', + 'line-join': 'round', + }, + paint: { + 'line-color': '#fafafa', + 'line-width': 2, + 'line-dasharray': [3, 3], + }, + }, + { + id: 'railway', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 13, + filter: ['all', ['==', '$type', 'LineString'], ['all', ['!has', 'service'], ['==', 'class', 'rail']]], + layout: { + visibility: 'visible', + 'line-join': 'round', + }, + paint: { + 'line-color': '#dddddd', + 'line-width': ['interpolate', ['exponential', 1.3], ['zoom'], 9, 2, 20, 7], + }, + }, + { + id: 'railway_dashline', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 13, + filter: ['all', ['==', '$type', 'LineString'], ['all', ['!has', 'service'], ['==', 'class', 'rail']]], + layout: { + visibility: 'visible', + 'line-join': 'round', + }, + paint: { + 'line-color': '#fafafa', + 'line-width': ['interpolate', ['exponential', 1.3], ['zoom'], 9, 1, 20, 6], + 'line-dasharray': [3, 3], + }, + }, + { + id: 'highway_motorway_bridge_casing', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 6, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['==', 'brunnel', 'bridge'], ['==', 'class', 'motorway']], + ], + layout: { + 'line-cap': 'butt', + 'line-join': 'miter', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgb(213, 213, 213)', + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 5.8, 0, 6, 5, 20, 45], + 'line-dasharray': [2, 0], + }, + }, + { + id: 'highway_motorway_bridge_inner', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'transportation', + minzoom: 6, + filter: [ + 'all', + ['==', '$type', 'LineString'], + ['all', ['==', 'brunnel', 'bridge'], ['==', 'class', 'motorway']], + ], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': ['interpolate-hcl', ['linear'], ['zoom'], 5.8, 'hsla(0, 0%, 85%, 0.53)', 6, '#fff'], + 'line-width': ['interpolate', ['exponential', 1.4], ['zoom'], 4, 2, 6, 1.3, 20, 30], + }, + }, + { + id: 'highway_name_motorway', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'transportation_name', + filter: ['all', ['==', '$type', 'LineString'], ['==', 'class', 'motorway']], + layout: { + 'text-size': 10, + 'symbol-spacing': 350, + 'text-font': ['Open Sans Regular'], + 'symbol-placement': 'line', + visibility: 'visible', + 'text-rotation-alignment': 'viewport', + 'text-pitch-alignment': 'viewport', + 'text-field': '{ref}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'hsl(0, 0%, 100%)', + 'text-translate': [0, 2], + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + }, + { + id: 'boundary_state', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'boundary', + filter: ['==', 'admin_level', 4], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + visibility: 'visible', + }, + paint: { + 'line-color': 'rgb(230, 204, 207)', + 'line-width': ['interpolate', ['linear'], ['zoom'], 3, 1, 22, 15], + 'line-blur': 0.4, + 'line-dasharray': [2, 2], + 'line-opacity': 1, + }, + }, + { + id: 'boundary_country', + type: 'line', + source: 'openmaptiles', + 'source-layer': 'boundary', + filter: ['==', 'admin_level', 2], + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-color': 'rgb(230, 204, 207)', + 'line-width': ['interpolate', ['exponential', 1.1], ['zoom'], 3, 1, 22, 20], + 'line-blur': ['interpolate', ['linear'], ['zoom'], 3, 0.4, 22, 4], + }, + }, + { + id: 'place_other', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 14, + filter: [ + 'all', + ['in', 'class', 'continent', 'hamlet', 'neighbourhood', 'isolated_dwelling'], + ['==', '$type', 'Point'], + ], + layout: { + 'text-size': 10, + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'center', + visibility: 'visible', + 'text-offset': [0.5, 0], + 'text-anchor': 'center', + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + }, + { + id: 'place_suburb', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 15, + filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'suburb']], + layout: { + 'text-size': 10, + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'center', + visibility: 'visible', + 'text-offset': [0.5, 0], + 'text-anchor': 'center', + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + }, + { + id: 'place_village', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 14, + filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'village']], + layout: { + 'text-size': 10, + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'left', + visibility: 'visible', + 'text-offset': [0.5, 0.2], + 'icon-size': 0.4, + 'text-anchor': 'left', + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'icon-opacity': 0.7, + }, + }, + { + id: 'place_town', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 15, + filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'town']], + layout: { + 'text-size': 10, + 'icon-image': ['step', ['zoom'], 'circle-11', 8, ''], + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'left', + visibility: 'visible', + 'text-offset': [0.5, 0.2], + 'icon-size': 0.4, + 'text-anchor': ['step', ['zoom'], 'left', 8, 'center'], + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'icon-opacity': 0.7, + }, + }, + { + id: 'place_city', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 14, + filter: [ + 'all', + ['==', '$type', 'Point'], + ['all', ['!=', 'capital', 2], ['==', 'class', 'city'], ['>', 'rank', 3]], + ], + layout: { + 'text-size': 10, + 'icon-image': ['step', ['zoom'], 'circle-11', 8, ''], + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'left', + visibility: 'visible', + 'text-offset': [0.5, 0.2], + 'icon-size': 0.4, + 'text-anchor': ['step', ['zoom'], 'left', 8, 'center'], + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'icon-opacity': 0.7, + }, + }, + { + id: 'place_capital', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 12, + filter: ['all', ['==', '$type', 'Point'], ['all', ['==', 'capital', 2], ['==', 'class', 'city']]], + layout: { + 'text-size': 14, + 'icon-image': ['step', ['zoom'], 'star-11', 8, ''], + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'left', + visibility: 'visible', + 'text-offset': [0.5, 0.2], + 'icon-size': 1, + 'text-anchor': ['step', ['zoom'], 'left', 8, 'center'], + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'icon-opacity': 0.7, + }, + }, + { + id: 'place_city_large', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 12, + filter: [ + 'all', + ['==', '$type', 'Point'], + ['all', ['!=', 'capital', 2], ['<=', 'rank', 3], ['==', 'class', 'city']], + ], + layout: { + 'text-size': 14, + 'icon-image': ['step', ['zoom'], 'circle-11', 8, ''], + 'text-transform': 'uppercase', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'left', + visibility: 'visible', + 'text-offset': [0.5, 0.2], + 'icon-size': 0.4, + 'text-field': '{name:latin}\n{name:nonlatin}', + }, + paint: { + 'text-color': 'rgb(117, 129, 145)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + 'icon-opacity': 0.7, + }, + }, + { + id: 'place_state', + type: 'symbol', + source: 'openmaptiles', + 'source-layer': 'place', + maxzoom: 12, + filter: ['all', ['==', '$type', 'Point'], ['==', 'class', 'state']], + layout: { + visibility: 'visible', + 'text-field': '{name:latin}\n{name:nonlatin}', + 'text-font': ['Open Sans Regular'], + 'text-transform': 'uppercase', + 'text-size': 10, + }, + paint: { + 'text-color': 'rgb(113, 129, 144)', + 'text-halo-color': 'rgb(242,243,240)', + 'text-halo-width': 1, + 'text-halo-blur': 1, + }, + }, +] + +export default layers diff --git a/web/src/style/map_style.ts b/web/src/style/map_style.ts new file mode 100644 index 0000000..78ef302 --- /dev/null +++ b/web/src/style/map_style.ts @@ -0,0 +1,1165 @@ +import sortBy from 'lodash.sortby' +import { StyleSpecification } from 'maplibre-gl' +import basemap from './basemap' +import { LayerSpecificationWithZIndex } from './types' + +const backgroundColour = '#DBE8A5' +const waterColour = '#2EADD9' + +const layers: LayerSpecificationWithZIndex[] = [ + { + id: 'background', + type: 'background', + paint: { + 'background-color': backgroundColour, + }, + }, + ...basemap, + { + id: 'bounding_box', + type: 'fill', + source: 'site_plan', + 'source-layer': 'bounding_box', + paint: { + 'fill-color': backgroundColour, + }, + }, + { + id: 'slope', + type: 'raster', + source: 'slope', + minzoom: 5, + }, + { + id: 'hillshade', + type: 'raster', + source: 'hillshade', + minzoom: 5, + }, + { + id: 'ortho', + type: 'raster', + source: 'ortho', + minzoom: 15, + }, + { + id: 'background_areas_backstage', + type: 'fill', + source: 'site_plan', + 'source-layer': 'areas_backstage_polygon', + paint: { + 'fill-pattern': 'no-access', + }, + }, + { + id: 'background_areas_camping_polygon', + type: 'fill', + source: 'site_plan', + 'source-layer': 'areas_camping_polygon', + paint: { + 'fill-color': '#AFC944', + }, + }, + { + id: 'background_areas_camping_outline', + type: 'line', + source: 'site_plan', + 'source-layer': 'areas_camping_polygon', + paint: { + 'line-color': 'rgba(10, 100, 10, 0.4)', + 'line-blur': 7, + 'line-width': 3, + }, + }, + { + id: 'background_natural_woodland_polygon', + type: 'fill', + source: 'site_plan', + 'source-layer': 'natural_woodland_polygon', + layout: {}, + paint: { + 'fill-color': '#528329', + }, + }, + { + id: 'background_natural_hedges_polygon', + type: 'fill', + source: 'site_plan', + 'source-layer': 'natural_hedges_polygon', + layout: {}, + paint: { + 'fill-color': '#528329', + }, + }, + { + id: 'background_water_linestring', + type: 'line', + source: 'site_plan', + 'source-layer': 'natural_water_linestring', + layout: { + 'line-cap': 'round', + 'line-join': 'round', + 'line-round-limit': 1.1, + }, + paint: { + 'line-color': waterColour, + 'line-width': ['interpolate', ['linear'], ['zoom'], 13, 1, 15, 2, 18, 6], + }, + }, + { + id: 'background_water_polygon', + type: 'fill', + source: 'site_plan', + 'source-layer': 'natural_water_polygon', + layout: {}, + paint: { + 'fill-pattern': 'water', + }, + }, + { + id: 'background_water_polygon_shadow', + type: 'line', + source: 'site_plan', + 'source-layer': 'natural_water_polygon', + layout: {}, + paint: { + 'line-color': '#1D718C', + 'line-width': ['interpolate', ['linear'], ['zoom'], 13, 0, 18, 2], + }, + }, + { + id: 'paths_fire', + type: 'fill', + source: 'site_plan', + 'source-layer': 'paths_fire_polygon', + layout: {}, + paint: { + 'fill-color': backgroundColour, + }, + }, + { + id: 'paths_tracks_case', + type: 'line', + source: 'site_plan', + 'source-layer': 'paths_roads_polygon', + minzoom: 0, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-width': ['interpolate', ['linear'], ['zoom'], 12, 0, 17, 5], + 'line-color': 'rgba(132, 131, 131, 1)', + 'line-blur': 0.5, + }, + }, + { + id: 'paths_trackway_case', + type: 'line', + source: 'site_plan', + 'source-layer': 'paths_trackway_polygon', + layout: {}, + paint: { + 'line-width': 3, + 'line-color': 'rgba(140, 140, 140, 1)', + }, + }, + { + id: 'paths_trackway', + type: 'fill', + source: 'site_plan', + 'source-layer': 'paths_trackway_polygon', + layout: {}, + paint: { + 'fill-color': 'rgba(185, 185, 185, 1)', + }, + }, + { + id: 'paths_tracks', + type: 'fill', + source: 'site_plan', + 'source-layer': 'paths_roads_polygon', + minzoom: 0, + paint: { + 'fill-color': 'rgba(177, 165, 147, 1)', + 'fill-outline-color': 'rgba(98, 98, 97, 0)', + }, + }, + { + id: 'heras', + type: 'line', + source: 'site_plan', + 'source-layer': 'heras_internal__linestring', + paint: { + 'line-color': 'rgba(148, 63, 63, 1)', + }, + }, + { + id: 'structures_shadow', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_polygon', + minzoom: 0, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-color': 'rgba(0, 0, 0, 0.3)', + 'line-width': 6, + 'line-blur': 3, + }, + }, + { + id: 'structures_polygon', + type: 'fill', + source: 'site_plan', + 'source-layer': 'structures_polygon', + minzoom: 0, + paint: { + 'fill-color': '#F9E200', + }, + }, + { + id: 'structures_outline', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_polygon', + minzoom: 0, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-color': 'rgba(90, 81, 31, 1)', + }, + }, + { + id: 'structures_linestring', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_linestring', + minzoom: 0, + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-color': 'rgba(90, 81, 31, 1)', + }, + }, + { + id: 'structures_guys', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_guys_&_poles_linestring', + minzoom: 0, + paint: { + 'line-color': 'rgb(153, 144, 93)', + }, + }, + { + id: 'structures_exits', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_exits_linestring', + minzoom: 0, + paint: { + 'line-width': 3, + 'line-color': 'rgb(153, 144, 93)', + }, + }, + { + id: 'structures_internal_linestring', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_internal_linestring', + minzoom: 0, + paint: { + 'line-color': 'rgba(90, 81, 31, 1)', + }, + }, + { + id: 'structures_internal_polygon', + type: 'line', + source: 'site_plan', + 'source-layer': 'structures_internal_polygon', + minzoom: 0, + paint: { + 'line-color': 'rgba(90, 81, 31, 1)', + }, + }, + { + id: 'walls', + type: 'line', + source: 'site_plan', + 'source-layer': 'walls_linestring', + }, + { + id: 'fences', + type: 'line', + source: 'site_plan', + 'source-layer': 'fences_linestring', + paint: { + 'line-color': 'rgba(134, 134, 101, 1)', + }, + }, + { + id: 'trees', + type: 'circle', + source: 'site_plan', + 'source-layer': 'natural_trees_point', + minzoom: 13, + maxzoom: 0, + layout: {}, + paint: { + 'circle-color': 'rgba(135, 118, 29, 1)', + 'circle-stroke-color': '#528329', + 'circle-stroke-width': ['interpolate', ['linear'], ['zoom'], 15, 0.5, 19, 10], + 'circle-radius': ['interpolate', ['linear'], ['zoom'], 15, 0, 17, 3], + 'circle-blur': 0, + }, + }, + { + id: 'buildings', + type: 'fill-extrusion', + source: 'site_plan', + 'source-layer': 'buildings_polygon', + layout: {}, + paint: { + 'fill-extrusion-color': 'rgba(189, 170, 85, 1)', + 'fill-extrusion-height': 4, + }, + }, + { + id: 'services_comms_ducts_case', + type: 'line', + source: 'site_plan', + 'source-layer': 'services_comms_ducts_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(150, 150, 150, 1)', + 'line-width': 3, + }, + }, + { + id: 'services_comms_ducts', + type: 'line', + source: 'site_plan', + 'source-layer': 'services_comms_ducts_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(187, 0, 218, 1)', + 'line-width': 2, + }, + }, + { + id: 'services_comms_lines', + type: 'line', + source: 'site_plan', + 'source-layer': 'services_comms_buried_lines_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(187, 0, 218, 1)', + 'line-width': 2, + }, + }, + { + id: 'services_comms_manholes', + type: 'circle', + source: 'site_plan', + 'source-layer': 'services_comms_manholes_point', + minzoom: 15, + paint: { + 'circle-color': 'rgba(187, 0, 218, 1)', + 'circle-stroke-width': 1, + }, + }, + { + id: 'services_comms_bt_poles', + type: 'circle', + source: 'site_plan', + 'source-layer': 'services_comms_bt_poles_point', + minzoom: 15, + paint: { + 'circle-color': 'rgba(136, 89, 6, 1)', + 'circle-stroke-width': 1, + }, + }, + { + id: 'services_comms_cabinets', + type: 'circle', + source: 'site_plan', + 'source-layer': 'services_comms_cabinets_point', + minzoom: 15, + paint: { + 'circle-color': 'rgba(218, 0, 62, 1)', + 'circle-stroke-width': 1, + }, + }, + { + id: 'services_comms_manholes_label-copy', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'services_comms_manholes_point', + minzoom: 15, + layout: { + 'text-field': '{id}', + 'text-font': ['Open Sans Regular'], + 'text-size': 14, + 'text-offset': [-1, 0], + }, + paint: { + 'text-halo-color': 'rgba(255, 255, 255, 1)', + 'text-halo-width': 2, + }, + }, + { + id: 'services_comms_cabinets_label', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'services_comms_cabinets_point', + minzoom: 15, + layout: { + 'text-field': '{name}', + 'text-font': ['Open Sans Regular'], + 'text-size': 12, + 'text-offset': [-2, 0], + }, + paint: { + 'text-halo-color': 'rgba(255, 255, 255, 1)', + 'text-halo-width': 2, + }, + }, + { + id: 'services_water_lines', + type: 'line', + source: 'site_plan', + 'source-layer': 'services_water_lines_linestring', + layout: {}, + paint: { + 'line-color': '#00C5FF', + 'line-width': 2, + }, + }, + { + id: 'services_water_points', + type: 'circle', + source: 'site_plan', + 'source-layer': 'services_water_points_point', + paint: { + 'circle-color': 'rgba(0, 197, 255, 1)', + 'circle-stroke-color': 'rgba(22, 0, 195, 1)', + 'circle-stroke-width': 2, + 'circle-radius': 3, + }, + }, + { + id: 'site_water_pipes', + type: 'line', + source: 'site_plan', + 'source-layer': 'water_pipes_linestring', + paint: { + 'line-color': 'rgba(0, 89, 255, 1)', + 'line-width': 2, + }, + }, + { + id: 'boundary', + type: 'line', + source: 'site_plan', + 'source-layer': 'heras_perimeter__linestring', + layout: { + 'line-cap': 'round', + 'line-join': 'round', + }, + paint: { + 'line-color': 'rgba(226, 11, 11, 1)', + 'line-dasharray': [10, 3], + 'line-width': ['interpolate', ['linear'], ['zoom'], 10, 1, 17, 2], + }, + }, + { + id: 'dk_radius', + type: 'fill', + source: 'site_plan', + 'source-layer': 'noc_dk_radius_polygon', + paint: { + 'fill-color': 'rgba(169, 105, 163, 1)', + 'fill-opacity': 0.3, + }, + }, + { + id: 'dk', + type: 'line', + source: 'site_plan', + 'source-layer': 'noc_dk_polygon', + layout: {}, + paint: {}, + }, + { + id: 'dk_names', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'noc_dk_names_point', + minzoom: 16, + maxzoom: 24, + layout: { + 'symbol-placement': 'point', + 'text-field': '{text}', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'center', + 'text-size': 14, + 'text-padding': 2, + 'symbol-avoid-edges': true, + 'text-max-width': 8, + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(169, 105, 163, 1)', + 'text-translate': [-4, 0], + }, + }, + { + id: 'noc_fiber', + type: 'line', + source: 'site_plan', + 'source-layer': 'noc_fibre_linestring', + paint: { + 'line-opacity': 1, + 'line-color': 'rgba(147, 84, 150, 1)', + 'line-width': 2, + }, + }, + { + id: 'noc_fiber_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'noc_fibre_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': 'Fiber ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(147, 84, 150, 1)', + }, + }, + { + id: 'noc_copper', + type: 'line', + source: 'site_plan', + 'source-layer': 'noc_copper_linestring', + minzoom: 0, + paint: { + 'line-opacity': 1, + 'line-color': 'rgba(174, 127, 176, 1)', + 'line-width': 2, + }, + }, + { + id: 'noc_copper_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'noc_copper_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': 'Cat5e ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(174, 127, 176, 1)', + }, + }, + { + id: 'noc_switch', + type: 'circle', + source: 'site_plan', + 'source-layer': 'noc_switch_point', + minzoom: 0, + maxzoom: 24, + layout: {}, + paint: { + 'circle-color': 'rgba(75, 0, 130, 1)', + 'circle-radius': 3, + }, + }, + { + id: 'noc_switch_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'noc_switch_point', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'point', + 'symbol-spacing': 1000, + 'symbol-avoid-edges': true, + 'text-field': '{switch}', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-anchor': 'right', + 'text-offset': [-1, 0], + 'text-justify': 'right', + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(75, 0, 130, 1)', + }, + }, + { + id: 'power_generator', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_generator_polygon', + layout: {}, + paint: { + 'line-color': 'magenta', + }, + }, + { + id: 'power_400_3', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_400_3_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(255, 68, 0, 1)', + 'line-width': 4, + }, + }, + { + id: 'power_125_3', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_125_3_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(199, 33, 33, 1)', + 'line-width': 3, + }, + }, + { + id: 'power_63_3', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_63_3_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(199, 33, 33, 1)', + 'line-width': 2, + }, + }, + { + id: 'power_32_3', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_32_3_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(199, 33, 33, 1)', + 'line-width': 1, + }, + }, + { + id: 'power_32_1', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_32_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(11, 11, 214, 1)', + 'line-width': 2, + }, + }, + { + id: 'power_16_1', + type: 'line', + source: 'site_plan', + 'source-layer': 'power_16_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(11, 11, 214, 1)', + 'line-width': 1, + }, + }, + { + id: 'power_400_3_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_400_3_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': '400A ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(199, 33, 33, 1)', + }, + }, + { + id: 'power_125_3_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_125_3_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': '125A ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(199, 33, 33, 1)', + }, + }, + { + id: 'power_63_3_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_63_3_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': '63A ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(199, 33, 33, 1)', + }, + }, + { + id: 'power_32_3_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_32_3_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': '32A ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(199, 33, 33, 1)', + }, + }, + { + id: 'power_32_1_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_32_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': '32A ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(11, 11, 214, 1)', + }, + }, + { + id: 'power_16_1_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_16_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'symbol-spacing': 1000, + 'text-field': '16A ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(11, 11, 214, 1)', + }, + }, + { + id: 'power_distro', + type: 'circle', + source: 'site_plan', + 'source-layer': 'power_distro_point', + layout: {}, + paint: { + 'circle-color': [ + 'match', + ['get', 'distro'], + 'TOB/32', + 'blue', + 'TOB/16', + 'blue', + 'CABIN', + 'blue', + 'ColdRoom', + 'blue', + 'SOB', + 'blue', + 'SSB 1', + 'blue', + 'SSB 2', + 'blue', + 'MD1 32 1', + 'blue', + 'rgba(199, 33, 33, 1)', + ], + 'circle-radius': 3, + }, + }, + { + id: 'power_distro_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'power_distro_point', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'point', + 'symbol-spacing': 1000, + 'symbol-avoid-edges': true, + 'text-field': '{name}\n({distro})', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-anchor': 'left', + 'text-offset': [1, 0], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': [ + 'match', + ['get', 'distro'], + 'TOB/32', + 'blue', + 'TOB/16', + 'blue', + 'CABIN', + 'blue', + 'ColdRoom', + 'blue', + 'SOB', + 'blue', + 'SSB 1', + 'blue', + 'SSB 2', + 'blue', + 'MD1 32 1', + 'blue', + 'rgba(199, 33, 33, 1)', + ], + }, + }, + { + id: 'lighting_festoon', + type: 'line', + source: 'site_plan', + 'source-layer': 'lighting_festoon_linestring', + layout: {}, + paint: { + 'line-color': 'rgba(200, 184, 42, 1)', + 'line-width': 2, + }, + }, + { + id: 'lighting_festoon_labels', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'lighting_festoon_linestring', + minzoom: 19, + maxzoom: 24, + layout: { + 'symbol-placement': 'line', + 'text-field': 'Festoon ({length}m)', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-allow-overlap': false, + 'text-offset': [0, -1], + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 0.8)', + 'text-halo-width': 3, + 'text-color': 'rgba(200, 184, 42, 1)', + }, + }, + { + id: 'villages_symbol', + type: 'circle', + source: 'villages', + 'source-layer': '', + minzoom: 16, + paint: { + 'circle-color': 'rgb(246, 163, 24)', + 'circle-radius': ['interpolate', ['linear'], ['zoom'], 16, 6, 24, 26], + 'circle-blur': 0.5, + 'circle-stroke-width': 0.5, + }, + }, + { + id: 'villages_text', + type: 'symbol', + source: 'villages', + 'source-layer': '', + minzoom: 17, + maxzoom: 24, + layout: { + 'text-field': '{name}', + 'text-font': ['Open Sans Regular'], + 'text-offset': [0, -1.8], + 'text-size': ['interpolate', ['linear'], ['zoom'], 17, 11, 24, 16], + }, + paint: { + 'text-halo-color': 'rgba(244, 235, 247, 0.73)', + 'text-halo-width': 2, + 'text-halo-blur': 1, + }, + }, + { + id: 'labels_camping', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'camping_centroid', + minzoom: 16, + maxzoom: 24, + layout: { + 'text-field': 'Camping: {camping}', + 'text-font': ['Open Sans Regular'], + 'text-justify': 'center', + 'text-size': ['interpolate', ['linear'], ['zoom'], 16, 10, 24, 24], + 'text-padding': 2, + 'symbol-placement': 'point', + 'symbol-spacing': 1000, + 'symbol-avoid-edges': true, + 'text-max-width': 8, + }, + paint: { + 'text-halo-width': 3, + 'text-halo-blur': 4, + 'text-halo-color': 'rgba(241, 241, 241, 1)', + }, + }, + { + id: 'labels_gate', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'labels_gate_labels_point', + minzoom: 16, + maxzoom: 24, + layout: { + 'text-field': '{text}', + 'text-size': 12, + 'text-optional': false, + 'text-font': ['Open Sans Regular'], + 'text-keep-upright': true, + 'text-ignore-placement': false, + 'text-allow-overlap': false, + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 1)', + 'text-halo-width': 3, + 'text-halo-blur': 4, + 'text-color': 'rgba(0, 0, 0, 1)', + }, + }, + { + id: 'labels_streets', + type: 'symbol', + source: 'site_plan', + 'source-layer': 'streets_linestring', + minzoom: 16, + layout: { + 'text-field': '{name}', + 'text-font': ['Raleway SemiBold'], + 'text-size': ['interpolate', ['linear'], ['zoom'], 16, 8, 17, 9, 23, 50], + 'text-max-angle': 10, + 'symbol-placement': 'line', + 'symbol-spacing': 500, + }, + paint: { + 'text-halo-color': 'rgba(120, 120, 120, 1)', + 'text-halo-width': 15, + 'text-halo-blur': 40, + 'text-color': 'rgba(250, 250, 250, 1)', + }, + }, + { + id: 'labels_main_3', + type: 'symbol', + filter: ['!', ['has', 'priority']], + source: 'site_plan', + 'source-layer': 'labels_point', + minzoom: 17.5, + layout: { + 'text-field': '{text}', + 'text-font': ['Raleway SemiBold'], + 'text-size': 13, + 'text-optional': false, + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 1)', + 'text-halo-width': 3, + 'text-halo-blur': 1, + 'text-color': 'rgba(0, 0, 0, 1)', + }, + }, + { + id: 'labels_main_2', + type: 'symbol', + filter: ['==', ['get', 'priority'], '2'], + source: 'site_plan', + 'source-layer': 'labels_point', + minzoom: 16, + layout: { + 'text-field': '{text}', + 'text-font': ['Raleway SemiBold'], + 'text-size': ['interpolate', ['linear'], ['zoom'], 16, 6, 23, 30], + 'text-optional': false, + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 1)', + 'text-halo-width': 3, + 'text-halo-blur': 1, + 'text-color': 'rgba(0, 0, 0, 1)', + }, + }, + { + id: 'labels_main_1', + type: 'symbol', + filter: ['==', ['get', 'priority'], '1'], + source: 'site_plan', + 'source-layer': 'labels_point', + minzoom: 15, + layout: { + 'text-field': '{text}', + 'text-font': ['Raleway SemiBold'], + 'text-size': ['interpolate', ['linear'], ['zoom'], 15, 10, 23, 40], + 'text-optional': false, + }, + paint: { + 'text-halo-color': 'rgba(241, 241, 241, 1)', + 'text-halo-width': 3, + 'text-halo-blur': 1, + 'text-color': 'rgba(0, 0, 0, 1)', + }, + }, +] + +const style: StyleSpecification = { + version: 8, + name: 'EMF', + center: [-2.3784, 52.0411], + zoom: 16, + bearing: 0, + pitch: 0, + sources: { + openmaptiles: { + type: 'vector', + url: 'https://api.maptiler.com/tiles/v3/tiles.json?key=iiaOS0kq1MPr2LlHPTSa', + }, + site_plan: { + type: 'vector', + url: 'https://map.emfcamp.org/capabilities/buildmap', + }, + villages: { + type: 'geojson', + data: 'https://www.emfcamp.org/api/villages.geojson', + }, + slope: { + type: 'raster', + tiles: ['https://map.emfcamp.org/data/slope/{z}/{x}/{y}'], + attribution: 'Elevation data © Environment Agency 2022. All rights reserved.', + }, + hillshade: { + type: 'raster', + tiles: ['https://map.emfcamp.org/data/hillshade/{z}/{x}/{y}'], + attribution: 'Elevation data © Environment Agency 2022. All rights reserved.', + }, + ortho: { + type: 'raster', + tiles: ['https://map.emfcamp.org/data/ortho/{z}/{x}/{y}'], + }, + }, + sprite: 'https://openmaptiles.github.io/positron-gl-style/sprite', + glyphs: 'https://map.emfcamp.org/fonts/{fontstack}/{range}.pbf', + layers: sortBy(layers, [(item) => item.zindex || 0]).map((item) => { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { zindex: _, ...new_item } = item + return new_item + }), +} + +export default style diff --git a/web/src/style/types.ts b/web/src/style/types.ts new file mode 100644 index 0000000..01df662 --- /dev/null +++ b/web/src/style/types.ts @@ -0,0 +1,5 @@ +import { LayerSpecification } from 'maplibre-gl' + +export type LayerSpecificationWithZIndex = LayerSpecification & { + zindex?: number +} diff --git a/web/vite.config.ts b/web/vite.config.ts index db7fb82..0770e88 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,5 +1,6 @@ import { defineConfig } from 'vite' import { VitePWA } from 'vite-plugin-pwa' +import { renderSVG } from 'vite-plugin-render-svg' export default defineConfig({ base: './', @@ -56,5 +57,10 @@ export default defineConfig({ theme_color: '#FB48C4', }, }), + renderSVG({ + pattern: 'src/icons/*.svg', + urlPrefix: 'icons/', + outputOriginal: true, + }), ], })