diff --git a/package-lock.json b/package-lock.json
index f26b9ce326900be7eca94c42daaa71ebb38b972d..d1a9606f6b7a88688cace3c1d975b2189bd48cf9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -18,10 +18,12 @@
         "@angular/platform-browser": "19.2.1",
         "@angular/platform-browser-dynamic": "19.2.1",
         "@angular/router": "19.2.1",
+        "@arcgis/core": "^4.32.9",
+        "@arcgis/map-components": "^4.32.12",
         "@bluehalo/ngx-leaflet": "^19.0.0",
         "@compodoc/compodoc": "^1.1.26",
         "@ghsc/disagg-d3": "^0.13.0",
-        "@ghsc/nshmp-lib-ng": "^19.8.0",
+        "@ghsc/nshmp-lib-ng": "^19.9.0",
         "@ghsc/nshmp-template": "^19.5.0",
         "@ghsc/nshmp-utils-ts": "^3.14.1",
         "angular-plotly.js": "^6.0.0",
@@ -910,6 +912,96 @@
         "rxjs": "^6.5.3 || ^7.4.0"
       }
     },
+    "node_modules/@arcgis/components-controllers": {
+      "version": "4.32.12",
+      "resolved": "https://registry.npmjs.org/@arcgis/components-controllers/-/components-controllers-4.32.12.tgz",
+      "integrity": "sha512-giGr//q8lyokcwvL7hNi+u9NQZtld5tUHu7FwOyJEGn2Dh84L4E3hFs+arJWMu30iWDcxhJQT6tGuGw2m3phCg==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@arcgis/components-utils": "4.32.12",
+        "tslib": "^2.7.0"
+      }
+    },
+    "node_modules/@arcgis/components-utils": {
+      "version": "4.32.12",
+      "resolved": "https://registry.npmjs.org/@arcgis/components-utils/-/components-utils-4.32.12.tgz",
+      "integrity": "sha512-qETwTNoSUH6DDQCMawXHxcCPdyc+KvrYaBfL6+2mABJGyfAEfnlc5IwV/p0ooPlKesZ/YrQt6nsmKhSEdzkFqw==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "tslib": "^2.7.0"
+      }
+    },
+    "node_modules/@arcgis/core": {
+      "version": "4.32.9",
+      "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.32.9.tgz",
+      "integrity": "sha512-w174cWsIkE6fsalkwFnqErO2saGB1lZcCYMC2yVCaaj50N7PM4brSNc5Myb7OWtDWsTNQPbkVSYW7d96iqNpHA==",
+      "license": "SEE LICENSE IN copyright.txt",
+      "dependencies": {
+        "@esri/arcgis-html-sanitizer": "~4.1.0",
+        "@esri/calcite-components": "^3.0.3",
+        "@vaadin/grid": "~24.6.4",
+        "@zip.js/zip.js": "~2.7.57",
+        "luxon": "~3.5.0",
+        "marked": "~15.0.6"
+      }
+    },
+    "node_modules/@arcgis/core-adapter": {
+      "version": "4.32.12",
+      "resolved": "https://registry.npmjs.org/@arcgis/core-adapter/-/core-adapter-4.32.12.tgz",
+      "integrity": "sha512-qDCPs6lHQNSPFmG50LAgCWJSDUlOHRvo5+BJxOJasUrpHqVy1VQeOWG1GSAJlkVaSOcUwMSszvt+PdxAOQyyjQ==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "tslib": "^2.7.0"
+      },
+      "peerDependencies": {
+        "@arcgis/core": "~4.32.0"
+      }
+    },
+    "node_modules/@arcgis/core/node_modules/marked": {
+      "version": "15.0.7",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.7.tgz",
+      "integrity": "sha512-dgLIeKGLx5FwziAnsk4ONoGwHwGPJzselimvlVskE9XLN4Orv9u2VA3GWw/lYUqjfA0rUT/6fqKwfZJapP9BEg==",
+      "license": "MIT",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/@arcgis/lumina": {
+      "version": "4.32.12",
+      "resolved": "https://registry.npmjs.org/@arcgis/lumina/-/lumina-4.32.12.tgz",
+      "integrity": "sha512-zYPnMK0dlkzYwwcPZik5jHIlx1VpZrDWarkrZtbqypXyEyq7SOUzVcuUHOL2ErlpyWW8ipS2oRstAQ9sGRtr2w==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@arcgis/components-controllers": "4.32.12",
+        "@arcgis/components-utils": "4.32.12",
+        "@lit-labs/ssr": "^3.2.2",
+        "@lit-labs/ssr-client": "^1.1.7",
+        "@lit/context": "^1.1.3",
+        "csstype": "^3.1.3",
+        "lit": "^3.2.0",
+        "tslib": "^2.7.0"
+      }
+    },
+    "node_modules/@arcgis/map-components": {
+      "version": "4.32.12",
+      "resolved": "https://registry.npmjs.org/@arcgis/map-components/-/map-components-4.32.12.tgz",
+      "integrity": "sha512-14dUa4I3Chq50uSvBLEQBExuMCVHGRNCGVUF+1aG5VlUlf967Rdus+g9xc2+h8gZBkPMAXon1IscirGaSk8l3A==",
+      "license": "SEE LICENSE IN LICENSE.md",
+      "dependencies": {
+        "@arcgis/components-controllers": "4.32.12",
+        "@arcgis/components-utils": "4.32.12",
+        "@arcgis/core-adapter": "4.32.12",
+        "@arcgis/lumina": "4.32.12",
+        "tslib": "^2.7.0"
+      },
+      "peerDependencies": {
+        "@arcgis/core": "~4.32.0",
+        "@esri/calcite-components": "^3.0.3"
+      }
+    },
     "node_modules/@aws-cdk/asset-awscli-v1": {
       "version": "2.2.211",
       "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.211.tgz",
@@ -4079,6 +4171,89 @@
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
+    "node_modules/@esri/arcgis-html-sanitizer": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.1.0.tgz",
+      "integrity": "sha512-einEveDJ/k1180NOp78PB/4Hje9eBy3dyOGLLtLn6bSkizpUfCwuYBIXOA7Y3F/k/BsTQXgKqUVwQ0eiscWMdA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "xss": "1.0.13"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/@esri/calcite-components": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-3.0.3.tgz",
+      "integrity": "sha512-MTaNCQuxFe2VkCUzeQ3CG3i5SND/fH/hr8lmcgemPMcqRZBTx4xHE/PRBZ2nLS1jgjgMJT1Qd+W3MBQpfsB1eQ==",
+      "license": "SEE LICENSE.md",
+      "dependencies": {
+        "@arcgis/components-controllers": "^4.32.0-next.129",
+        "@arcgis/components-utils": "^4.32.0-next.129",
+        "@arcgis/lumina": "^4.32.0-next.129",
+        "@esri/calcite-ui-icons": "4.0.0",
+        "@floating-ui/dom": "^1.6.12",
+        "@floating-ui/utils": "^0.2.8",
+        "@types/color": "^4.2.0",
+        "@types/sortablejs": "^1.15.8",
+        "color": "^4.2.3",
+        "composed-offset-position": "^0.0.6",
+        "dayjs": "^1.11.13",
+        "focus-trap": "^7.6.2",
+        "interactjs": "^1.10.27",
+        "lodash-es": "^4.17.21",
+        "sortablejs": "^1.15.6",
+        "timezone-groups": "^0.10.4",
+        "type-fest": "^4.30.1"
+      }
+    },
+    "node_modules/@esri/calcite-components/node_modules/type-fest": {
+      "version": "4.37.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz",
+      "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==",
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@esri/calcite-ui-icons": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@esri/calcite-ui-icons/-/calcite-ui-icons-4.0.0.tgz",
+      "integrity": "sha512-LcL35NydvXI93u/pU6fXXg/kY2LXR5zWEvOytDoqgu1GPL7xgvrYuIutkvuDJpDh3PhcGXsCX4Axw5i6sCEXsA==",
+      "license": "SEE LICENSE.md",
+      "bin": {
+        "spriter": "bin/spriter.js"
+      }
+    },
+    "node_modules/@floating-ui/core": {
+      "version": "1.6.9",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
+      "integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.6.13",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
+      "integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.6.0",
+        "@floating-ui/utils": "^0.2.9"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
+      "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
+      "license": "MIT"
+    },
     "node_modules/@ghsc/disagg-d3": {
       "version": "0.13.0",
       "resolved": "https://code.usgs.gov/api/v4/projects/4335/packages/npm/@ghsc/disagg-d3/-/@ghsc/disagg-d3-0.13.0.tgz",
@@ -4089,9 +4264,9 @@
       }
     },
     "node_modules/@ghsc/nshmp-lib-ng": {
-      "version": "19.8.0",
-      "resolved": "https://code.usgs.gov/api/v4/projects/12416/packages/npm/@ghsc/nshmp-lib-ng/-/@ghsc/nshmp-lib-ng-19.8.0.tgz",
-      "integrity": "sha1-LSMaTWiPWlUMb/Yp3VDjVKg48dc=",
+      "version": "19.9.0",
+      "resolved": "https://code.usgs.gov/api/v4/projects/12416/packages/npm/@ghsc/nshmp-lib-ng/-/@ghsc/nshmp-lib-ng-19.9.0.tgz",
+      "integrity": "sha1-tJNjWcqLHh4YlnjxdYPqe8zP2rE=",
       "dependencies": {
         "tslib": "^2.3.0"
       },
@@ -4510,6 +4685,12 @@
         }
       }
     },
