diff --git a/cspell.config.yaml b/cspell.config.yaml index b29b2940..663bc9ac 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -1,6 +1,7 @@ version: "0.2" useGitignore: true -ignorePaths: [] +ignorePaths: + - pnpm-lock.yaml allowCompoundWords: true features: weighted-suggestions: true diff --git a/index.html b/index.html index 2cc4da3b..7e8917fd 100644 --- a/index.html +++ b/index.html @@ -47,13 +47,27 @@ - Decrease + IncreaseDecrease + Milepost - Back + AheadBack + + +
=6.9.0'} - '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} '@babel/core@7.26.0': resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.25.9': @@ -179,8 +179,8 @@ packages: resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.2': - resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true @@ -188,12 +188,12 @@ packages: resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -410,8 +410,8 @@ packages: '@cspell/dict-node@5.0.5': resolution: {integrity: sha512-7NbCS2E8ZZRZwlLrh2sA0vAk9n1kcTUiRp/Nia8YvKaItGXLfxYqD2rMQ3HpB1kEutal6hQLVic3N2Yi1X7AaA==} - '@cspell/dict-npm@5.1.14': - resolution: {integrity: sha512-7VV/rrRlxOwy5j0bpw6/Uci+nx/rwSgx45FJdeKq++nHsBx/nEXMFNODknm4Mi6i7t7uOVHExpifrR6w6xTWww==} + '@cspell/dict-npm@5.1.15': + resolution: {integrity: sha512-95D3A8rs9SYlUQUkK48J0F1W3jOsc63dY/vlzuNHE4nuGU2OM4jtoWvLk0ovhBMHwZikaNNTHaHoJyr+VKu+Yg==} '@cspell/dict-php@4.0.13': resolution: {integrity: sha512-P6sREMZkhElzz/HhXAjahnICYIqB/HSGp1EhZh+Y6IhvC15AzgtDP8B8VYCIsQof6rPF1SQrFwunxOv8H1e2eg==} @@ -422,8 +422,8 @@ packages: '@cspell/dict-public-licenses@2.0.11': resolution: {integrity: sha512-rR5KjRUSnVKdfs5G+gJ4oIvQvm8+NJ6cHWY2N+GE69/FSGWDOPHxulCzeGnQU/c6WWZMSimG9o49i9r//lUQyA==} - '@cspell/dict-python@4.2.12': - resolution: {integrity: sha512-U25eOFu+RE0aEcF2AsxZmq3Lic7y9zspJ9SzjrC0mfJz+yr3YmSCw4E0blMD3mZoNcf7H/vMshuKIY5AY36U+Q==} + '@cspell/dict-python@4.2.13': + resolution: {integrity: sha512-mZIcmo9qif8LkJ6N/lqTZawcOk2kVTcuWIUOSbMcjyomO0XZ7iWz15TfONyr03Ea/l7o5ULV+MZ4vx76bAUb7w==} '@cspell/dict-r@2.0.4': resolution: {integrity: sha512-cBpRsE/U0d9BRhiNRMLMH1PpWgw+N+1A2jumgt1if9nBGmQw4MUpg2u9I0xlFVhstTIdzXiLXMxP45cABuiUeQ==} @@ -437,8 +437,8 @@ packages: '@cspell/dict-scala@5.0.6': resolution: {integrity: sha512-tl0YWAfjUVb4LyyE4JIMVE8DlLzb1ecHRmIWc4eT6nkyDqQgHKzdHsnusxFEFMVLIQomgSg0Zz6hJ5S1E4W4ww==} - '@cspell/dict-software-terms@4.1.17': - resolution: {integrity: sha512-QORIk1R5DV8oOQ+oAlUWE7UomaJwUucqu2srrc2+PmkoI6R1fJwwg2uHCPBWlIb4PGDNEdXLv9BAD13H+0wytQ==} + '@cspell/dict-software-terms@4.1.18': + resolution: {integrity: sha512-QhOQ3qVFr2Y+uDw2SH15klVNU2S07ecFhG+2gpTO/K4Kuaui3INbVrzHOKW41ofP3ghv9y2TkUUtOP5KfddP8A==} '@cspell/dict-sql@2.1.8': resolution: {integrity: sha512-dJRE4JV1qmXTbbGm6WIcg1knmR6K5RXnQxF4XHs5HA3LAjc/zf77F95i5LC+guOGppVF6Hdl66S2UyxT+SAF3A==} @@ -900,8 +900,8 @@ packages: cpu: [x64] os: [win32] - '@esri/arcgis-html-sanitizer@4.1.0-next.4': - resolution: {integrity: sha512-CFDBFVgCLLaY6qBS70oozzIPXkTTCVkG/KFkjAZHIPYMgxgFtYPMBETRutELQQWDJa0Tv1QNK1N/7NyaKfsPvQ==} + '@esri/arcgis-html-sanitizer@4.1.0': + resolution: {integrity: sha512-einEveDJ/k1180NOp78PB/4Hje9eBy3dyOGLLtLn6bSkizpUfCwuYBIXOA7Y3F/k/BsTQXgKqUVwQ0eiscWMdA==} engines: {node: '>=18.0.0'} '@esri/calcite-colors@6.1.0': @@ -932,14 +932,14 @@ packages: '@fontsource/overpass@5.1.1': resolution: {integrity: sha512-Zanaf61C+fKw+T6rnxacltqLmOo0MkiYTJIkAcOIPhsiD0zAubBvyyHUshmGIf/5C15MZjxK+JDeAd/dB3Zn5g==} - '@inquirer/confirm@5.0.2': - resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} + '@inquirer/confirm@5.1.0': + resolution: {integrity: sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' - '@inquirer/core@10.1.0': - resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==} + '@inquirer/core@10.1.1': + resolution: {integrity: sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA==} engines: {node: '>=18'} '@inquirer/figures@1.0.8': @@ -1010,93 +1010,98 @@ packages: '@polymer/polymer@3.5.2': resolution: {integrity: sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==} - '@rollup/rollup-android-arm-eabi@4.28.0': - resolution: {integrity: sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ==} + '@rollup/rollup-android-arm-eabi@4.28.1': + resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.0': - resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} + '@rollup/rollup-android-arm64@4.28.1': + resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.0': - resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} + '@rollup/rollup-darwin-arm64@4.28.1': + resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.0': - resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} + '@rollup/rollup-darwin-x64@4.28.1': + resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.0': - resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} + '@rollup/rollup-freebsd-arm64@4.28.1': + resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.0': - resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} + '@rollup/rollup-freebsd-x64@4.28.1': + resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.0': - resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.0': - resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} + '@rollup/rollup-linux-arm-musleabihf@4.28.1': + resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.0': - resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} + '@rollup/rollup-linux-arm64-gnu@4.28.1': + resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.0': - resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} + '@rollup/rollup-linux-arm64-musl@4.28.1': + resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': - resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.0': - resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} + '@rollup/rollup-linux-riscv64-gnu@4.28.1': + resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.0': - resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} + '@rollup/rollup-linux-s390x-gnu@4.28.1': + resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.0': - resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} + '@rollup/rollup-linux-x64-gnu@4.28.1': + resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.0': - resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} + '@rollup/rollup-linux-x64-musl@4.28.1': + resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.0': - resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} + '@rollup/rollup-win32-arm64-msvc@4.28.1': + resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.0': - resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} + '@rollup/rollup-win32-ia32-msvc@4.28.1': + resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.0': - resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} + '@rollup/rollup-win32-x64-msvc@4.28.1': + resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} cpu: [x64] os: [win32] @@ -1133,8 +1138,8 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/geojson@7946.0.14': - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} + '@types/geojson@7946.0.15': + resolution: {integrity: sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==} '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} @@ -1151,44 +1156,44 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@vaadin/a11y-base@24.5.4': - resolution: {integrity: sha512-P69sv2hewdUztVhzEhUBfcrl3r4fFCGlB+0o0W35Hp9HD5vPZNvSbvmJXlPoArx6jQ5Uo2oxb9zSekKVTG3jQw==} + '@vaadin/a11y-base@24.5.5': + resolution: {integrity: sha512-0+8jegJzRqwtvuu27nmWCCIHlmAPQea10CUu3jz/FkCewmHBsVUz0xi6BB/l2olk5WzvWkcZD+bpSypJrzQZ3Q==} - '@vaadin/checkbox@24.5.4': - resolution: {integrity: sha512-HkJ2QJohPFuc7Iq9wH41/mFSnTPxuywvEYefucHGIeSMHs7r0o47sAHq0mcllex5PmW73IsSBj9bR6yG8hUmng==} + '@vaadin/checkbox@24.5.5': + resolution: {integrity: sha512-Hzda5DmRqUOtP8A+nhmI6fERz3TvTZBd0en2suKPwvN7YHKNhsa7lDRi12liG+Rd/ux5U/H1fGYFfB3XKUjdFw==} - '@vaadin/component-base@24.5.4': - resolution: {integrity: sha512-oIF+OUzqAdibbj4pLlhPcDKHnJvux8ydEpCpkdzcMk0K52y7VSERwaWaKXGbWWJX7Xdu8Kt+J8/Q3vANi9+KeQ==} + '@vaadin/component-base@24.5.5': + resolution: {integrity: sha512-xuR5IzdYTF7kQiyjm1xtexSvJ3m9Uz3t92bany/tqZlCVOBhorMB8rc1fKo5Qw1PTuP85bnLf34YVNhXcSE8sA==} - '@vaadin/field-base@24.5.4': - resolution: {integrity: sha512-S049PyvO27NJumsymtgRDy8SmPmyiCkTtn7hjnDUjEBsW7EuCJNKMBnqcZeEMBLSgXLJXbez5F0glgLkELJLiQ==} + '@vaadin/field-base@24.5.5': + resolution: {integrity: sha512-AZybkO3yoy0A0UhidJZY00RbzpMno64Sjvm5GjTHTdudaBiHzVnrma4relOYQC3KA/kfc6roz8+efA+sgKIcrg==} - '@vaadin/grid@24.5.4': - resolution: {integrity: sha512-dt1bTci8RvUy1fLzcA/CyXbzeS1rX6lBbPvW6QyhOk7R4ME2LeGPRzYxYmfIQfIVB19EoS2fBgBlj1tWG7Qe1g==} + '@vaadin/grid@24.5.5': + resolution: {integrity: sha512-jxLfszR1wFxjXDL4zRF2ugsJedzetDt83536CYPKG68NEEXv5hNW9Ah8eCZk+CyYZA1GqwezXuKJMVU5O8HZ2g==} - '@vaadin/icon@24.5.4': - resolution: {integrity: sha512-p2wQeVWYOTlXZ66iwDQLkGMWcnHlJIZX6uVzDPnH1p8aEJS+y4sG7Fq5wYXECUq8n7GStxe6VlsCec7taiw8yQ==} + '@vaadin/icon@24.5.5': + resolution: {integrity: sha512-i3Tq1mVpWB+r3cQ2rIyDXdum5c80VP2PTAyS7vB6yD7Qraa0hwGmbfbiyvKbZdTIlDzUWBVQDFcL03UeS2Matw==} - '@vaadin/input-container@24.5.4': - resolution: {integrity: sha512-CEaZ0chod+LB7bgQZTjl/1myqsZnt5JqWVvHLzF+lI5KANH7dci5vjvj/K16tARtLpFsV+XKU+Kq3uVfOiTsJw==} + '@vaadin/input-container@24.5.5': + resolution: {integrity: sha512-4rI1IRTfp/s2+WEixP0zyIq50fdFgth4qnizGP9GW+ZL6fKTTnXwp1mA03IEuDZk0RIBkq1KlkC4sIYRKf8cTA==} - '@vaadin/lit-renderer@24.5.4': - resolution: {integrity: sha512-qfDA67McD25fzOw75a+b0P3ACf+jEi9l+5t/wxyDhXN66oQeq406pqxMdB0llkLjh/3+hLy8uu9XdpTFZEBGrQ==} + '@vaadin/lit-renderer@24.5.5': + resolution: {integrity: sha512-WCsy5Dbbgzsb5TQ4Wwwfty3m6hgLaSfEOd3sb3HjqKYMEA/Dx0aKrYNvvbBAKIIJr4zJn8KJlcoK6PefkI71Ww==} - '@vaadin/text-field@24.5.4': - resolution: {integrity: sha512-gLstfvwqhzguWecByub019sMa6m2T2uxms9PHQXnbHCRnSyZxvek9mXw6aUh0470A0ghh8F/QMRnBf8hvmCCIQ==} + '@vaadin/text-field@24.5.5': + resolution: {integrity: sha512-btmS5FlWifkUj8Wq01jQ1vCS8QQUB4dXL3T3buoS4wwZV6I6aCgSoqoBAFhYSUHTxNQUzlrA7+c/Ksn3gPhp6g==} '@vaadin/vaadin-development-mode-detector@2.0.7': resolution: {integrity: sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==} - '@vaadin/vaadin-lumo-styles@24.5.4': - resolution: {integrity: sha512-W0o4iUv+fZ68NYHJiw2tMRFT8Syd9dcWDLFkfLIgYYlFMzxig5TlJOqhBEmATdlpj9Ba2T/cEJdV4MmUUZi9SA==} + '@vaadin/vaadin-lumo-styles@24.5.5': + resolution: {integrity: sha512-Mn77pARcsxi/vvspa1OdM9Cnn3fxxU7yMXtV9hJ+3Dk0U4HMuQLSbWL+vaJQwcXPOKQOPW07ujr9eXzpzwmvIQ==} - '@vaadin/vaadin-material-styles@24.5.4': - resolution: {integrity: sha512-csIENxieRpDzRPTS62JkqhUfoQqUix72C1yQ38gbTUhnzSWQbYkkiHD9yTzwtB2snpyBsUzyUwhFRZqpNSF6mg==} + '@vaadin/vaadin-material-styles@24.5.5': + resolution: {integrity: sha512-7D/mS8zOAswYTp/R7Rzl4Yvkh48nopLj20Z0/QPYpNlZ+IrTm1z5vh7dtIMwuOmrugrzAXHfd1zpHAgGLz4bNQ==} - '@vaadin/vaadin-themable-mixin@24.5.4': - resolution: {integrity: sha512-s0MAO9iRZYfIiX7HPZZ+vasrmNTKARhCxBBt3GiXhHFlKk5QbsvEYZxt2Ilas6ToiNMn/FbwvMeZb4w/JRx5/A==} + '@vaadin/vaadin-themable-mixin@24.5.5': + resolution: {integrity: sha512-PNka98FxocQqov5vd22OtQ3DJp+p/5+bd4RL8UqUYiNG8dOdXG3npW/1l+mG1JButbf/TPsLCLsnUVIKvchr7A==} '@vaadin/vaadin-usage-statistics@2.1.3': resolution: {integrity: sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==} @@ -1246,16 +1251,16 @@ packages: peerDependencies: typescript: ^5.0.0 - '@wsdot/web-styles@https://codeload.github.com/WSDOT-GIS/wsdot-web-styles/tar.gz/3398615915f71ee72e1dfef9d6d2c1035df16b17': - resolution: {tarball: https://codeload.github.com/WSDOT-GIS/wsdot-web-styles/tar.gz/3398615915f71ee72e1dfef9d6d2c1035df16b17} + '@wsdot/web-styles@https://codeload.github.com/WSDOT-GIS/wsdot-web-styles/tar.gz/7d4f6d074709d8fdd3a4c20ba85a35c707613a3b': + resolution: {tarball: https://codeload.github.com/WSDOT-GIS/wsdot-web-styles/tar.gz/7d4f6d074709d8fdd3a4c20ba85a35c707613a3b} version: 1.0.1 - '@zip.js/zip.js@2.7.53': - resolution: {integrity: sha512-G6Bl5wN9EXXVaTUIox71vIX5Z454zEBe+akKpV4m1tUboIctT5h7ID3QXCJd/Lfy2rSvmkTmZIucf1jGRR4f5A==} + '@zip.js/zip.js@2.7.54': + resolution: {integrity: sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==} engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=16.5.0'} - agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} analytics-utils@1.0.12: @@ -1332,8 +1337,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001685: - resolution: {integrity: sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==} + caniuse-lite@1.0.30001687: + resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==} chai@5.1.2: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} @@ -1491,8 +1496,8 @@ packages: dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1540,8 +1545,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.68: - resolution: {integrity: sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==} + electron-to-chromium@1.5.72: + resolution: {integrity: sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1704,8 +1709,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} iconv-lite@0.6.3: @@ -1842,8 +1847,8 @@ packages: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} - magic-string@0.30.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.15: + resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -1890,8 +1895,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.6.6: - resolution: {integrity: sha512-npfIIVRHKQX3Lw4aLWX4wBh+lQwpqdZNyJYB5K/+ktK8NhtkdsTxGK7WDrgknozcVyRI7TOqY6yBS9j2FTR+YQ==} + msw@2.6.8: + resolution: {integrity: sha512-nxXxnH6WALZ9a7rsQp4HU2AaD4iGAiouMmE/MY4al7pXTibgA6OZOuKhmN2WBIM6w9qMKwRtX8p2iOb45B2M/Q==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1909,8 +1914,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -2012,8 +2017,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rollup@4.28.0: - resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} + rollup@4.28.1: + resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2141,11 +2146,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} - tldts-core@6.1.65: - resolution: {integrity: sha512-Uq5t0N0Oj4nQSbU8wFN1YYENvMthvwU13MQrMJRspYCGLSAZjAfoBOJki5IQpnBM/WFskxxC/gIOTwaedmHaSg==} + tldts-core@6.1.66: + resolution: {integrity: sha512-s07jJruSwndD2X8bVjwioPfqpIc1pDTzszPe9pL1Skbh4bjytL85KNQ3tolqLbCvpQHawIsGfFi9dgerWjqW4g==} - tldts@6.1.65: - resolution: {integrity: sha512-xU9gLTfAGsADQ2PcWee6Hg8RFAv0DnjMGVJmDnUmI8a9+nYmapMQix4afwrdaCtT+AqP4MaxEzu7cCrYmBPbzQ==} + tldts@6.1.66: + resolution: {integrity: sha512-l3ciXsYFel/jSRfESbyKYud1nOw7WfhrBEF9I3UiarYk/qEaOOwu3qXNECHw4fHGHGTEOuhf/VdKgoDX5M/dhQ==} hasBin: true to-regex-range@5.0.1: @@ -2242,8 +2247,8 @@ packages: terser: optional: true - vite@6.0.2: - resolution: {integrity: sha512-XdQ+VsY2tJpBsKGs0wf3U/+azx8BBpYRHFAyKm5VeEZNOJZRB63q7Sc8Iup3k0TrN3KO6QgyzFf+opSbfY1y0g==} + vite@6.0.3: + resolution: {integrity: sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2329,8 +2334,8 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + whatwg-url@14.1.0: + resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} engines: {node: '>=18'} which@2.0.2: @@ -2465,11 +2470,11 @@ snapshots: '@arcgis/core@4.31.6(@floating-ui/utils@0.2.8)': dependencies: - '@esri/arcgis-html-sanitizer': 4.1.0-next.4 + '@esri/arcgis-html-sanitizer': 4.1.0 '@esri/calcite-colors': 6.1.0 '@esri/calcite-components': 2.13.2(@floating-ui/utils@0.2.8) - '@vaadin/grid': 24.5.4 - '@zip.js/zip.js': 2.7.53 + '@vaadin/grid': 24.5.5 + '@zip.js/zip.js': 2.7.54 luxon: 3.5.0 marked: 14.1.4 sortablejs: 1.15.6 @@ -2482,39 +2487,39 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.2': {} + '@babel/compat-data@7.26.3': {} '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 + '@babel/generator': 7.26.3 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.26.2': + '@babel/generator@7.26.3': dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.26.2 + '@babel/compat-data': 7.26.3 '@babel/helper-validator-option': 7.25.9 browserslist: 4.24.2 lru-cache: 5.1.1 @@ -2522,8 +2527,8 @@ snapshots: '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 transitivePeerDependencies: - supports-color @@ -2532,7 +2537,7 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.26.4 transitivePeerDependencies: - supports-color @@ -2545,31 +2550,31 @@ snapshots: '@babel/helpers@7.26.0': dependencies: '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 - '@babel/parser@7.26.2': + '@babel/parser@7.26.3': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.26.3 '@babel/template@7.25.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 - '@babel/traverse@7.25.9': + '@babel/traverse@7.26.4': dependencies: '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 '@babel/template': 7.25.9 - '@babel/types': 7.26.0 - debug: 4.3.7 + '@babel/types': 7.26.3 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.26.0': + '@babel/types@7.26.3': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -2665,16 +2670,16 @@ snapshots: '@cspell/dict-markdown': 2.0.7(@cspell/dict-css@4.0.16)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.10)(@cspell/dict-typescript@3.1.11) '@cspell/dict-monkeyc': 1.0.9 '@cspell/dict-node': 5.0.5 - '@cspell/dict-npm': 5.1.14 + '@cspell/dict-npm': 5.1.15 '@cspell/dict-php': 4.0.13 '@cspell/dict-powershell': 5.0.13 '@cspell/dict-public-licenses': 2.0.11 - '@cspell/dict-python': 4.2.12 + '@cspell/dict-python': 4.2.13 '@cspell/dict-r': 2.0.4 '@cspell/dict-ruby': 5.0.7 '@cspell/dict-rust': 4.0.10 '@cspell/dict-scala': 5.0.6 - '@cspell/dict-software-terms': 4.1.17 + '@cspell/dict-software-terms': 4.1.18 '@cspell/dict-sql': 2.1.8 '@cspell/dict-svelte': 1.0.5 '@cspell/dict-swift': 2.0.4 @@ -2781,7 +2786,7 @@ snapshots: '@cspell/dict-node@5.0.5': {} - '@cspell/dict-npm@5.1.14': {} + '@cspell/dict-npm@5.1.15': {} '@cspell/dict-php@4.0.13': {} @@ -2789,7 +2794,7 @@ snapshots: '@cspell/dict-public-licenses@2.0.11': {} - '@cspell/dict-python@4.2.12': + '@cspell/dict-python@4.2.13': dependencies: '@cspell/dict-data-science': 2.0.5 @@ -2801,7 +2806,7 @@ snapshots: '@cspell/dict-scala@5.0.6': {} - '@cspell/dict-software-terms@4.1.17': {} + '@cspell/dict-software-terms@4.1.18': {} '@cspell/dict-sql@2.1.8': {} @@ -3038,7 +3043,7 @@ snapshots: '@esbuild/win32-x64@0.24.0': optional: true - '@esri/arcgis-html-sanitizer@4.1.0-next.4': + '@esri/arcgis-html-sanitizer@4.1.0': dependencies: xss: 1.0.13 @@ -3082,13 +3087,13 @@ snapshots: '@fontsource/overpass@5.1.1': {} - '@inquirer/confirm@5.0.2(@types/node@22.10.1)': + '@inquirer/confirm@5.1.0(@types/node@22.10.1)': dependencies: - '@inquirer/core': 10.1.0(@types/node@22.10.1) + '@inquirer/core': 10.1.1(@types/node@22.10.1) '@inquirer/type': 3.0.1(@types/node@22.10.1) '@types/node': 22.10.1 - '@inquirer/core@10.1.0(@types/node@22.10.1)': + '@inquirer/core@10.1.1(@types/node@22.10.1)': dependencies: '@inquirer/figures': 1.0.8 '@inquirer/type': 3.0.1(@types/node@22.10.1) @@ -3171,58 +3176,61 @@ snapshots: dependencies: '@webcomponents/shadycss': 1.11.2 - '@rollup/rollup-android-arm-eabi@4.28.0': + '@rollup/rollup-android-arm-eabi@4.28.1': + optional: true + + '@rollup/rollup-android-arm64@4.28.1': optional: true - '@rollup/rollup-android-arm64@4.28.0': + '@rollup/rollup-darwin-arm64@4.28.1': optional: true - '@rollup/rollup-darwin-arm64@4.28.0': + '@rollup/rollup-darwin-x64@4.28.1': optional: true - '@rollup/rollup-darwin-x64@4.28.0': + '@rollup/rollup-freebsd-arm64@4.28.1': optional: true - '@rollup/rollup-freebsd-arm64@4.28.0': + '@rollup/rollup-freebsd-x64@4.28.1': optional: true - '@rollup/rollup-freebsd-x64@4.28.0': + '@rollup/rollup-linux-arm-gnueabihf@4.28.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.0': + '@rollup/rollup-linux-arm-musleabihf@4.28.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.0': + '@rollup/rollup-linux-arm64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.0': + '@rollup/rollup-linux-arm64-musl@4.28.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.0': + '@rollup/rollup-linux-loongarch64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.0': + '@rollup/rollup-linux-riscv64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.0': + '@rollup/rollup-linux-s390x-gnu@4.28.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.0': + '@rollup/rollup-linux-x64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-x64-musl@4.28.0': + '@rollup/rollup-linux-x64-musl@4.28.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.0': + '@rollup/rollup-win32-arm64-msvc@4.28.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.0': + '@rollup/rollup-win32-ia32-msvc@4.28.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.0': + '@rollup/rollup-win32-x64-msvc@4.28.1': optional: true '@stencil/core@4.20.0': {} @@ -3249,7 +3257,7 @@ snapshots: '@types/estree@1.0.6': {} - '@types/geojson@7946.0.14': {} + '@types/geojson@7946.0.15': {} '@types/node@22.10.1': dependencies: @@ -3263,26 +3271,26 @@ snapshots: '@types/trusted-types@2.0.7': {} - '@vaadin/a11y-base@24.5.4': + '@vaadin/a11y-base@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 - '@vaadin/component-base': 24.5.4 + '@vaadin/component-base': 24.5.5 lit: 3.2.1 - '@vaadin/checkbox@24.5.4': + '@vaadin/checkbox@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 - '@vaadin/a11y-base': 24.5.4 - '@vaadin/component-base': 24.5.4 - '@vaadin/field-base': 24.5.4 - '@vaadin/vaadin-lumo-styles': 24.5.4 - '@vaadin/vaadin-material-styles': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/a11y-base': 24.5.5 + '@vaadin/component-base': 24.5.5 + '@vaadin/field-base': 24.5.5 + '@vaadin/vaadin-lumo-styles': 24.5.5 + '@vaadin/vaadin-material-styles': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 lit: 3.2.1 - '@vaadin/component-base@24.5.4': + '@vaadin/component-base@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 @@ -3290,79 +3298,79 @@ snapshots: '@vaadin/vaadin-usage-statistics': 2.1.3 lit: 3.2.1 - '@vaadin/field-base@24.5.4': + '@vaadin/field-base@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 - '@vaadin/a11y-base': 24.5.4 - '@vaadin/component-base': 24.5.4 + '@vaadin/a11y-base': 24.5.5 + '@vaadin/component-base': 24.5.5 lit: 3.2.1 - '@vaadin/grid@24.5.4': + '@vaadin/grid@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 - '@vaadin/a11y-base': 24.5.4 - '@vaadin/checkbox': 24.5.4 - '@vaadin/component-base': 24.5.4 - '@vaadin/lit-renderer': 24.5.4 - '@vaadin/text-field': 24.5.4 - '@vaadin/vaadin-lumo-styles': 24.5.4 - '@vaadin/vaadin-material-styles': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/a11y-base': 24.5.5 + '@vaadin/checkbox': 24.5.5 + '@vaadin/component-base': 24.5.5 + '@vaadin/lit-renderer': 24.5.5 + '@vaadin/text-field': 24.5.5 + '@vaadin/vaadin-lumo-styles': 24.5.5 + '@vaadin/vaadin-material-styles': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 lit: 3.2.1 - '@vaadin/icon@24.5.4': + '@vaadin/icon@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 - '@vaadin/component-base': 24.5.4 - '@vaadin/vaadin-lumo-styles': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/component-base': 24.5.5 + '@vaadin/vaadin-lumo-styles': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 lit: 3.2.1 - '@vaadin/input-container@24.5.4': + '@vaadin/input-container@24.5.5': dependencies: '@polymer/polymer': 3.5.2 - '@vaadin/component-base': 24.5.4 - '@vaadin/vaadin-lumo-styles': 24.5.4 - '@vaadin/vaadin-material-styles': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/component-base': 24.5.5 + '@vaadin/vaadin-lumo-styles': 24.5.5 + '@vaadin/vaadin-material-styles': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 lit: 3.2.1 - '@vaadin/lit-renderer@24.5.4': + '@vaadin/lit-renderer@24.5.5': dependencies: lit: 3.2.1 - '@vaadin/text-field@24.5.4': + '@vaadin/text-field@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 '@polymer/polymer': 3.5.2 - '@vaadin/a11y-base': 24.5.4 - '@vaadin/component-base': 24.5.4 - '@vaadin/field-base': 24.5.4 - '@vaadin/input-container': 24.5.4 - '@vaadin/vaadin-lumo-styles': 24.5.4 - '@vaadin/vaadin-material-styles': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/a11y-base': 24.5.5 + '@vaadin/component-base': 24.5.5 + '@vaadin/field-base': 24.5.5 + '@vaadin/input-container': 24.5.5 + '@vaadin/vaadin-lumo-styles': 24.5.5 + '@vaadin/vaadin-material-styles': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 lit: 3.2.1 '@vaadin/vaadin-development-mode-detector@2.0.7': {} - '@vaadin/vaadin-lumo-styles@24.5.4': + '@vaadin/vaadin-lumo-styles@24.5.5': dependencies: '@polymer/polymer': 3.5.2 - '@vaadin/component-base': 24.5.4 - '@vaadin/icon': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/component-base': 24.5.5 + '@vaadin/icon': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 - '@vaadin/vaadin-material-styles@24.5.4': + '@vaadin/vaadin-material-styles@24.5.5': dependencies: '@polymer/polymer': 3.5.2 - '@vaadin/component-base': 24.5.4 - '@vaadin/vaadin-themable-mixin': 24.5.4 + '@vaadin/component-base': 24.5.5 + '@vaadin/vaadin-themable-mixin': 24.5.5 - '@vaadin/vaadin-themable-mixin@24.5.4': + '@vaadin/vaadin-themable-mixin@24.5.5': dependencies: '@open-wc/dedupe-mixin': 1.4.0 lit: 3.2.1 @@ -3371,10 +3379,10 @@ snapshots: dependencies: '@vaadin/vaadin-development-mode-detector': 2.0.7 - '@vitest/coverage-istanbul@2.1.8(vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2)))': + '@vitest/coverage-istanbul@2.1.8(vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2)))': dependencies: '@istanbuljs/schema': 0.1.3 - debug: 4.3.7 + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 @@ -3383,25 +3391,25 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2)) + vitest: 2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2)) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2)))': + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2)))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.7 + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.1.7 - magic-string: 0.30.14 + magic-string: 0.30.15 magicast: 0.3.5 std-env: 3.8.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2)) + vitest: 2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2)) transitivePeerDependencies: - supports-color @@ -3412,13 +3420,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.1))': + '@vitest/mocker@2.1.8(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.1))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.15 optionalDependencies: - msw: 2.6.6(@types/node@22.10.1)(typescript@5.7.2) + msw: 2.6.8(@types/node@22.10.1)(typescript@5.7.2) vite: 5.4.11(@types/node@22.10.1) '@vitest/pretty-format@2.1.8': @@ -3433,7 +3441,7 @@ snapshots: '@vitest/snapshot@2.1.8': dependencies: '@vitest/pretty-format': 2.1.8 - magic-string: 0.30.14 + magic-string: 0.30.15 pathe: 1.1.2 '@vitest/spy@2.1.8': @@ -3459,18 +3467,14 @@ snapshots: - supports-color - utf-8-validate - '@wsdot/web-styles@https://codeload.github.com/WSDOT-GIS/wsdot-web-styles/tar.gz/3398615915f71ee72e1dfef9d6d2c1035df16b17': + '@wsdot/web-styles@https://codeload.github.com/WSDOT-GIS/wsdot-web-styles/tar.gz/7d4f6d074709d8fdd3a4c20ba85a35c707613a3b': optionalDependencies: '@fontsource/inconsolata': 5.1.0 '@fontsource/lato': 5.1.0 - '@zip.js/zip.js@2.7.53': {} + '@zip.js/zip.js@2.7.54': {} - agent-base@7.1.1: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} analytics-utils@1.0.12(@types/dlv@1.1.5): dependencies: @@ -3526,16 +3530,16 @@ snapshots: browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001685 - electron-to-chromium: 1.5.68 - node-releases: 2.0.18 + caniuse-lite: 1.0.30001687 + electron-to-chromium: 1.5.72 + node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.2) cac@6.7.14: {} callsites@3.1.0: {} - caniuse-lite@1.0.30001685: {} + caniuse-lite@1.0.30001687: {} chai@5.1.2: dependencies: @@ -3743,11 +3747,11 @@ snapshots: data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + whatwg-url: 14.1.0 dayjs@1.11.13: {} - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -3788,7 +3792,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.68: {} + electron-to-chromium@1.5.72: {} emoji-regex@8.0.0: {} @@ -3980,15 +3984,15 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 - debug: 4.3.7 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color - https-proxy-agent@7.0.5: + https-proxy-agent@7.0.6: dependencies: - agent-base: 7.1.1 - debug: 4.3.7 + agent-base: 7.1.3 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -4028,7 +4032,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.26.0 - '@babel/parser': 7.26.2 + '@babel/parser': 7.26.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.3 @@ -4044,7 +4048,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.7 + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -4070,7 +4074,7 @@ snapshots: form-data: 4.0.1 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.16 parse5: 7.2.1 @@ -4082,7 +4086,7 @@ snapshots: webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + whatwg-url: 14.1.0 ws: 8.18.0 xml-name-validator: 5.0.0 transitivePeerDependencies: @@ -4099,7 +4103,7 @@ snapshots: form-data: 4.0.1 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 + https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.16 parse5: 7.2.1 @@ -4111,7 +4115,7 @@ snapshots: webidl-conversions: 7.0.0 whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + whatwg-url: 14.1.0 ws: 8.18.0 xml-name-validator: 5.0.0 transitivePeerDependencies: @@ -4166,14 +4170,14 @@ snapshots: luxon@3.5.0: {} - magic-string@0.30.14: + magic-string@0.30.15: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 magicast@0.3.5: dependencies: - '@babel/parser': 7.26.2 - '@babel/types': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 source-map-js: 1.2.1 make-dir@4.0.0: @@ -4207,12 +4211,12 @@ snapshots: ms@2.1.3: {} - msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2): + msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.0.2(@types/node@22.10.1) + '@inquirer/confirm': 5.1.0(@types/node@22.10.1) '@mswjs/interceptors': 0.37.3 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -4236,7 +4240,7 @@ snapshots: nanoid@3.3.8: {} - node-releases@2.0.18: {} + node-releases@2.0.19: {} nth-check@2.1.1: dependencies: @@ -4318,28 +4322,29 @@ snapshots: resolve-pkg-maps@1.0.0: {} - rollup@4.28.0: + rollup@4.28.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.0 - '@rollup/rollup-android-arm64': 4.28.0 - '@rollup/rollup-darwin-arm64': 4.28.0 - '@rollup/rollup-darwin-x64': 4.28.0 - '@rollup/rollup-freebsd-arm64': 4.28.0 - '@rollup/rollup-freebsd-x64': 4.28.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.0 - '@rollup/rollup-linux-arm-musleabihf': 4.28.0 - '@rollup/rollup-linux-arm64-gnu': 4.28.0 - '@rollup/rollup-linux-arm64-musl': 4.28.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.0 - '@rollup/rollup-linux-riscv64-gnu': 4.28.0 - '@rollup/rollup-linux-s390x-gnu': 4.28.0 - '@rollup/rollup-linux-x64-gnu': 4.28.0 - '@rollup/rollup-linux-x64-musl': 4.28.0 - '@rollup/rollup-win32-arm64-msvc': 4.28.0 - '@rollup/rollup-win32-ia32-msvc': 4.28.0 - '@rollup/rollup-win32-x64-msvc': 4.28.0 + '@rollup/rollup-android-arm-eabi': 4.28.1 + '@rollup/rollup-android-arm64': 4.28.1 + '@rollup/rollup-darwin-arm64': 4.28.1 + '@rollup/rollup-darwin-x64': 4.28.1 + '@rollup/rollup-freebsd-arm64': 4.28.1 + '@rollup/rollup-freebsd-x64': 4.28.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 + '@rollup/rollup-linux-arm-musleabihf': 4.28.1 + '@rollup/rollup-linux-arm64-gnu': 4.28.1 + '@rollup/rollup-linux-arm64-musl': 4.28.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 + '@rollup/rollup-linux-riscv64-gnu': 4.28.1 + '@rollup/rollup-linux-s390x-gnu': 4.28.1 + '@rollup/rollup-linux-x64-gnu': 4.28.1 + '@rollup/rollup-linux-x64-musl': 4.28.1 + '@rollup/rollup-win32-arm64-msvc': 4.28.1 + '@rollup/rollup-win32-ia32-msvc': 4.28.1 + '@rollup/rollup-win32-x64-msvc': 4.28.1 fsevents: 2.3.3 rrweb-cssom@0.7.1: {} @@ -4448,11 +4453,11 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@6.1.65: {} + tldts-core@6.1.66: {} - tldts@6.1.65: + tldts@6.1.66: dependencies: - tldts-core: 6.1.65 + tldts-core: 6.1.66 to-regex-range@5.0.1: dependencies: @@ -4467,7 +4472,7 @@ snapshots: tough-cookie@5.0.0: dependencies: - tldts: 6.1.65 + tldts: 6.1.66 tr46@5.0.0: dependencies: @@ -4510,7 +4515,7 @@ snapshots: vite-node@2.1.8(@types/node@22.10.1): dependencies: cac: 6.7.14 - debug: 4.3.7 + debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.11(@types/node@22.10.1) @@ -4529,35 +4534,35 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.28.0 + rollup: 4.28.1 optionalDependencies: '@types/node': 22.10.1 fsevents: 2.3.3 - vite@6.0.2(@types/node@22.10.1)(tsx@4.19.2)(yaml@2.6.1): + vite@6.0.3(@types/node@22.10.1)(tsx@4.19.2)(yaml@2.6.1): dependencies: esbuild: 0.24.0 postcss: 8.4.49 - rollup: 4.28.0 + rollup: 4.28.1 optionalDependencies: '@types/node': 22.10.1 fsevents: 2.3.3 tsx: 4.19.2 yaml: 2.6.1 - vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2)): + vitest@2.1.8(@types/node@22.10.1)(jsdom@25.0.1)(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2)): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(msw@2.6.6(@types/node@22.10.1)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.1)) + '@vitest/mocker': 2.1.8(msw@2.6.8(@types/node@22.10.1)(typescript@5.7.2))(vite@5.4.11(@types/node@22.10.1)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 '@vitest/spy': 2.1.8 '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.3.7 + debug: 4.4.0 expect-type: 1.1.0 - magic-string: 0.30.14 + magic-string: 0.30.15 pathe: 1.1.2 std-env: 3.8.0 tinybench: 2.9.0 @@ -4597,7 +4602,7 @@ snapshots: whatwg-mimetype@4.0.0: {} - whatwg-url@14.0.0: + whatwg-url@14.1.0: dependencies: tr46: 5.0.0 webidl-conversions: 7.0.0 diff --git a/src/addGraphicsToLayer.ts b/src/addGraphicsToLayer.ts index 12d27dc6..cf4c4007 100644 --- a/src/addGraphicsToLayer.ts +++ b/src/addGraphicsToLayer.ts @@ -11,32 +11,19 @@ export async function addGraphicsToLayer( milepostLayer: FeatureLayer, locationGraphics: Graphic[], ) { - /* __PURE__ */ console.group(addGraphicsToLayer.name, { - milepostLayer: { ...milepostLayer }, - locationGraphics: locationGraphics.map((g) => g.toJSON() as unknown), - }); - try { - // Add graphics to the layer and await for the edit to complete. - const editsResult = await milepostLayer.applyEdits( - { - addFeatures: locationGraphics, - }, - {}, - ); - /* __PURE__ */ console.debug( - "editsResult", - editsResult.addFeatureResults.map((e) => ({ ...e })), - ); + // Add graphics to the layer and await for the edit to complete. + const editsResult = await milepostLayer.applyEdits( + { + addFeatures: locationGraphics, + }, + {}, + ); - // Get the added features from the edits result by querying the milepost layer - // for the features with matching object IDs. - const query = milepostLayer.createQuery(); - /* __PURE__ */ console.debug("query", query.toJSON()); - query.objectIds = editsResult.addFeatureResults.map((r) => r.objectId); - const results = await milepostLayer.queryFeatures(query); + // Get the added features from the edits result by querying the milepost layer + // for the features with matching object IDs. + const query = milepostLayer.createQuery(); + query.objectIds = editsResult.addFeatureResults.map((r) => r.objectId); + const results = await milepostLayer.queryFeatures(query); - return results.features; - } finally { - /* __PURE__ */ console.groupEnd(); - } + return results.features; } diff --git a/src/elc/arcgis.ts b/src/elc/arcgis.ts index c6b3d732..69d81d42 100644 --- a/src/elc/arcgis.ts +++ b/src/elc/arcgis.ts @@ -1,6 +1,7 @@ import Graphic from "@arcgis/core/Graphic"; import Point from "@arcgis/core/geometry/Point"; -import { hasXAndY } from "../types"; +import Polyline from "@arcgis/core/geometry/Polyline"; +import { hasPaths, hasXAndY } from "../types"; import { ElcError } from "./errors"; import type { DateType, @@ -39,12 +40,23 @@ export function routeLocationToGraphic< if (routeLocation instanceof ElcError) { throw routeLocation; } - let geometry: __esri.Point | undefined; - if (routeLocation.RouteGeometry && hasXAndY(routeLocation.RouteGeometry)) { - const { x, y, spatialReference } = routeLocation.RouteGeometry; - geometry = new Point({ x, y, spatialReference }); + let geometry: __esri.Point | __esri.Polyline | undefined; + if (routeLocation.RouteGeometry) { + if (hasXAndY(routeLocation.RouteGeometry)) { + const { x, y, spatialReference } = routeLocation.RouteGeometry; + geometry = new Point({ x, y, spatialReference }); + } else if (hasPaths(routeLocation.RouteGeometry)) { + const { paths, spatialReference } = routeLocation.RouteGeometry; + geometry = new Polyline({ + paths, + spatialReference, + }); + } } else { - console.warn("Input does not have valid point geometry.", routeLocation); + console.warn( + "Input does not have valid point or polyline geometry.", + routeLocation, + ); } let attributes: | (Record & { @@ -53,17 +65,18 @@ export function routeLocationToGraphic< Direction: "D" | "I"; Srmp?: number; Back: "B" | ""; - "Township Subdivision": null; - City: null; - County: null; + EndSrmp?: number; + EndBack?: "B" | ""; }) | undefined; if (hasValidSrmpData(routeLocation)) { const { Route, + Decrease, Srmp, Back, - Decrease, + EndSrmp, + EndBack, // Angle, // Arm, // ArmCalcReturnCode, @@ -82,9 +95,8 @@ export function routeLocationToGraphic< Direction: Decrease ? "D" : "I", Srmp, Back: Back ? "B" : "", - "Township Subdivision": null, - City: null, - County: null, + EndSrmp: EndSrmp, + EndBack: EndBack ? "B" : "", }; oid++; } else { diff --git a/src/elc/types.ts b/src/elc/types.ts index 98be4a10..7f4b727c 100644 --- a/src/elc/types.ts +++ b/src/elc/types.ts @@ -122,6 +122,9 @@ export interface RouteLocation { RouteGeometry?: G; Srmp?: number; LocatingError?: string | null; + EndArm?: number; + EndSrmp?: number; + EndBack?: boolean; } export type ArmRouteLocation< @@ -134,6 +137,12 @@ export type SrmpRouteLocation< G extends RouteGeometry, > = RouteLocation & Required, "Srmp" & "Back">>; +export type SrmpRouteLineLocation< + D extends DateType, + G extends RouteGeometry, +> = RouteLocation & + Required, "EndSrmp" & "EndBack">>; + export type ValidRouteLocationForMPInput< D extends DateType, G extends RouteGeometry, @@ -176,13 +185,7 @@ export interface ElcAttributes Srmp: number; } -export interface LayerFeatureAttributes - extends ElcAttributes, - AttributesObject { - "Township Subdivision": string | null; - County: string | null; - City: string | null; -} +export type LayerFeatureAttributes = ElcAttributes & AttributesObject; /** * A milepost point {@link Graphic}. diff --git a/src/elc/url.ts b/src/elc/url.ts index 051d854b..f35b2cb9 100644 --- a/src/elc/url.ts +++ b/src/elc/url.ts @@ -32,7 +32,7 @@ import type { ValidRouteLocationForMPInput, } from "./types"; -type UrlParamMapKey = "sr" | "rrt" | "rrq" | "dir" | "mp"; +type UrlParamMapKey = "sr" | "rrt" | "rrq" | "dir" | "mp" | "endMP"; /** * Regular expression patterns to validate URL parameters. @@ -43,8 +43,10 @@ const keyRegExps = new Map([ ["rrq", /^R{1,2}Q/i], ["dir", /^D(?:IR)?/i], ["mp", /^(?:SR)?MP/i], + ["endMP", /^E(ND)?(SR)?MP/i], ] as const); +const milepostAndBackIndicatorRegex = /^(?\d+(?:\.\d+)?)(?B)?$/i; /** * Regular expression patterns to validate URL parameter values. */ @@ -64,7 +66,8 @@ const valueRegExps = new Map([ * @example * // matches "123", "123.45", "123B", "123.45B" */ - ["mp", /^(?\d+(?:\.\d+)?)(?B)?$/i], + ["mp", milepostAndBackIndicatorRegex], + ["endMP", milepostAndBackIndicatorRegex], ] as const); type KeyValueRegExpTuple = [keyRegexp: RegExp, valueRegexp: RegExp]; @@ -91,6 +94,8 @@ export function getUrlSearchParameter( urlParams: URLSearchParams, key: UrlParamMapKey, ) { + let output: string | null = null; + // Retrieve the regular expression tuple from the regExpMap based on the key. const reTuple = regExpMap.get(key); if (!reTuple) { @@ -105,7 +110,6 @@ export function getUrlSearchParameter( } const [keyRe, valueRe] = reTuple; - let output: string | null = null; // Iterate over each key-value pair in the URL search parameters. for (const [k, v] of urlParams.entries()) { @@ -160,7 +164,6 @@ export function* enumerateUrlParameters( } else if (Array.isArray(value)) { outValue = JSON.stringify(value); } else { - // eslint-disable-next-line @typescript-eslint/restrict-template-expressions outValue = `${value}`; } yield [key, outValue]; @@ -245,7 +248,7 @@ function parseSrmp(mp: string): { srmp: number; back: boolean } { */ export function getElcParamsFromUrl( url: string | URL | URLSearchParams = window.location.href, -): ValidRouteLocationForMPInput | null { +) { // If the URL is a URL object, use its search params. let searchParams: URLSearchParams; if (url instanceof URL) { @@ -281,14 +284,22 @@ export function getElcParamsFromUrl( const route = `${sr}${rrt}${rrq}`; - return { + const emp = getUrlSearchParameter(searchParams, "endMP"); + + const { srmp: endSrmp, back: endBack } = emp + ? parseSrmp(emp) + : { srmp: null, back: null }; + const output = { Route: route, Srmp: srmp, Back: back, Decrease: /dD/i.test(direction), ReferenceDate: today, ResponseDate: today, - }; + EndSrmp: endSrmp, + EndBack: endBack, + } as ValidRouteLocationForMPInput; + return output; } /** @@ -301,6 +312,7 @@ export function getElcParamsFromUrl( */ export async function callElcFromUrl( milepostLayer: __esri.FeatureLayer, + lineMilepostLayer: __esri.FeatureLayer, options: Pick = { outSR: 3857 }, ) { const routeLocation = getElcParamsFromUrl(); @@ -325,5 +337,10 @@ export async function callElcFromUrl( const graphic = routeLocationToGraphic(location); - return addGraphicsToLayer(milepostLayer, [graphic]); + const layer = + graphic.geometry.type === "polyline" ? lineMilepostLayer : milepostLayer; + + const addedGraphics = addGraphicsToLayer(layer, [graphic]); + + return addedGraphics; } diff --git a/src/layers/MilepostLayer/arcade/County.arcade b/src/layers/MilepostLayer/arcade/County.arcade index 58aad7c2..bc82de6f 100644 --- a/src/layers/MilepostLayer/arcade/County.arcade +++ b/src/layers/MilepostLayer/arcade/County.arcade @@ -19,4 +19,4 @@ for (var f in match) { return f.JURISDICT_LABEL_NM } -return $userInput; \ No newline at end of file +// return $userInput; \ No newline at end of file diff --git a/src/layers/MilepostLayer/arcade/WGS 1984 Coordinates.arcade b/src/layers/MilepostLayer/arcade/WGS 1984 Coordinates.arcade index beac825b..71a589c9 100644 --- a/src/layers/MilepostLayer/arcade/WGS 1984 Coordinates.arcade +++ b/src/layers/MilepostLayer/arcade/WGS 1984 Coordinates.arcade @@ -1,3 +1,9 @@ // import fromWebMercatorFunction from "./parts/fromWebMercator.function.arcade" -webMercatorToWgs1984(Geometry($feature)) \ No newline at end of file +var featureGeometry = Geometry($feature); + +if (TypeOf(featureGeometry) == "Point") { + webMercatorToWgs1984(Geometry($feature)) +} else { + webMercatorToWgs1984(Point($userInput)) +} diff --git a/src/layers/MilepostLayer/arcade/parts/webMercatorToWgs1984.function.arcade b/src/layers/MilepostLayer/arcade/parts/webMercatorToWgs1984.function.arcade index 63067117..dc591280 100644 --- a/src/layers/MilepostLayer/arcade/parts/webMercatorToWgs1984.function.arcade +++ b/src/layers/MilepostLayer/arcade/parts/webMercatorToWgs1984.function.arcade @@ -1,10 +1,10 @@ -function webMercatorToWgs1984(geom) { - // Web Mercator coordinates - var xWebMercator = geom.x; - var yWebMercator = geom.y; +// Constants +var R_MAJOR = 6378137.0; + +function xyWebMercatorToWgs1984(xy) { - // Constants - var R_MAJOR = 6378137.0; + var xWebMercator = xy[0]; + var yWebMercator = xy[1]; // Convert Web Mercator (x) to longitude (WGS 1984) var lonWGS84 = (xWebMercator / R_MAJOR) * (180 / PI); @@ -13,8 +13,22 @@ function webMercatorToWgs1984(geom) { var latWGS84 = (Atan(Exp(yWebMercator / R_MAJOR)) * 2 - PI / 2) * (180 / PI); - return { - x: lonWGS84, - y: latWGS84, - }; + return [lonWGS84, latWGS84]; +} + +function webMercatorToWgs1984(geom) { + if (geom.type == "Point") { + // Web Mercator coordinates + var xWebMercator = geom.x; + var yWebMercator = geom.y; + + var wgsXY = xyWebMercatorToWgs1984([xWebMercator, yWebMercator]); + + return { + x: wgsXY[0], + y: wgsXY[1], + }; + } + + return null; } diff --git a/src/layers/MilepostLayer/create-cim.ts b/src/layers/MilepostLayer/create-cim.ts new file mode 100644 index 00000000..b35c250c --- /dev/null +++ b/src/layers/MilepostLayer/create-cim.ts @@ -0,0 +1,130 @@ +/** + * This script was used to create the milepost marker symbol, + * after which it was further modified. + */ + +import TextSymbol from "@arcgis/core/symbols/TextSymbol"; +import { convertToCIMSymbol } from "@arcgis/core/symbols/support/cimConversionUtils"; +import { highwaySignBackgroundColor, highwaySignTextColor } from "../../colors"; + +/** + * The name of the text symbol that will have its + * text replaced by feature attributes. + */ +const defaultPrimitiveName = "milepostLabel"; + +/** + * Type guard function to check if a CIMSymbolLayer is a CIMVectorMarker. + * @param l - The CIMSymbolLayer to check. + * @returns A boolean indicating whether the provided layer is a CIMVectorMarker. + */ +export function isCimVectorMarker( + l: __esri.CIMSymbolLayer, +): l is __esri.CIMVectorMarker { + return l.type === "CIMVectorMarker"; +} + +/** + * Type for a CIMMarkerGraphic that has a CIMTextSymbol. + */ +type CIMMarkerGraphicWithTextSymbol = __esri.CIMMarkerGraphic & { + symbol: __esri.CIMTextSymbol; +}; + +/** + * Type guard function to check if a {@link __esri.CIMMarkerGraphic|CIMMarkerGraphic} is a {@link __esri.CIMTextSymbol|CIMTextSymbol}. + * @param g - The {@link __esri.CIMMarkerGraphic|CIMMarkerGraphic} to check. + * @returns A boolean indicating whether the provided graphic is a {@link __esri.CIMTextSymbol|CIMTextSymbol}. + */ +function isCimMarkerGraphicWithTextSymbol( + g: __esri.CIMMarkerGraphic, +): g is CIMMarkerGraphicWithTextSymbol { + return g.symbol.type === "CIMTextSymbol"; +} + +/** + * Sets the primitive name of the first {@link __esri.CIMTextSymbol|CIMTextSymbol} found within the + * {@link __esri.CIMSymbol|CIMSymbol}'s vector marker layers to the specified primitive name. + * + * @param cimSymbol - The {@link __esri.CIMSymbol|CIMSymbol} object containing symbol layers to search. + * @param primitiveName - The new primitive name to assign to the first + * {@link __esri.CIMTextSymbol|CIMTextSymbol} found. + * @throws {TypeError} Will throw an error if the symbol has no symbol layers. + * @returns The modified {@link __esri.CIMMarkerGraphic|CIMMarkerGraphic} if a {@link __esri.CIMTextSymbol|CIMTextSymbol} is found, + * otherwise null. + */ +function setPrimitiveNameOfFirstTextSymbol( + cimSymbol: __esri.CIMSymbol, + primitiveName: string, +) { + const symbolLayers = cimSymbol.data.symbol?.symbolLayers; + if (!symbolLayers) { + throw new TypeError("Symbol has no symbol layers"); + } + + let textSymbol: CIMMarkerGraphicWithTextSymbol | null = null; + + // Find the text symbol and set its primitive name. + for (const layer of symbolLayers.filter(isCimVectorMarker)) { + const markerGraphics = layer.markerGraphics; + for (const markerGraphic of markerGraphics.filter( + isCimMarkerGraphicWithTextSymbol, + )) { + markerGraphic.primitiveName = primitiveName; + textSymbol = markerGraphic; + break; + } + if (textSymbol) { + break; + } + } + + return textSymbol; +} + +/** + * Creates a CIM symbol for a milepost marker. + * The symbol is a text symbol with white text on a green background. + * The text of the symbol is a placeholder that can be replaced + * with feature attributes by overriding "milepostLabel" primitive name. + * + * @returns A CIM symbol for a milepost marker. + */ +export function createMilepostCimSymbol( + textSymbolProperties: __esri.TextSymbolProperties = { + color: highwaySignTextColor, + borderLineColor: highwaySignTextColor, + borderLineSize: 1, + backgroundColor: highwaySignBackgroundColor, + // cspell:disable-next-line + text: "ROUTE\nMILE.POSTB", + }, + primitiveName: string = defaultPrimitiveName, +) { + const simpleSymbol = new TextSymbol(textSymbolProperties); + + // Convert the text symbol into a CIM symbol. + const cimSymbol = convertToCIMSymbol( + // Since this function doesn't officially support TextSymbols, + // you have to pretend its one of the supported types. + simpleSymbol as unknown as __esri.SimpleMarkerSymbol, + ); + + // Set the primitive name of the first text symbol to "milepostLabel". + setPrimitiveNameOfFirstTextSymbol(cimSymbol, primitiveName); + + // Add primitive overrides to the symbol. + cimSymbol.data.primitiveOverrides = [ + { + primitiveName: primitiveName, + propertyName: "textString", + valueExpressionInfo: { + expression: "`${$feature.Route}\\n${$feature.SRMP}${$feature.Back}`", + type: "CIMExpressionInfo", + returnType: "String", + }, + }, + ]; + + return cimSymbol; +} diff --git a/src/layers/MilepostLayer/fields.ts b/src/layers/MilepostLayer/fields.ts new file mode 100644 index 00000000..d5094cad --- /dev/null +++ b/src/layers/MilepostLayer/fields.ts @@ -0,0 +1,77 @@ +import type { FieldProperties } from "."; +import { objectIdFieldName } from "../../elc/types"; + +/** + * Field names for the milepost layer + */ +export enum fieldNames { + Route = "Route", + Srmp = "Srmp", + Back = "Back", + Direction = "Direction", + EndSrmp = "EndSrmp", + EndBack = "EndBack", +} + +/** + * Field definitions for the milepost layer + */ +export const fields: FieldProperties[] = [ + { + name: objectIdFieldName, + type: "oid", + valueType: "unique-identifier", + }, + { + name: fieldNames.Route, + type: "string", + valueType: "name-or-title", + }, + { + name: fieldNames.Direction, + type: "string", + domain: { + type: "coded-value", + codedValues: [ + { + code: "I", + name: "Increase", + }, + { + code: "D", + name: "Decrease", + }, + ], + name: "Direction", + }, + defaultValue: "I", + valueType: "type-or-category", + }, + { + name: fieldNames.Srmp, + type: "double", + valueType: "measurement", + }, + { + name: fieldNames.Back, + type: "string", + valueType: "binary", + }, +]; + +/** + * Field definitions for the route segments layer + */ +export const segmentFields: typeof fields = [ + ...fields, + { + name: fieldNames.EndSrmp, + type: "double", + valueType: "measurement", + }, + { + name: fieldNames.EndBack, + type: "string", + valueType: "binary", + }, +]; diff --git a/src/layers/MilepostLayer/index.ts b/src/layers/MilepostLayer/index.ts index 60e43fe9..524580af 100644 --- a/src/layers/MilepostLayer/index.ts +++ b/src/layers/MilepostLayer/index.ts @@ -3,64 +3,13 @@ import type FeatureLayer from "@arcgis/core/layers/FeatureLayer"; import type Field from "@arcgis/core/layers/support/Field"; import FieldInfo from "@arcgis/core/popup/FieldInfo"; import ActionButton from "@arcgis/core/support/actions/ActionButton"; -import { objectIdFieldName } from "../../elc/types"; import type { MilepostExpressionInfo } from "./arcade"; import { expressions as arcadeExpressions, locationLinksContent, } from "./arcade"; -type FieldProperties = Required>[0]; - -export enum fieldNames { - Route = "Route", - Srmp = "Srmp", - Back = "Back", - Direction = "Direction", -} - -export const fields = [ - { - name: objectIdFieldName, - type: "oid", - valueType: "unique-identifier", - }, - { - name: fieldNames.Route, - type: "string", - valueType: "name-or-title", - }, - { - name: fieldNames.Direction, - type: "string", - domain: { - type: "coded-value", - codedValues: [ - { - code: "I", - name: "Increase", - }, - { - code: "D", - name: "Decrease", - }, - ], - name: "Direction", - }, - defaultValue: "I", - valueType: "type-or-category", - }, - { - name: fieldNames.Srmp, - type: "double", - valueType: "measurement", - }, - { - name: fieldNames.Back, - type: "string", - valueType: "binary", - }, -] as FieldProperties[]; +export type FieldProperties = Required>[0]; const actionButtonProperties: __esri.ActionButtonProperties[] = [ { diff --git a/src/layers/MilepostLayer/milepost-line-layer/MilepostOffsetLineRenderer.ts b/src/layers/MilepostLayer/milepost-line-layer/MilepostOffsetLineRenderer.ts index b8564844..17e9f628 100644 --- a/src/layers/MilepostLayer/milepost-line-layer/MilepostOffsetLineRenderer.ts +++ b/src/layers/MilepostLayer/milepost-line-layer/MilepostOffsetLineRenderer.ts @@ -1,98 +1,41 @@ -import SimpleRenderer from "@arcgis/core/renderers/SimpleRenderer"; +import UniqueValueRenderer from "@arcgis/core/renderers/UniqueValueRenderer"; import CIMSymbol from "@arcgis/core/symbols/CIMSymbol"; -import { cimVectorMarker, primitiveOverrides } from "../symbol"; +import SimpleMarkerSymbol from "@arcgis/core/symbols/SimpleMarkerSymbol"; +import { convertToCIMSymbol } from "@arcgis/core/symbols/support/cimConversionUtils"; +import { highwaySignBackgroundColor } from "../../../colors"; +import { isCimVectorMarker } from "../create-cim"; +import { cimVectorMarker, segmentEndpointCimVectorMarker } from "../symbol"; +import { + endMilepostLabelPrimitiveOverride, + milepostLabelPrimitiveOverride, +} from "../symbol/primitiveOverrides"; -const clickPointSymbolLayer: __esri.CIMVectorMarker = { - type: "CIMVectorMarker", - enable: true, - colorLocked: true, - anchorPointUnits: "Relative", - size: 10, - markerPlacement: { - type: "CIMMarkerPlacementAtExtremities", - angleToLine: true, - extremityPlacement: "JustBegin", - }, - frame: { - xmin: -5, - ymin: -5, - xmax: 5, - ymax: 5, - }, - markerGraphics: [ - { - type: "CIMMarkerGraphic", - geometry: { - rings: [ - [ - [0, 5], - [0.87, 4.92], - [1.71, 4.7], - [2.5, 4.33], - [3.21, 3.83], - [3.83, 3.21], - [4.33, 2.5], - [4.7, 1.71], - [4.92, 0.87], - [5, 0], - [4.92, -0.87], - [4.7, -1.71], - [4.33, -2.5], - [3.83, -3.21], - [3.21, -3.83], - [2.5, -4.33], - [1.71, -4.7], - [0.87, -4.92], - [0, -5], - [-0.87, -4.92], - [-1.71, -4.7], - [-2.5, -4.33], - [-3.21, -3.83], - [-3.83, -3.21], - [-4.33, -2.5], - [-4.7, -1.71], - [-4.92, -0.87], - [-5, 0], - [-4.92, 0.87], - [-4.7, 1.71], - [-4.33, 2.5], - [-3.83, 3.21], - [-3.21, 3.83], - [-2.5, 4.33], - [-1.71, 4.7], - [-0.87, 4.92], - [0, 5], - ], - ], - }, - symbol: { - type: "CIMPolygonSymbol", - symbolLayers: [ - { - type: "CIMSolidStroke", - enable: true, - capStyle: "Round", - joinStyle: "Round", - // lineStyle3D: "Strip", - miterLimit: 10, - width: 0, - // // height3D: 1, - // // anchor3D: "Center", - color: [110, 110, 110, 255], - }, - { - type: "CIMSolidFill", - enable: true, - color: [255, 100, 100, 255], - }, - ], - // angleAlignment: "Map", - }, +function createClickPointSymbolLayer() { + const clickPointSymbol = new SimpleMarkerSymbol({ + style: "circle", + color: [255, 100, 100, 255], + outline: { + color: "white", + width: 1, }, - ], - scaleSymbolsProportionally: true, - respectFrame: true, -}; + }); + + console.debug("clickPointSymbol", clickPointSymbol.toJSON()); + + const clickPointCimSymbol = convertToCIMSymbol(clickPointSymbol); + console.debug("cimClickPointSymbol", clickPointCimSymbol.toJSON()); + + const clickPointSymbolLayer = + clickPointCimSymbol.data.symbol?.symbolLayers?.filter(isCimVectorMarker)[0]; + + if (!clickPointSymbolLayer) { + throw new Error("clickPointSymbolLayer not found"); + } + return clickPointSymbolLayer; +} + +const clickPointSymbolLayer = createClickPointSymbolLayer(); + const strokeSymbolLayer: __esri.CIMSolidStroke = { type: "CIMSolidStroke", effects: [ @@ -101,21 +44,17 @@ const strokeSymbolLayer: __esri.CIMSolidStroke = { dashTemplate: [5, 3], lineDashEnding: "NoConstraint", offsetAlongLine: 0, - // controlPointEnding: "NoConstraint", }, ], enable: true, colorLocked: true, capStyle: "Butt", joinStyle: "Round", - // lineStyle3D: "Strip", miterLimit: 4, width: 2, - // height3D: 1, - // anchor3D: "Center", color: [255, 100, 100, 255], }; -const cimLineSymbol: __esri.CIMLineSymbol = { +const cimOffsetAndMilepostLineSymbol: __esri.CIMLineSymbol = { type: "CIMLineSymbol", symbolLayers: [ { @@ -130,17 +69,53 @@ const cimLineSymbol: __esri.CIMLineSymbol = { strokeSymbolLayer, ], }; -const cimSymbol = new CIMSymbol({ + +const cimLineSegmentLineSymbol: __esri.CIMLineSymbol = { + type: "CIMLineSymbol", + symbolLayers: [ + cimVectorMarker, + segmentEndpointCimVectorMarker, + { + type: "CIMSolidStroke", + color: highwaySignBackgroundColor.toJSON(), + enable: true, + width: 3, + }, + ], +}; + +const offsetAndMilepostCimSymbol = new CIMSymbol({ data: { - primitiveOverrides, + primitiveOverrides: [milepostLabelPrimitiveOverride], type: "CIMSymbolReference", - symbol: cimLineSymbol, + symbol: cimOffsetAndMilepostLineSymbol, + }, +}); + +const lineSegmentCimSymbol = new CIMSymbol({ + data: { + type: "CIMSymbolReference", + primitiveOverrides: [ + milepostLabelPrimitiveOverride, + endMilepostLabelPrimitiveOverride, + ], + symbol: cimLineSegmentLineSymbol, }, }); /** * Simple Renderer using a CIM symbol. */ -export default new SimpleRenderer({ - symbol: cimSymbol, +export default new UniqueValueRenderer({ + defaultSymbol: offsetAndMilepostCimSymbol, + defaultLabel: "Clicked Milepost", + valueExpression: "IIF($feature.EndSrmp != null, '1', '0')", + valueExpressionTitle: "Has an End Milepost", + uniqueValueInfos: [ + { + label: "Route Segment", + symbol: lineSegmentCimSymbol, + value: "1", + }, + ], }); diff --git a/src/layers/MilepostLayer/milepost-line-layer/index.ts b/src/layers/MilepostLayer/milepost-line-layer/index.ts index a72aa12a..6698ac44 100644 --- a/src/layers/MilepostLayer/milepost-line-layer/index.ts +++ b/src/layers/MilepostLayer/milepost-line-layer/index.ts @@ -1,7 +1,8 @@ import FeatureLayer from "@arcgis/core/layers/FeatureLayer"; -import { createPopupTemplate, fields } from ".."; +import { createPopupTemplate } from ".."; import waExtent from "../../../WAExtent"; import { objectIdFieldName } from "../../../elc/types"; +import { segmentFields as fields } from "../fields"; import MilepostOffsetLineRenderer from "./MilepostOffsetLineRenderer"; /** diff --git a/src/layers/MilepostLayer/milepost-point-layer/index.ts b/src/layers/MilepostLayer/milepost-point-layer/index.ts index b1fc67af..e427a05b 100644 --- a/src/layers/MilepostLayer/milepost-point-layer/index.ts +++ b/src/layers/MilepostLayer/milepost-point-layer/index.ts @@ -1,9 +1,10 @@ import type SpatialReference from "@arcgis/core/geometry/SpatialReference"; import FeatureLayer from "@arcgis/core/layers/FeatureLayer"; import SimpleRenderer from "@arcgis/core/renderers/SimpleRenderer"; -import { createPopupTemplate, fields } from ".."; +import { createPopupTemplate } from ".."; import waExtent from "../../../WAExtent"; import { objectIdFieldName } from "../../../elc/types"; +import { fields } from "../fields"; import { milepostSymbol } from "../symbol"; /** diff --git a/src/layers/MilepostLayer/symbol/index.ts b/src/layers/MilepostLayer/symbol/index.ts index d83c728d..a2b6f69c 100644 --- a/src/layers/MilepostLayer/symbol/index.ts +++ b/src/layers/MilepostLayer/symbol/index.ts @@ -1,17 +1,28 @@ import CIMSymbol from "@arcgis/core/symbols/CIMSymbol"; +import { + endMilepostLabelPrimitiveOverride, + milepostLabelPrimitiveOverride, +} from "./primitiveOverrides"; -export const primitiveOverrides: __esri.PrimitiveOverride[] = [ - { - primitiveName: "milepostLabel", - propertyName: "textString", - type: "CIMPrimitiveOverride", - valueExpressionInfo: { - expression: "`${$feature.Route}\\n${$feature.SRMP}${$feature.Back}`", - type: "CIMExpressionInfo", - returnType: "String", - }, +const cimCallout: __esri.CIMBackgroundCallout = { + type: "CIMBackgroundCallout", + backgroundSymbol: { + type: "CIMPolygonSymbol", + symbolLayers: [ + { + type: "CIMSolidFill", + color: [1, 115, 92, 255], + enable: true, + }, + { + type: "CIMSolidStroke", + color: [255, 255, 255, 255], + width: 1, + enable: true, + }, + ], }, -]; +}; const cimTextSymbol: __esri.CIMTextSymbol = { type: "CIMTextSymbol", angle: 0, @@ -37,33 +48,22 @@ const cimTextSymbol: __esri.CIMTextSymbol = { symbolLayers: [{ type: "CIMSolidFill", enable: true, color: [0, 0, 0, 0] }], }, verticalAlignment: "Baseline", - callout: { - type: "CIMBackgroundCallout", - backgroundSymbol: { - type: "CIMPolygonSymbol", - symbolLayers: [ - { - type: "CIMSolidFill", - color: [1, 115, 92, 255], - enable: true, - }, - { - type: "CIMSolidStroke", - color: [0, 0, 0, 0], - width: 1, - enable: true, - }, - ], - }, - }, + callout: cimCallout, }; const cimMarkerGraphic: __esri.CIMMarkerGraphic = { type: "CIMMarkerGraphic", geometry: { x: 0, y: 0 }, primitiveName: "milepostLabel", symbol: cimTextSymbol, - textString: "000SPABCDEF\n0000.00B", + textString: " ", }; + +const segmentEndpointCimMarkerGraphic: __esri.CIMMarkerGraphic = { + ...cimMarkerGraphic, + primitiveName: "endMilepostLabel", + textString: " ", +}; + export const cimVectorMarker: __esri.CIMVectorMarker = { type: "CIMVectorMarker", enable: true, @@ -74,18 +74,57 @@ export const cimVectorMarker: __esri.CIMVectorMarker = { scaleSymbolsProportionally: true, respectFrame: true, }; + +export const segmentStartpointCimVectorMarker: __esri.CIMVectorMarker = { + ...cimVectorMarker, + markerGraphics: [cimMarkerGraphic], + markerPlacement: { + type: "CIMMarkerPlacementAtExtremities", + extremityPlacement: "JustBegin", + }, +}; + +export const segmentEndpointCimVectorMarker: __esri.CIMVectorMarker = { + ...cimVectorMarker, + markerGraphics: [segmentEndpointCimMarkerGraphic], + markerPlacement: { + type: "CIMMarkerPlacementAtExtremities", + extremityPlacement: "JustEnd", + }, +}; + const cimPointSymbol: __esri.CIMPointSymbol = { type: "CIMPointSymbol", symbolLayers: [cimVectorMarker], scaleX: 1, angleAlignment: "Display", }; + +const endpointCimPointSymbol: __esri.CIMPointSymbol = { + ...cimPointSymbol, + symbolLayers: [segmentEndpointCimVectorMarker], +}; + export const milepostSymbol = new CIMSymbol({ data: { - primitiveOverrides, + primitiveOverrides: [milepostLabelPrimitiveOverride], type: "CIMSymbolReference", symbol: cimPointSymbol, }, }); -export default milepostSymbol; +export const endpointMilepostSymbol = new CIMSymbol({ + data: { + primitiveOverrides: [ + milepostLabelPrimitiveOverride, + endMilepostLabelPrimitiveOverride, + ], + type: "CIMSymbolReference", + symbol: endpointCimPointSymbol, + }, +}); + +/* __PURE__ */ console.debug( + "endMilepostSymbol", + endpointMilepostSymbol.toJSON(), +); diff --git a/src/layers/MilepostLayer/symbol/primitiveOverrides.ts b/src/layers/MilepostLayer/symbol/primitiveOverrides.ts new file mode 100644 index 00000000..4733baf8 --- /dev/null +++ b/src/layers/MilepostLayer/symbol/primitiveOverrides.ts @@ -0,0 +1,39 @@ +/** + * The expression info for the primitive override for the milepost label symbol. + * This will be used on the milepost line layer. + */ +const beginMilepostExpressionInfo = { + expression: "`${$feature.Route}\\n${$feature.SRMP}${$feature.Back}`", + type: "CIMExpressionInfo", + returnType: "String", +} as const; + +/** + * The expression info for the primitive override for the end milepost label symbol. + * This will be used on the route segment line layer. + */ +const endMilepostExpressionInfo = { + ...beginMilepostExpressionInfo, + expression: "`${$feature.Route}\\n${$feature.EndSrmp}${$feature.EndBack}`", +} as const; + +/** + * The primitive override for the milepost label symbol. + * This will be used on the milepost line layer. + */ +export const milepostLabelPrimitiveOverride = { + primitiveName: "milepostLabel", + propertyName: "textString", + type: "CIMPrimitiveOverride", + valueExpressionInfo: beginMilepostExpressionInfo, +} as const; + +/** + * The primitive override for the end milepost label symbol. + * This will be used on the route segment line layer. + */ +export const endMilepostLabelPrimitiveOverride = { + ...milepostLabelPrimitiveOverride, + primitiveName: "endMilepostLabel", + valueExpressionInfo: endMilepostExpressionInfo, +} as const; diff --git a/src/main.ts b/src/main.ts index 57930563..c41d7b0e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -57,7 +57,6 @@ let analytics: AnalyticsInstance | null = null; import("./setupAnalytics") .then(({ default: a }) => { - /* __PURE__ */ console.debug("Tag Manager loaded", a); analytics = a; analytics?.page(); }) @@ -112,10 +111,8 @@ const updateNonProductionTitle = () => { const environment = getHostEnvironment(); // Exit if non-production environment was not detected. if (!environment) { - /* __PURE__ */ console.debug("No non-production environment detected."); return environment; } - /* __PURE__ */ console.debug(`Non production environment: ${environment}`); const suffix = ` - ${environment}`; document.title += suffix; @@ -161,9 +158,67 @@ import("@arcgis/core/kernel") import("@arcgis/core/config") .then(({ default: config }) => { config.applicationName = import.meta.env.VITE_TITLE; - config.log.level = "error"; - // TODO: Once all production environment issues have been fixed, replace above line 👆 with the one below 👇. - // config.log.level = import.meta.env.DEV ? "info" : "error"; + config.log.level = import.meta.env.DEV + ? "info" + : import.meta.env.PROD + ? "none" + : "warn"; + + if (!config.log.interceptors) { + config.log.interceptors = []; + } + + config.log.interceptors.push((level, module, ...args) => { + let logFunction: + | typeof console.log + | typeof console.error + | typeof console.warn; + switch (level) { + case "error": + logFunction = console.error; + break; + case "warn": + logFunction = console.warn; + break; + default: + logFunction = console.log; + break; + } + /* __PURE__ */ logFunction("intercepted log", { level, module, args }); + + if ( + level === "error" && + module === "esri.widgets.Feature.support.arcadeFeatureUtils" + ) { + console.group(module); + const [errorType, errorInfo] = args as [ + string, + Record & { + error: Error; + expressionInfo: __esri.ExpressionInfo; + graphic: __esri.Graphic; + }, + ]; + + const { error, expressionInfo, graphic } = errorInfo; + + const { name: expressionName, expression } = expressionInfo; + + console.error(errorType, { + ...errorInfo, + error: error.message, + errorName: error.name, + expressionName, + expression, + graphic: graphic.toJSON(), + }); + console.log(expression); + console.groupEnd(); + return true; + } + + return false; + }); }) .catch((reason: unknown) => { console.error("Failed to setup app config", reason); @@ -628,39 +683,60 @@ if (!testWebGL2Support()) { }); } - // Once the milepost layerview has been created, check for ELC data from the URL - // and, if present, add the location to the map. - milepostPointLayer.on("layerview-create", () => { - /** - * Calls the ELC API to retrieve graphics from the URL and adds them to the milepost layer. - * @returns A promise that resolves when the graphics have been added to the layer and the view has been updated. - */ - const callElc = async () => { - const elcGraphics = await callElcFromUrl(milepostPointLayer); - if (elcGraphics) { - const addedFeatures = await addGraphicsToLayer( + Promise.all([milepostPointLayer.when(), milepostLineLayer.when()]).then( + () => { + /** + * Calls the ELC API to retrieve graphics from the URL and adds them to the milepost layer. + * @returns A promise that resolves when the graphics have been added to the layer and the view has been updated. + */ + const callElc = async () => { + // Call the features from the URL and add them to the layer. + const addedFeatures = await callElcFromUrl( milepostPointLayer, - elcGraphics, + milepostLineLayer, ); - const scale = Number.parseFloat(import.meta.env.VITE_ZOOM_SCALE); - const viewpoint = new Viewpoint({ - scale, - targetGeometry: addedFeatures.at(0)?.geometry, - }); - await view.goTo(viewpoint, { - animate: false, - }); - view - .openPopup({ - features: addedFeatures, - }) - .catch((reason: unknown) => { - console.error("Failed to open popup", reason); - }); - } - }; - callElc().catch((reason: unknown) => { - emitErrorEvent(reason); - }); - }); + if (addedFeatures) { + // Zoom to the first feature (if any are in the array). + // Only expecting to ever be a single feature present. + const feature = addedFeatures.at(0); + if (feature) { + const targetGeometry = feature?.geometry; + + /** + * The zoom target. + * + * Geometry Type | Zoom Target + * ------------------------|----------------------------------- + * point | A viewpoint with a specified scale + * polyline (or non-point) | The feature itself. + */ + let goToTarget2D: Graphic | __esri.Viewpoint = feature; + + if (targetGeometry?.type === "point") { + const scale = Number.parseFloat(import.meta.env.VITE_ZOOM_SCALE); + goToTarget2D = new Viewpoint({ + scale, + targetGeometry: targetGeometry, + }); + } + + await view.goTo(goToTarget2D, { + animate: false, + }); + } + + view + .openPopup({ + features: addedFeatures, + }) + .catch((reason: unknown) => { + console.error("Failed to open popup", reason); + }); + } + }; + callElc().catch((reason: unknown) => { + emitErrorEvent(reason); + }); + }, + ); } diff --git a/src/replace-title-with-tooltip.ts b/src/replace-title-with-tooltip.ts index b23c8f31..65c38c46 100644 --- a/src/replace-title-with-tooltip.ts +++ b/src/replace-title-with-tooltip.ts @@ -11,36 +11,23 @@ * @param parent - The parent element to search for Calcite elements. */ export function replaceTitleWithTooltip(parent = document.body) { - /* __PURE__ */ console.group("replaceTitleWithTooltip"); - try { - const elementsWithTitles = parent.querySelectorAll("[title]"); - /* __PURE__ */ console.debug( - `Found ${elementsWithTitles.length} elements with titles`, - elementsWithTitles, - ); - for (const element of elementsWithTitles) { - // Skip non-calcite elements. - if ( - !/^calcite-/i.test(element.tagName) || - element.tagName === "CALCITE-COMBOBOX" - ) { - /* __PURE__ */ console.debug( - `Skipping non calcite element: ${element.tagName}`, - element, - ); - continue; - } + const elementsWithTitles = parent.querySelectorAll("[title]"); + for (const element of elementsWithTitles) { + // Skip non-calcite elements. + if ( + !/^calcite-/i.test(element.tagName) || + element.tagName === "CALCITE-COMBOBOX" + ) { + continue; + } - const { title } = element; + const { title } = element; - const tooltip = document.createElement("calcite-tooltip"); - tooltip.referenceElement = element; - tooltip.append(title); - element.removeAttribute("title"); - parent.append(tooltip); - } - } finally { - /* __PURE__ */ console.groupEnd(); + const tooltip = document.createElement("calcite-tooltip"); + tooltip.referenceElement = element; + tooltip.append(title); + element.removeAttribute("title"); + parent.append(tooltip); } } diff --git a/src/setupPopupActions.ts b/src/setupPopupActions.ts index ef20abdd..7f788270 100644 --- a/src/setupPopupActions.ts +++ b/src/setupPopupActions.ts @@ -47,7 +47,6 @@ export function setupPopupActions(view: __esri.MapView) { navigator.clipboard .writeText([y, x].join(",")) .then(() => { - /* __PURE__ */ console.debug("Copied coordinates to clipboard."); alert.open = true; }) .catch((error: unknown) => { @@ -61,7 +60,6 @@ export function setupPopupActions(view: __esri.MapView) { const popupTriggerActionEventHandler: __esri.PopupTriggerActionEventHandler = (event) => { - /* __PURE__ */ console.debug("trigger-action", event); if (event.action.id === "copy") { const feature = view.popup.selectedFeature; if (isPoint(feature.geometry)) { diff --git a/tools/create-cim.ts b/tools/create-cim.ts index b8f01c36..c1cf6b00 100644 --- a/tools/create-cim.ts +++ b/tools/create-cim.ts @@ -1,18 +1,17 @@ -import TextSymbol from "@arcgis/core/symbols/TextSymbol"; -import { convertToCIMSymbol } from "@arcgis/core/symbols/support/cimConversionUtils"; -import { - highwaySignBackgroundColor, - highwaySignTextColor, -} from "../src/colors"; +/** + * This script creates a CIM symbol for a milepost marker. + * @example + * ``` + * node --import=tsx ./tools/create-cim.ts > milepost.cim.json + * ``` + * or + * ``` + * tsx ./tools/create-cim.ts > milepost.cim.json + */ -const simpleSymbol = new TextSymbol({ - color: highwaySignTextColor, - backgroundColor: highwaySignBackgroundColor, - text: "000SPABCDEF\n0000.00B", -}); +import { createMilepostCimSymbol } from "../src/layers/MilepostLayer/create-cim.ts"; -const cimSymbol = convertToCIMSymbol( - simpleSymbol as unknown as __esri.SimpleMarkerSymbol, -); +// Create a text symbol with a background. +const cimSymbol = createMilepostCimSymbol(); -console.log(JSON.stringify(cimSymbol.toJSON())); +console.log(JSON.stringify(cimSymbol.toJSON(), null, 2));