diff --git a/package.json b/package.json index f7a7327..7787e7d 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,9 @@ "private": true, "type": "module", "packageManager": "pnpm@11.8.0", + "engines": { + "node": ">=24.22.1 <25" + }, "scripts": { "dev": "vite", "export:answer-ui-contract": "node scripts/export-answer-ui-contract.mjs", @@ -48,7 +51,7 @@ "katex": "^0.17.0", "keycloak-js": "26.2.4", "lucide-react": "^0.468.0", - "maplibre-gl": "^4.7.1", + "maplibre-gl": "^6.4.1", "motion": "^12.40.0", "nanoid": "^5.1.14", "pmtiles": "4.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c3d588..15faa58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,8 +100,8 @@ importers: specifier: ^0.468.0 version: 0.468.0(react@19.2.7) maplibre-gl: - specifier: ^4.7.1 - version: 4.7.1 + specifier: ^6.4.1 + version: 6.15.0 motion: specifier: ^12.40.0 version: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -763,34 +763,35 @@ packages: peerDependencies: react: ^19.2.3 - '@mapbox/geojson-rewind@0.5.2': - resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} - hasBin: true - '@mapbox/jsonlint-lines-primitives@2.0.3': resolution: {integrity: sha512-0SElaV0uMxEnxzBhhX9WTuPyUeMsAN/SS0i16tjuba4/mio63MG9khjC1a0JAiPGXAwvwm4UfHJURCN7nyudQg==} engines: {node: '>= 22'} - '@mapbox/point-geometry@0.1.0': - resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + '@mapbox/point-geometry@1.1.0': + resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} - '@mapbox/tiny-sdf@2.2.0': - resolution: {integrity: sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==} + '@mapbox/tiny-sdf@2.3.0': + resolution: {integrity: sha512-gBvcNDBBB66bgQYvnaJ6Jk+VCaMmVq5+IZR2kWPisT88Z8s0kBQt6hfVi8QgRW8Vpg0UWZzBA4ZSyzHHC+VeRA==} - '@mapbox/unitbezier@0.0.1': - resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + '@mapbox/unitbezier@1.0.0': + resolution: {integrity: sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ==} - '@mapbox/vector-tile@1.3.1': - resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + '@mapbox/vector-tile@3.0.0': + resolution: {integrity: sha512-Qf10S1uIHMk20ri/IVBnpS+esUEkVaR5Hftmz88jTInrpmWgPGJfPe3LVjjlE77trLx8tH6qjTG7uWH9hIq/0Q==} - '@mapbox/whoots-js@3.1.0': - resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} - engines: {node: '>=6.0.0'} + '@maplibre/geojson-vt@6.3.0': + resolution: {integrity: sha512-3Zw2jsU9pIJG3G2CQFbLjWj2MlAHodhD7cSY+15iywUuLmmkgzcKRnueVRZ4AcC/5wOtfhidcJAAzBpoBNs3Xg==} - '@maplibre/maplibre-gl-style-spec@20.4.0': - resolution: {integrity: sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==} + '@maplibre/maplibre-gl-style-spec@26.4.4': + resolution: {integrity: sha512-hG4RZR4PBd/+6A3ODdZ3AnQRF106ZQk1y3bhwDg8bH/A4Oz2tnRUJVVWs9BZa6gXZ1d3UKe89C+Mm+olGBELvA==} hasBin: true + '@maplibre/mlt@1.3.0': + resolution: {integrity: sha512-7M2O7ABM80Oi8XPkfkrjKB8mOBIxGoVgkA52Mu4RMWoBvvMdagQ522+WxVYujZsMpqIr3BpzrTbXrm4k8lCzCQ==} + + '@maplibre/vt-pbf@4.3.2': + resolution: {integrity: sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw==} + '@mermaid-js/parser@1.2.0': resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} @@ -1751,9 +1752,6 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/geojson-vt@3.2.5': - resolution: {integrity: sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==} - '@types/geojson@7946.0.16': resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} @@ -1766,12 +1764,6 @@ packages: '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - '@types/mapbox__point-geometry@0.1.4': - resolution: {integrity: sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==} - - '@types/mapbox__vector-tile@1.3.4': - resolution: {integrity: sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1781,9 +1773,6 @@ packages: '@types/node@24.13.3': resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==} - '@types/pbf@3.0.5': - resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==} - '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -1798,9 +1787,6 @@ packages: '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/supercluster@7.1.3': - resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -2045,6 +2031,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + bidi-js@1.1.0: + resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} + brace-expansion@1.1.16: resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} @@ -2379,8 +2368,8 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - earcut@3.2.3: - resolution: {integrity: sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==} + earcut@3.2.4: + resolution: {integrity: sha512-FHc6yNpnTORB0tM5kmZ03iD2mDuNakDE2lvf4Hw1XkfxtEHIGVi01B/GqUSwx+NcC1WGjidAfpTXzeALtPtfpg==} echarts-for-react@3.0.6: resolution: {integrity: sha512-4zqLgTGWS3JvkQDXjzkR1k1CHRdpd6by0988TWMJgnvDytegWLbeP/VNZmMa+0VJx2eD7Y632bi2JquXDgiGJg==} @@ -2611,9 +2600,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - geojson-vt@4.0.3: - resolution: {integrity: sha512-jR1MwkLaZGa8Zftct9ZFruyWFrdl9ZyD2OliXNy9Qq5bBPeg5wHVpBQF9p5GjnicSDQqvBVpysxTPKmWdsfWMA==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2634,10 +2620,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - gl-matrix@3.4.4: resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} @@ -2645,10 +2627,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - global-prefix@4.0.0: - resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==} - engines: {node: '>=16'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2754,9 +2732,6 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2776,10 +2751,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -2827,10 +2798,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -2901,10 +2868,6 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} @@ -3020,8 +2983,8 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - maplibre-gl@4.7.1: - resolution: {integrity: sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==} + maplibre-gl@6.15.0: + resolution: {integrity: sha512-kxFetbvUHDOVaAP1CYb226Mdk2QhzIPddqM0xJTFD35wu78Mpd6NM7+H68ALjc6Oa0kAOX5EAdMKyvD2u3qfcg==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} markdown-table@3.0.4: @@ -3359,8 +3322,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pbf@3.3.0: - resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} + pbf@5.1.2: + resolution: {integrity: sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==} hasBin: true picocolors@1.1.1: @@ -3423,9 +3386,6 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quickselect@2.0.0: - resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==} - quickselect@3.0.0: resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} @@ -3538,6 +3498,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3673,9 +3637,6 @@ packages: stylis@4.4.0: resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} - supercluster@8.0.1: - resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3949,9 +3910,6 @@ packages: jsdom: optional: true - vt-pbf@3.1.3: - resolution: {integrity: sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==} - w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -3981,11 +3939,6 @@ packages: engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -4591,35 +4544,43 @@ snapshots: transitivePeerDependencies: - zod - '@mapbox/geojson-rewind@0.5.2': - dependencies: - get-stream: 6.0.1 - minimist: 1.2.8 - '@mapbox/jsonlint-lines-primitives@2.0.3': {} - '@mapbox/point-geometry@0.1.0': {} + '@mapbox/point-geometry@1.1.0': {} - '@mapbox/tiny-sdf@2.2.0': {} + '@mapbox/tiny-sdf@2.3.0': {} - '@mapbox/unitbezier@0.0.1': {} + '@mapbox/unitbezier@1.0.0': {} - '@mapbox/vector-tile@1.3.1': + '@mapbox/vector-tile@3.0.0': dependencies: - '@mapbox/point-geometry': 0.1.0 + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 5.1.2 - '@mapbox/whoots-js@3.1.0': {} + '@maplibre/geojson-vt@6.3.0': + dependencies: + kdbush: 4.1.0 - '@maplibre/maplibre-gl-style-spec@20.4.0': + '@maplibre/maplibre-gl-style-spec@26.4.4': dependencies: '@mapbox/jsonlint-lines-primitives': 2.0.3 - '@mapbox/unitbezier': 0.0.1 + '@mapbox/unitbezier': 1.0.0 json-stringify-pretty-compact: 4.0.0 minimist: 1.2.8 - quickselect: 2.0.0 - rw: 1.3.3 + quickselect: 3.0.0 tinyqueue: 3.0.0 + '@maplibre/mlt@1.3.0': + dependencies: + '@mapbox/point-geometry': 1.1.0 + + '@maplibre/vt-pbf@4.3.2': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 5.1.2 + '@mermaid-js/parser@1.2.0': dependencies: '@chevrotain/types': 11.1.2 @@ -5536,10 +5497,6 @@ snapshots: '@types/estree@1.0.9': {} - '@types/geojson-vt@3.2.5': - dependencies: - '@types/geojson': 7946.0.16 - '@types/geojson@7946.0.16': {} '@types/hast@3.0.5': @@ -5550,14 +5507,6 @@ snapshots: '@types/katex@0.16.8': {} - '@types/mapbox__point-geometry@0.1.4': {} - - '@types/mapbox__vector-tile@1.3.4': - dependencies: - '@types/geojson': 7946.0.16 - '@types/mapbox__point-geometry': 0.1.4 - '@types/pbf': 3.0.5 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -5568,8 +5517,6 @@ snapshots: dependencies: undici-types: 7.18.2 - '@types/pbf@3.0.5': {} - '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: '@types/react': 19.2.17 @@ -5584,10 +5531,6 @@ snapshots: '@types/statuses@2.0.6': {} - '@types/supercluster@7.1.3': - dependencies: - '@types/geojson': 7946.0.16 - '@types/trusted-types@2.0.7': optional: true @@ -5768,6 +5711,10 @@ snapshots: baseline-browser-mapping@2.10.43: {} + bidi-js@1.1.0: + dependencies: + require-from-string: 2.0.2 + brace-expansion@1.1.16: dependencies: balanced-match: 1.0.2 @@ -6113,7 +6060,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - earcut@3.2.3: {} + earcut@3.2.4: {} echarts-for-react@3.0.6(echarts@6.1.0)(react@19.2.7): dependencies: @@ -6365,8 +6312,6 @@ snapshots: gensync@1.0.0-beta.2: {} - geojson-vt@4.0.3: {} - get-caller-file@2.0.5: {} get-east-asian-width@1.6.0: {} @@ -6391,20 +6336,12 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 - get-stream@6.0.1: {} - gl-matrix@3.4.4: {} glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - global-prefix@4.0.0: - dependencies: - ini: 4.1.3 - kind-of: 6.0.3 - which: 4.0.0 - globals@14.0.0: {} globals@15.15.0: {} @@ -6586,8 +6523,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} - ignore@5.3.2: {} import-fresh@3.3.1: @@ -6601,8 +6536,6 @@ snapshots: indent-string@4.0.0: {} - ini@4.1.3: {} - inline-style-parser@0.2.7: {} internmap@1.0.1: {} @@ -6636,8 +6569,6 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.5: {} - isomorphic-ws@5.0.0(ws@8.21.1): dependencies: ws: 8.21.1 @@ -6710,8 +6641,6 @@ snapshots: khroma@2.1.0: {} - kind-of@6.0.3: {} - layout-base@1.0.2: {} layout-base@2.0.1: {} @@ -6796,34 +6725,26 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - maplibre-gl@4.7.1: + maplibre-gl@6.15.0: dependencies: - '@mapbox/geojson-rewind': 0.5.2 - '@mapbox/jsonlint-lines-primitives': 2.0.3 - '@mapbox/point-geometry': 0.1.0 - '@mapbox/tiny-sdf': 2.2.0 - '@mapbox/unitbezier': 0.0.1 - '@mapbox/vector-tile': 1.3.1 - '@mapbox/whoots-js': 3.1.0 - '@maplibre/maplibre-gl-style-spec': 20.4.0 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/tiny-sdf': 2.3.0 + '@mapbox/unitbezier': 1.0.0 + '@mapbox/vector-tile': 3.0.0 + '@maplibre/geojson-vt': 6.3.0 + '@maplibre/maplibre-gl-style-spec': 26.4.4 + '@maplibre/mlt': 1.3.0 + '@maplibre/vt-pbf': 4.3.2 '@types/geojson': 7946.0.16 - '@types/geojson-vt': 3.2.5 - '@types/mapbox__point-geometry': 0.1.4 - '@types/mapbox__vector-tile': 1.3.4 - '@types/pbf': 3.0.5 - '@types/supercluster': 7.1.3 - earcut: 3.2.3 - geojson-vt: 4.0.3 + bidi-js: 1.1.0 + earcut: 3.2.4 gl-matrix: 3.4.4 - global-prefix: 4.0.0 kdbush: 4.1.0 murmurhash-js: 1.0.0 - pbf: 3.3.0 + pbf: 5.1.2 potpack: 2.1.0 quickselect: 3.0.0 - supercluster: 8.0.1 tinyqueue: 3.0.0 - vt-pbf: 3.1.3 markdown-table@3.0.4: {} @@ -7405,9 +7326,8 @@ snapshots: pathe@2.0.3: {} - pbf@3.3.0: + pbf@5.1.2: dependencies: - ieee754: 1.2.1 resolve-protobuf-schema: 2.1.0 picocolors@1.1.1: {} @@ -7459,8 +7379,6 @@ snapshots: punycode@2.3.1: {} - quickselect@2.0.0: {} - quickselect@3.0.0: {} react-dom@19.2.7(react@19.2.7): @@ -7609,6 +7527,8 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} resolve-protobuf-schema@2.1.0: @@ -7782,10 +7702,6 @@ snapshots: stylis@4.4.0: {} - supercluster@8.0.1: - dependencies: - kdbush: 4.1.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8029,12 +7945,6 @@ snapshots: transitivePeerDependencies: - msw - vt-pbf@3.1.3: - dependencies: - '@mapbox/point-geometry': 0.1.0 - '@mapbox/vector-tile': 1.3.1 - pbf: 3.3.0 - w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -8058,10 +7968,6 @@ snapshots: dependencies: isexe: 2.0.0 - which@4.0.0: - dependencies: - isexe: 3.1.5 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 diff --git a/src/features/workbench/hooks/use-workbench-map.ts b/src/features/workbench/hooks/use-workbench-map.ts index c29554c..4a5e4d3 100644 --- a/src/features/workbench/hooks/use-workbench-map.ts +++ b/src/features/workbench/hooks/use-workbench-map.ts @@ -1,11 +1,12 @@ import "maplibre-gl/dist/maplibre-gl.css"; import type { FeatureCollection, Geometry, Point } from "geojson"; -import maplibregl, { - type GeoJSONSource, - type Map as MapLibreMap, - type MapSourceDataEvent, - type StyleSpecification +import * as maplibregl from "maplibre-gl"; +import type { + GeoJSONSource, + Map as MapLibreMap, + MapSourceDataEvent, + StyleSpecification } from "maplibre-gl"; import { useCallback, useEffect, useRef, useState, type RefObject } from "react"; import type { AccessTokenProvider } from "@/shared/auth/keycloak-auth"; @@ -271,9 +272,13 @@ export function useWorkbenchMap({ style: createBaseStyle(mapboxToken, tiandituToken), pitch: 0, bearing: 0, + dragRotate: false, + touchPitch: false, maxZoom: MAP_MAX_ZOOM, - antialias: true, - preserveDrawingBuffer: true, + canvasContextAttributes: { + antialias: true, + preserveDrawingBuffer: true + }, trackResize: false, attributionControl: false }); diff --git a/src/features/workbench/map/camera.ts b/src/features/workbench/map/camera.ts index 4967a91..5497d7d 100644 --- a/src/features/workbench/map/camera.ts +++ b/src/features/workbench/map/camera.ts @@ -4,6 +4,7 @@ import { WATER_NETWORK_GLOBAL_VIEW } from "./sources"; type LngLatBounds = [[number, number], [number, number]]; type WebMercatorBbox = readonly [number, number, number, number]; +type CompletePaddingOptions = Required; export type NetworkViewParams = { bbox3857: WebMercatorBbox; @@ -11,19 +12,19 @@ export type NetworkViewParams = { const WEB_MERCATOR_RADIUS = 6378137; const GLOBAL_VIEW_MAX_ZOOM = 13; -const GLOBAL_VIEW_PADDING: PaddingOptions = { top: 96, right: 48, bottom: 48, left: 48 }; +const GLOBAL_VIEW_PADDING: CompletePaddingOptions = { top: 96, right: 48, bottom: 48, left: 48 }; export function getWorkbenchPadding( leftPanelOpen: boolean, rightPanelOpen: boolean, conditionPanelExpanded = false, agentPanelWidth?: number -): PaddingOptions { - return getWorkbenchCameraPadding(1280, { +): CompletePaddingOptions { + return completePadding(getWorkbenchCameraPadding(1280, { agentOpen: leftPanelOpen, agentWidth: agentPanelWidth, conditionOpen: rightPanelOpen, conditionExpanded: conditionPanelExpanded - }); + })); } export function getResponsiveWorkbenchPadding( @@ -32,7 +33,7 @@ export function getResponsiveWorkbenchPadding( rightPanelOpen: boolean, conditionPanelExpanded = false, agentPanelWidth?: number -): PaddingOptions { +): CompletePaddingOptions { const width = getMapViewportSize(map).width; return getResponsivePadding( map, @@ -59,10 +60,14 @@ export function fitNetworkBounds( }); } -export function getResponsivePadding(map: MapLibreMap, padding: PaddingOptions): PaddingOptions { +export function getResponsivePadding( + map: MapLibreMap, + padding: PaddingOptions +): CompletePaddingOptions { + const complete = completePadding(padding); const { width, height } = getMapViewportSize(map); - const horizontalPadding = padding.left + padding.right; - const verticalPadding = padding.top + padding.bottom; + const horizontalPadding = complete.left + complete.right; + const verticalPadding = complete.top + complete.bottom; const maxHorizontalPadding = width * 0.58; const maxVerticalPadding = height * 0.58; const horizontalScale = horizontalPadding > 0 ? maxHorizontalPadding / horizontalPadding : 1; @@ -70,14 +75,23 @@ export function getResponsivePadding(map: MapLibreMap, padding: PaddingOptions): const scale = Math.min(1, horizontalScale, verticalScale); if (scale >= 1) { - return padding; + return complete; } return { - top: Math.round(padding.top * scale), - right: Math.round(padding.right * scale), - bottom: Math.round(padding.bottom * scale), - left: Math.round(padding.left * scale) + top: Math.round(complete.top * scale), + right: Math.round(complete.right * scale), + bottom: Math.round(complete.bottom * scale), + left: Math.round(complete.left * scale) + }; +} + +function completePadding(padding: PaddingOptions): CompletePaddingOptions { + return { + top: padding.top ?? 0, + right: padding.right ?? 0, + bottom: padding.bottom ?? 0, + left: padding.left ?? 0 }; } diff --git a/src/features/workbench/map/city-scene-control.ts b/src/features/workbench/map/city-scene-control.ts index eaa602a..49bac1a 100644 --- a/src/features/workbench/map/city-scene-control.ts +++ b/src/features/workbench/map/city-scene-control.ts @@ -1,4 +1,5 @@ -import maplibregl, { type Map as MapLibreMap } from "maplibre-gl"; +import * as maplibregl from "maplibre-gl"; +import type { Map as MapLibreMap } from "maplibre-gl"; import { CITY_LAYERS, CITY_LIGHT, diff --git a/src/features/workbench/map/export-view.ts b/src/features/workbench/map/export-view.ts index 05372e7..bf51d60 100644 --- a/src/features/workbench/map/export-view.ts +++ b/src/features/workbench/map/export-view.ts @@ -1,4 +1,5 @@ -import maplibregl, { type Map as MapLibreMap, type StyleSpecification } from "maplibre-gl"; +import * as maplibregl from "maplibre-gl"; +import type { Map as MapLibreMap, StyleSpecification } from "maplibre-gl"; import type { MapFeatureInteractionState } from "../hooks/use-map-interactions"; const MAX_EXPORT_DIMENSION = 4096; @@ -38,8 +39,10 @@ export async function exportMapViewImage(map: MapLibreMap, { scale, targetLongEd zoom: map.getZoom(), pitch: map.getPitch(), bearing: map.getBearing(), - antialias: true, - preserveDrawingBuffer: true, + canvasContextAttributes: { + antialias: true, + preserveDrawingBuffer: true + }, interactive: false, attributionControl: false, fadeDuration: 0 diff --git a/src/features/workbench/map/layer-group-style.ts b/src/features/workbench/map/layer-group-style.ts index df48f0f..2c28b03 100644 --- a/src/features/workbench/map/layer-group-style.ts +++ b/src/features/workbench/map/layer-group-style.ts @@ -1,4 +1,7 @@ import type { Map as MapLibreMap } from "maplibre-gl"; + +type PaintPropertyName = Parameters[1]; +type LayoutPropertyName = Parameters[1]; import { MAP_STYLE_TOKENS } from "./map-colors"; import { SUPPLY_LAYER_VISUALS } from "./map-layer-visuals"; import { @@ -182,11 +185,11 @@ function scale(value: unknown, multiplier: number): unknown { return ["*", value, multiplier]; } -function setPaint(map: MapLibreMap, layerId: string, property: string, value: unknown) { +function setPaint(map: MapLibreMap, layerId: string, property: PaintPropertyName, value: unknown) { if (map.getLayer(layerId)) map.setPaintProperty(layerId, property, (value ?? null) as never); } -function setLayout(map: MapLibreMap, layerId: string, property: string, value: unknown) { +function setLayout(map: MapLibreMap, layerId: string, property: LayoutPropertyName, value: unknown) { if (map.getLayer(layerId) && typeof map.setLayoutProperty === "function") { map.setLayoutProperty(layerId, property, (value ?? null) as never); } diff --git a/src/main.tsx b/src/main.tsx index 9ac7f0d..56e8aba 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,5 +1,7 @@ import React from "react"; import ReactDOM from "react-dom/client"; +import { setWorkerUrl } from "maplibre-gl"; +import maplibreWorkerUrl from "maplibre-gl/dist/maplibre-gl-worker.mjs?worker&url"; import { AuthStartupScreen } from "@/app/auth-startup-screen"; import { initializeAuthentication } from "@/shared/auth/keycloak-auth"; @@ -8,6 +10,8 @@ import "maplibre-gl/dist/maplibre-gl.css"; import "katex/dist/katex.min.css"; import "streamdown/styles.css"; +setWorkerUrl(maplibreWorkerUrl); + const root = ReactDOM.createRoot(document.getElementById("root")!); root.render();