+    "node_modules/@interactjs/types": {
+      "version": "1.10.27",
+      "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz",
+      "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==",
+      "license": "MIT"
+    },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -5265,6 +5446,69 @@
         "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
       }
     },
+    "node_modules/@lit-labs/ssr": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@lit-labs/ssr/-/ssr-3.3.1.tgz",
+      "integrity": "sha512-JlF1PempxvzrGEpRFrF+Ki0MHzR3HA51SK8Zv0cFpW9p0bPW4k0FeCwrElCu371UEpXF7RcaE2wgYaE1az0XKg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@lit-labs/ssr-client": "^1.1.7",
+        "@lit-labs/ssr-dom-shim": "^1.3.0",
+        "@lit/reactive-element": "^2.0.4",
+        "@parse5/tools": "^0.3.0",
+        "@types/node": "^16.0.0",
+        "enhanced-resolve": "^5.10.0",
+        "lit": "^3.1.2",
+        "lit-element": "^4.0.4",
+        "lit-html": "^3.1.2",
+        "node-fetch": "^3.2.8",
+        "parse5": "^7.1.1"
+      },
+      "engines": {
+        "node": ">=13.9.0"
+      }
+    },
+    "node_modules/@lit-labs/ssr-client": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/@lit-labs/ssr-client/-/ssr-client-1.1.7.tgz",
+      "integrity": "sha512-VvqhY/iif3FHrlhkzEPsuX/7h/NqnfxLwVf0p8ghNIlKegRyRqgeaJevZ57s/u/LiFyKgqksRP5n+LmNvpxN+A==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@lit/reactive-element": "^2.0.4",
+        "lit": "^3.1.2",
+        "lit-html": "^3.1.2"
+      }
+    },
+    "node_modules/@lit-labs/ssr-dom-shim": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz",
+      "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@lit-labs/ssr/node_modules/@types/node": {
+      "version": "16.18.126",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz",
+      "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==",
+      "license": "MIT"
+    },
+    "node_modules/@lit/context": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.4.tgz",
+      "integrity": "sha512-0b8wOWNUPcXjGHFtVP+odwhrZBZw+PpCjKWn8IGO10iHT95Xd6FcUAxe1aE7PUtOBvHZoxvrfdBzweYnDW7VNQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@lit/reactive-element": "^1.6.2 || ^2.0.0"
+      }
+    },
+    "node_modules/@lit/reactive-element": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz",
+      "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@lit-labs/ssr-dom-shim": "^1.2.0"
+      }
+    },
     "node_modules/@lmdb/lmdb-darwin-arm64": {
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz",
@@ -6691,6 +6935,12 @@
       "dev": true,
       "license": "BSD-3-Clause"
     },
