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 0000000..3ce98a1 Binary files /dev/null and b/web/public/fonts/Raleway SemiBold/0-255.pbf differ 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, + }), ], })