+    "node_modules/@open-wc/dedupe-mixin": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz",
+      "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==",
+      "license": "MIT"
+    },
     "node_modules/@parcel/watcher": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
@@ -6771,6 +7021,15 @@
       "license": "MIT",
       "optional": true
     },
+    "node_modules/@parse5/tools": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/@parse5/tools/-/tools-0.3.0.tgz",
+      "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==",
+      "license": "MIT",
+      "dependencies": {
+        "parse5": "^7.0.0"
+      }
+    },
     "node_modules/@phenomnomnominal/tsquery": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz",
@@ -6937,6 +7196,15 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@polymer/polymer": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.5.2.tgz",
+      "integrity": "sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@webcomponents/shadycss": "^1.9.1"
+      }
+    },
     "node_modules/@rollup/plugin-json": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz",
@@ -7723,6 +7991,30 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/color": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@types/color/-/color-4.2.0.tgz",
+      "integrity": "sha512-6+xrIRImMtGAL2X3qYkd02Mgs+gFGs+WsK0b7VVMaO4mYRISwyTjcqNrO0mNSmYEoq++rSLDB2F5HDNmqfOe+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/color-convert": "*"
+      }
+    },
+    "node_modules/@types/color-convert": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.4.tgz",
+      "integrity": "sha512-Ub1MmDdyZ7mX//g25uBAoH/mWGd9swVbt8BseymnaE18SU4po/PjmCrHxqIIRjBo3hV/vh1KGr0eMxUhp+t+dQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/color-name": "^1.1.0"
+      }
+    },
+    "node_modules/@types/color-name": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.5.tgz",
+      "integrity": "sha512-j2K5UJqGTxeesj6oQuGpMgifpT5k9HprgQd8D1Y0lOFqKHl3PJu5GMeS4Y5EgjS55AE6OQxf8mPED9uaGbf4Cg==",
+      "license": "MIT"
+    },
     "node_modules/@types/connect": {
       "version": "3.4.38",
       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
@@ -8118,6 +8410,12 @@
         "@types/node": "*"
       }
     },
+    "node_modules/@types/sortablejs": {
+      "version": "1.15.8",
+      "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+      "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==",
+      "license": "MIT"
+    },
     "node_modules/@types/stack-utils": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
@@ -8170,6 +8468,12 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@types/trusted-types": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+      "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+      "license": "MIT"
+    },
     "node_modules/@types/webxr": {
       "version": "0.5.20",
       "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz",
@@ -8431,6 +8735,187 @@
       "dev": true,
       "license": "ISC"
     },
+    "node_modules/@vaadin/a11y-base": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.6.7.tgz",
+      "integrity": "sha512-CJYYTWPBEEaVt4AvBE8RzEn3hqUZbGUGLzqs6NGBFTw0c5cfkqoO2ZMkKhz5Z52QF+2mCXpEtyg6s+t0h171Qg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/component-base": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/checkbox": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.6.7.tgz",
+      "integrity": "sha512-/Vl5codokNdN5ku1l/iAkdjUmYTUZGKyAleHjM7V3ZFpwkK2IoWN4HrbWyhPuf1gL3T85bKMLSPuYoOX/ymrFw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/a11y-base": "~24.6.7",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/field-base": "~24.6.7",
+        "@vaadin/vaadin-lumo-styles": "~24.6.7",
+        "@vaadin/vaadin-material-styles": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/component-base": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.6.7.tgz",
+      "integrity": "sha512-LcZQZEwouPDHBoXfXRREb1mRScsPSPeKTUZdgrXh180Piy57VzpNzslIMrdfVFSye9lLMs2/g2o8HCUDgnY/OQ==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/vaadin-development-mode-detector": "^2.0.0",
+        "@vaadin/vaadin-usage-statistics": "^2.1.0",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/field-base": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.6.7.tgz",
+      "integrity": "sha512-5MXpAQGZA15/hRdnZrJK5q5Mv8rgOraSyBpC/gjRJ1W1IQ5DrCcb3ltvPATguv0K3vpJwunXGXrGqm/+SGEk0w==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/a11y-base": "~24.6.7",
+        "@vaadin/component-base": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/grid": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.6.7.tgz",
+      "integrity": "sha512-G3o+T0A995GEqiTbdPvmEYQEVA69pwLq5L8A5qw6q+onbyEFAbJEpRz/r9IcxgnD5yYDmsXVSNFTTVU6NKAYUw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/a11y-base": "~24.6.7",
+        "@vaadin/checkbox": "~24.6.7",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/lit-renderer": "~24.6.7",
+        "@vaadin/text-field": "~24.6.7",
+        "@vaadin/vaadin-lumo-styles": "~24.6.7",
+        "@vaadin/vaadin-material-styles": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/icon": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.6.7.tgz",
+      "integrity": "sha512-+Cv3hLyFSXJAhnuGuPQ+hQcv9/ijZpIprJ6rqWeChvFk+bQOoPgUPx/tj67mOiTcrmV5hYt+dYs4QM7JZ//dGg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/vaadin-lumo-styles": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/input-container": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.6.7.tgz",
+      "integrity": "sha512-376ZyD74jrKvjiM+gE0xNScyZPU7REMBbGXpmM4DpoLYgw60m01D3fliZaOTVDyXc3gvxWIai3L1vCY0KYpD6w==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/vaadin-lumo-styles": "~24.6.7",
+        "@vaadin/vaadin-material-styles": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/lit-renderer": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.6.7.tgz",
+      "integrity": "sha512-S9daJnGW/X+HBhOriENRYNf8hCFYABmea756onaLS0QoWLkaU3QVPKrhHjZtzNVf/15UcIeAx4C5JlIas2osFA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/text-field": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.6.7.tgz",
+      "integrity": "sha512-34YmuH6+F0qDyiNTcMtTsU3+xMWiOfPi4630DBJ8+99J+GBHIGt4BZB0QRrEfpiPWVbykVg27MGUP4KVTfH8Uw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/a11y-base": "~24.6.7",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/field-base": "~24.6.7",
+        "@vaadin/input-container": "~24.6.7",
+        "@vaadin/vaadin-lumo-styles": "~24.6.7",
+        "@vaadin/vaadin-material-styles": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/vaadin-development-mode-detector": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz",
+      "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/@vaadin/vaadin-lumo-styles": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.6.7.tgz",
+      "integrity": "sha512-DNamU8cVxbaVn3HfRm3pN8ul95xvaem92ByVeEQwdvKaHwLI4m7AdSWKEA+13ST9TdBtCeDW6DjmtGcoEqbqiw==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/icon": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7"
+      }
+    },
+    "node_modules/@vaadin/vaadin-material-styles": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.6.7.tgz",
+      "integrity": "sha512-7ecHOEZrFEbUz5UVSGapOt/uC7lSYV05RADCNhG16c+WsuN+oxkGIIaThMMCdBcclg5ej/BeTxZlZha8JoNO3g==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@polymer/polymer": "^3.0.0",
+        "@vaadin/component-base": "~24.6.7",
+        "@vaadin/vaadin-themable-mixin": "~24.6.7"
+      }
+    },
+    "node_modules/@vaadin/vaadin-themable-mixin": {
+      "version": "24.6.7",
+      "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.6.7.tgz",
+      "integrity": "sha512-fiVBvJWInNBq/oXeE0UAQmzadQ7UJE3ns768D1taKOwTMOxiio1UMoUXcVGwni9ASzXrd96S7F6c4aIaVqNx6A==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@open-wc/dedupe-mixin": "^1.3.0",
+        "lit": "^3.0.0"
+      }
+    },
+    "node_modules/@vaadin/vaadin-usage-statistics": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz",
+      "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==",
+      "hasInstallScript": true,
+      "license": "Apache-2.0",
+      "dependencies": {
+        "@vaadin/vaadin-development-mode-detector": "^2.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      }
+    },
     "node_modules/@vitejs/plugin-basic-ssl": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz",
@@ -8590,6 +9075,12 @@
         "@xtuc/long": "4.2.2"
       }
     },
+    "node_modules/@webcomponents/shadycss": {
+      "version": "1.11.2",
+      "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz",
+      "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==",
+      "license": "BSD-3-Clause"
+    },
     "node_modules/@webgpu/types": {
       "version": "0.1.51",
       "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.51.tgz",
@@ -8661,6 +9152,17 @@
       "dev": true,
       "license": "BSD-3-Clause"
     },
+    "node_modules/@zip.js/zip.js": {
+      "version": "2.7.57",
+      "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.57.tgz",
+      "integrity": "sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "bun": ">=0.7.0",
+        "deno": ">=1.0.0",
+        "node": ">=16.5.0"
+      }
+    },
     "node_modules/@zkochan/js-yaml": {
       "version": "0.0.7",
       "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz",
@@ -11142,6 +11644,19 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/color": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1",
+        "color-string": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=12.5.0"
+      }
+    },
     "node_modules/color-alpha": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz",
@@ -11237,6 +11752,16 @@
         "mumath": "^3.3.4"
       }
     },
+    "node_modules/color-string": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
     "node_modules/color-support": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
@@ -11322,6 +11847,15 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/composed-offset-position": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz",
+      "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@floating-ui/utils": "^0.2.5"
+      }
+    },
     "node_modules/compressible": {
       "version": "2.0.18",
       "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -11862,6 +12396,12 @@
         "node": ">=4"
       }
     },
+    "node_modules/cssfilter": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz",
+      "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==",
+      "license": "MIT"
+    },
     "node_modules/cssom": {
       "version": "0.5.0",
       "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
@@ -11889,6 +12429,12 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "license": "MIT"
+    },
     "node_modules/cypress": {
       "version": "13.16.1",
       "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.16.1.tgz",
@@ -12629,6 +13175,15 @@
         "node": ">=0.10"
       }
     },
+    "node_modules/data-uri-to-buffer": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
     "node_modules/data-urls": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
@@ -12702,7 +13257,6 @@
       "version": "1.11.13",
       "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
       "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
-      "dev": true,
       "license": "MIT"
     },
     "node_modules/debounce": {
@@ -15315,6 +15869,29 @@
         }
       }
     },
+    "node_modules/fetch-blob": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
+      },
+      "engines": {
+        "node": "^12.20 || >= 14.13"
+      }
+    },
     "node_modules/fflate": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
@@ -15510,6 +16087,15 @@
         "dtype": "^2.0.0"
       }
     },
+    "node_modules/focus-trap": {
+      "version": "7.6.4",
+      "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz",
+      "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==",
+      "license": "MIT",
+      "dependencies": {
+        "tabbable": "^6.2.0"
+      }
+    },
     "node_modules/follow-redirects": {
       "version": "1.15.9",
       "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
@@ -15599,6 +16185,18 @@
         "node": ">= 6"
       }
     },
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+      "license": "MIT",
+      "dependencies": {
+        "fetch-blob": "^3.1.2"
+      },
+      "engines": {
+        "node": ">=12.20.0"
+      }
+    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -17596,6 +18194,15 @@
       "dev": true,
       "license": "0BSD"
     },
+    "node_modules/interactjs": {
+      "version": "1.10.27",
+      "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz",
+      "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==",
+      "license": "MIT",
+      "dependencies": {
+        "@interactjs/types": "1.10.27"
+      }
+    },
     "node_modules/internal-slot": {
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
@@ -20001,6 +20608,37 @@
         "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
       }
     },
+    "node_modules/lit": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz",
+      "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@lit/reactive-element": "^2.0.4",
+        "lit-element": "^4.1.0",
+        "lit-html": "^3.2.0"
+      }
+    },
+    "node_modules/lit-element": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz",
+      "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@lit-labs/ssr-dom-shim": "^1.2.0",
+        "@lit/reactive-element": "^2.0.4",
+        "lit-html": "^3.2.0"
+      }
+    },
+    "node_modules/lit-html": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz",
+      "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@types/trusted-types": "^2.0.2"
+      }
+    },
     "node_modules/lmdb": {
       "version": "3.2.6",
       "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz",
@@ -20069,6 +20707,12 @@
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
       "license": "MIT"
     },
+    "node_modules/lodash-es": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+      "license": "MIT"
+    },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -20348,6 +20992,15 @@
       "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
       "license": "MIT"
     },
+    "node_modules/luxon": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz",
+      "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/macos-release": {
       "version": "2.5.1",
       "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz",
@@ -22069,6 +22722,43 @@
       "license": "MIT",
       "optional": true
     },
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=10.5.0"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "license": "MIT",
+      "dependencies": {
+        "data-uri-to-buffer": "^4.0.0",
+        "fetch-blob": "^3.1.4",
+        "formdata-polyfill": "^4.0.10"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/node-fetch"
+      }
+    },
     "node_modules/node-forge": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -25831,6 +26521,21 @@
         "node": "^18.17.0 || >=20.5.0"
       }
     },
+    "node_modules/simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
+    "node_modules/simple-swizzle/node_modules/is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+      "license": "MIT"
+    },
     "node_modules/sirv": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
@@ -25956,6 +26661,12 @@
         "node": ">= 14"
       }
     },
+    "node_modules/sortablejs": {
+      "version": "1.15.6",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz",
+      "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==",
+      "license": "MIT"
+    },
     "node_modules/source-map": {
       "version": "0.7.4",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
@@ -26623,6 +27334,12 @@
         "url": "https://opencollective.com/unts"
       }
     },
+    "node_modules/tabbable": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+      "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+      "license": "MIT"
+    },
     "node_modules/tablesort": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/tablesort/-/tablesort-5.3.0.tgz",
@@ -26974,6 +27691,15 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/timezone-groups": {
+      "version": "0.10.4",
+      "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.10.4.tgz",
+      "integrity": "sha512-AnkJYrbb7uPkDCEqGeVJiawZNiwVlSkkeX4jZg1gTEguClhyX+/Ezn07KB6DT29tG3UN418ldmS/W6KqGOTDjg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.12.0"
+      }
+    },
     "node_modules/tiny-binary-search": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/tiny-binary-search/-/tiny-binary-search-1.0.3.tgz",
@@ -28087,6 +28813,15 @@
       "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==",
       "license": "Apache-2.0"
     },
+    "node_modules/web-streams-polyfill": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
+      "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
     "node_modules/webgl-context": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz",
@@ -28811,6 +29546,28 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/xss": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz",
+      "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==",
+      "license": "MIT",
+      "dependencies": {
+        "commander": "^2.20.3",
+        "cssfilter": "0.0.10"
+      },
+      "bin": {
+        "xss": "bin/xss"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/xss/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "license": "MIT"
+    },
     "node_modules/xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
diff --git a/package.json b/package.json
index 3d7022c3585e947b0f8d2b138b0dd8e420164e96..2007cdbfca9476c5970fd175205909356063a5e4 100644
--- a/package.json
+++ b/package.json
@@ -47,10 +47,12 @@
     "@angular/platform-browser": "19.2.1",
     "@angular/platform-browser-dynamic": "19.2.1",
     "@angular/router": "19.2.1",
+    "@arcgis/core": "^4.32.9",
+    "@arcgis/map-components": "^4.32.12",
     "@bluehalo/ngx-leaflet": "^19.0.0",
     "@compodoc/compodoc": "^1.1.26",
     "@ghsc/disagg-d3": "^0.13.0",
-    "@ghsc/nshmp-lib-ng": "^19.8.0",
+    "@ghsc/nshmp-lib-ng": "^19.9.0",
     "@ghsc/nshmp-template": "^19.5.0",
     "@ghsc/nshmp-utils-ts": "^3.14.1",
     "angular-plotly.js": "^6.0.0",
diff --git a/projects/nshmp-apps/jest.config.ts b/projects/nshmp-apps/jest.config.ts
index 394a5fb645b9007c232ba0e5b2e9fcebdba6ff88..8c158b476344411fa96945c3778a8e4500f414cb 100644
--- a/projects/nshmp-apps/jest.config.ts
+++ b/projects/nshmp-apps/jest.config.ts
@@ -16,7 +16,18 @@ const config: Config.InitialOptions = {
   setupFilesAfterEnv: ['<rootDir>/setup-jest.ts'],
   testPathIgnorePatterns: ['<rootDir>/cypress'],
   transformIgnorePatterns: [
-    'node_modules/(?!.*\\.mjs$|d3|d3-*|delaunator|robust-predicates|internmap|@ghsc/nshmp-utils-ts/node_modules/d3-format|yaml|change-case)',
+    `node_modules/(
+      ?!.*\\.mjs$|
+      d3|
+      d3-*|
+      delaunator|
+      robust-predicates|
+      internmap|
+      @ghsc/nshmp-utils-ts/node_modules/d3-format|
+      yaml|
+      change-case|
+      @arcgis/*
+    )`,
   ],
 };
 
diff --git a/projects/nshmp-apps/setup-jest.ts b/projects/nshmp-apps/setup-jest.ts
index b291248544538be1bf16d936531a16392fd5d20e..99e3d552f757c945d7a3463455776a18747d5205 100644
--- a/projects/nshmp-apps/setup-jest.ts
+++ b/projects/nshmp-apps/setup-jest.ts
@@ -32,4 +32,10 @@ Object.defineProperty(document.body.style, 'transform', {
   },
 });
 
+global.ResizeObserver = class ResizeObserver {
+  observe() {}
+  unobserve() {}
+  disconnect() {}
+};
+
 setupZoneTestEnv();
diff --git a/projects/nshmp-apps/src/app/designmaps/rtgm/components/control-panel-hazard/control-panel-hazard.component.ts b/projects/nshmp-apps/src/app/designmaps/rtgm/components/control-panel-hazard/control-panel-hazard.component.ts
index 114dffeaf12f20df4a74b699a9fc7f47c921b22c..662bfb0f437f99c2ab860a431c0d4def7b4a5c8f 100644
--- a/projects/nshmp-apps/src/app/designmaps/rtgm/components/control-panel-hazard/control-panel-hazard.component.ts
+++ b/projects/nshmp-apps/src/app/designmaps/rtgm/components/control-panel-hazard/control-panel-hazard.component.ts
@@ -19,7 +19,7 @@ import {
 } from '@ghsc/nshmp-lib-ng/nshmp';
 import {Location} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/geo';
 import {environment} from 'projects/nshmp-apps/src/environments/environment';
-import {Subscription} from 'rxjs';
+import {combineLatest, Subscription} from 'rxjs';
 
 import {AppService} from '../../services/app.service';
 import {BuildingCodeControlComponent} from '../building-code-control/building-code-control.component';
@@ -84,13 +84,20 @@ export class ControlPanelHazardComponent implements OnInit, OnDestroy {
     const controls = this.formGroup.controls;
 
     this.subs.push(
-      controls.latitude.valueChanges.subscribe(() => this.service.resetState()),
-    );
-
-    this.subs.push(
-      controls.longitude.valueChanges.subscribe(() =>
-        this.service.resetState(),
-      ),
+      combineLatest([
+        controls.latitude.valueChanges,
+        controls.longitude.valueChanges,
+      ]).subscribe(() => {
+        this.service.resetState();
+        const values = this.formGroup.getRawValue();
+
+        if (values.latitude && values.longitude) {
+          this.selectSiteData().site = {
+            latitude: values.latitude,
+            longitude: values.longitude,
+          };
+        }
+      }),
     );
 
     this.subs.push(
diff --git a/projects/nshmp-apps/src/app/dev/hazard/dynamic-compare/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/dev/hazard/dynamic-compare/components/control-panel/control-panel.component.ts
index bb37bcf16a86fdf9c32b9b1b504e74074cc27c70..dbfb553d885c797418402a3eda12ce833cab352d 100644
--- a/projects/nshmp-apps/src/app/dev/hazard/dynamic-compare/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/dev/hazard/dynamic-compare/components/control-panel/control-panel.component.ts
@@ -24,7 +24,7 @@ import {
 } from '@ghsc/nshmp-lib-ng/nshmp';
 import {NshmId} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/nshm';
 import {environment} from 'projects/nshmp-apps/src/environments/environment';
-import {Subscription} from 'rxjs';
+import {combineLatest, Subscription} from 'rxjs';
 
 import {AppService} from '../../services/app.service';
 
@@ -87,13 +87,7 @@ export class ControlPanelComponent implements OnInit, OnDestroy {
     () => this.service.usage()?.response?.model.siteClasses,
   );
 
-  private imtSubscription = new Subscription();
-  private maxDirectionSubscription = new Subscription();
-  private modelCompareSubscription = new Subscription();
-  private modelSubscription = new Subscription();
-  private returnPeriodSubscription = new Subscription();
-  private truncateSubscription = new Subscription();
-  private vs30Subscription = new Subscription();
+  private subs: Subscription[] = [];
 
   constructor(
     public service: AppService,
@@ -101,48 +95,66 @@ export class ControlPanelComponent implements OnInit, OnDestroy {
   ) {}
 
   ngOnInit(): void {
-    this.modelSubscription =
-      this.formGroup.controls.model.valueChanges.subscribe(() => {
+    const controls = this.formGroup.controls;
+
+    this.subs.push(
+      controls.model.valueChanges.subscribe(() => {
         this.service.onModelChange();
-      });
+      }),
+    );
 
-    this.modelCompareSubscription =
-      this.formGroup.controls.modelCompare.valueChanges.subscribe(
-        modelCompare => this.onModelCompare(modelCompare),
-      );
+    this.subs.push(
+      controls.modelCompare.valueChanges.subscribe(modelCompare =>
+        this.onModelCompare(modelCompare),
+      ),
+    );
 
-    this.imtSubscription = this.formGroup.controls.imt.valueChanges.subscribe(
-      () => this.service.createPlots(),
+    this.subs.push(
+      controls.imt.valueChanges.subscribe(() => this.service.createPlots()),
     );
 
-    this.maxDirectionSubscription =
-      this.formGroup.controls.maxDirection.valueChanges.subscribe(() =>
+    this.subs.push(
+      controls.maxDirection.valueChanges.subscribe(() =>
         this.service.createPlots(),
-      );
+      ),
+    );
 
-    this.returnPeriodSubscription =
-      this.formGroup.controls.returnPeriod.valueChanges.subscribe(() =>
+    this.subs.push(
+      controls.returnPeriod.valueChanges.subscribe(() =>
         this.service.createPlots(),
-      );
+      ),
+    );
 
-    this.truncateSubscription =
-      this.formGroup.controls.truncate.valueChanges.subscribe(() =>
+    this.subs.push(
+      controls.truncate.valueChanges.subscribe(() =>
         this.service.createPlots(),
-      );
+      ),
+    );
+
+    this.subs.push(
+      controls.vs30.valueChanges.subscribe(() => this.service.resetState()),
+    );
 
-    this.vs30Subscription = this.formGroup.controls.vs30.valueChanges.subscribe(
-      () => this.service.resetState(),
+    this.subs.push(
+      combineLatest([
+        controls.latitude.valueChanges,
+        controls.longitude.valueChanges,
+      ]).subscribe(() => {
+        this.service.resetState();
+        const values = this.formGroup.getRawValue();
+
+        if (values.latitude && values.longitude) {
+          this.selectSiteData().site = {
+            latitude: values.latitude,
+            longitude: values.longitude,
+          };
+        }
+      }),
     );
   }
 
   ngOnDestroy(): void {
-    this.imtSubscription.unsubscribe();
-    this.maxDirectionSubscription.unsubscribe();
-    this.modelCompareSubscription.unsubscribe();
-    this.modelSubscription.unsubscribe();
-    this.returnPeriodSubscription.unsubscribe();
-    this.truncateSubscription.unsubscribe();
-    this.vs30Subscription.unsubscribe();
+    this.subs.forEach(sub => sub.unsubscribe());
   }
 
   /**
diff --git a/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts
index c2d54454a17ee81dfcf5cada2513f9916837ee02..7a288573ed48713439e8a6000d5e3e6d431d9040 100644
--- a/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/hazard/disagg/components/control-panel/control-panel.component.ts
@@ -122,10 +122,25 @@ export class ControlPanelComponent implements OnInit, OnDestroy {
 
     this.subs.push(
       combineLatest([
-        controls.iml.valueChanges,
-        controls.imt.valueChanges,
         controls.latitude.valueChanges,
         controls.longitude.valueChanges,
+      ]).subscribe(() => {
+        this.service.resetState();
+        const values = this.form.getRawValue();
+
+        if (values.latitude && values.longitude) {
+          this.selectSiteData().site = {
+            latitude: values.latitude,
+            longitude: values.longitude,
+          };
+        }
+      }),
+    );
+
+    this.subs.push(
+      combineLatest([
+        controls.iml.valueChanges,
+        controls.imt.valueChanges,
         controls.returnPeriod.valueChanges,
         controls.vs30.valueChanges,
       ]).subscribe(() => {
diff --git a/projects/nshmp-apps/src/app/hazard/dynamic/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/dynamic/components/control-panel/control-panel.component.ts
index d32ba225c69c513379f7a0d4f0d548222ab5c141..1e2e8ba66258cb5d2b8e8762e83e72494e590ad9 100644
--- a/projects/nshmp-apps/src/app/hazard/dynamic/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/hazard/dynamic/components/control-panel/control-panel.component.ts
@@ -117,7 +117,17 @@ export class ControlPanelComponent implements OnInit, OnDestroy {
         controls.latitude.valueChanges,
         controls.longitude.valueChanges,
         controls.vs30.valueChanges,
-      ]).subscribe(() => this.service.resetState()),
+      ]).subscribe(() => {
+        this.service.resetState();
+        const values = this.formGroup.getRawValue();
+
+        if (values.latitude && values.longitude) {
+          this.selectSiteData().site = {
+            latitude: values.latitude,
+            longitude: values.longitude,
+          };
+        }
+      }),
     );
 
     this.subs.push(
diff --git a/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts
index f2e6b0d284c345b003e84d25003799e07bd1f203..4fd2bd9959310c79c7f532c713ca6fdee653753f 100644
--- a/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/hazard/static/components/control-panel/control-panel.component.ts
@@ -94,7 +94,17 @@ export class ControlPanelComponent implements OnInit, OnDestroy {
       combineLatest([
         controls.latitude.valueChanges,
         controls.longitude.valueChanges,
-      ]).subscribe(() => this.service.resetState()),
+      ]).subscribe(() => {
+        this.service.resetState();
+        const values = this.formGroup.getRawValue();
+
+        if (values.latitude && values.longitude) {
+          this.selectSiteData().site = {
+            latitude: values.latitude,
+            longitude: values.longitude,
+          };
+        }
+      }),
     );
 
     this.subs.push(
diff --git a/projects/nshmp-apps/src/app/source/rates/components/control-panel/control-panel.component.ts b/projects/nshmp-apps/src/app/source/rates/components/control-panel/control-panel.component.ts
index 93c1b8534dad45a990608a6a1072d7206a6569f1..b14aa9620ed958a7d17dd8b00af6c9fc9d7d5434 100644
--- a/projects/nshmp-apps/src/app/source/rates/components/control-panel/control-panel.component.ts
+++ b/projects/nshmp-apps/src/app/source/rates/components/control-panel/control-panel.component.ts
@@ -16,7 +16,7 @@ import {
 } from '@ghsc/nshmp-lib-ng/nshmp';
 import {Location} from '@ghsc/nshmp-utils-ts/libs/nshmp-lib/geo';
 import {environment} from 'projects/nshmp-apps/src/environments/environment';
-import {Subscription} from 'rxjs';
+import {combineLatest, Subscription} from 'rxjs';
 
 import {AppService} from '../../services/app.service';
 
@@ -69,20 +69,29 @@ export class ControlPanelComponent implements OnInit, OnDestroy {
     this.subs.push(
       controls.model.valueChanges.subscribe(() => this.onModelChange()),
     );
-    this.subs.push(
-      controls.latitude.valueChanges.subscribe(() => this.service.resetState()),
-    );
-    this.subs.push(
-      controls.longitude.valueChanges.subscribe(() =>
-        this.service.resetState(),
-      ),
-    );
     this.subs.push(
       controls.distance.valueChanges.subscribe(() => this.service.resetState()),
     );
     this.subs.push(
       controls.timespan.valueChanges.subscribe(() => this.service.resetState()),
     );
+
+    this.subs.push(
+      combineLatest([
+        controls.latitude.valueChanges,
+        controls.longitude.valueChanges,
+      ]).subscribe(() => {
+        this.service.resetState();
+        const values = this.formGroup.getRawValue();
+
+        if (values.latitude && values.longitude) {
+          this.selectSiteData().site = {
+            latitude: values.latitude,
+            longitude: values.longitude,
+          };
+        }
+      }),
+    );
   }
 
   ngOnDestroy(): void {
diff --git a/tsconfig.json b/tsconfig.json
index 4789584f6ee675120f8b127233d38a41c94182e0..139ee14c033dd6a6240b83816dc4926a1acf3f10 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -18,6 +18,7 @@
     "useDefineForClassFields": false,
     "lib": ["es2022", "dom"],
     "noImplicitAny": true,
+    "skipLibCheck": true,
     "paths": {
       "nshmp-apps": ["dist/nshmp-apps/nshmp-apps", "dist/nshmp-apps"]
     }