diff --git a/package-lock.json b/package-lock.json
index be37a3e534aed19236f7bfe8186a5a27bf938ed0..384ae725d1cd1cf577437826b16eb3353036f4be 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -962,9 +962,9 @@
       }
     },
     "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz",
-      "integrity": "sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
       "cpu": [
         "ppc64"
       ],
@@ -979,9 +979,9 @@
       }
     },
     "node_modules/@esbuild/android-arm": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.4.tgz",
-      "integrity": "sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
       "cpu": [
         "arm"
       ],
@@ -996,9 +996,9 @@
       }
     },
     "node_modules/@esbuild/android-arm64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz",
-      "integrity": "sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
       "cpu": [
         "arm64"
       ],
@@ -1013,9 +1013,9 @@
       }
     },
     "node_modules/@esbuild/android-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.4.tgz",
-      "integrity": "sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
       "cpu": [
         "x64"
       ],
@@ -1030,9 +1030,9 @@
       }
     },
     "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz",
-      "integrity": "sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
       "cpu": [
         "arm64"
       ],
@@ -1047,9 +1047,9 @@
       }
     },
     "node_modules/@esbuild/darwin-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz",
-      "integrity": "sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
       "cpu": [
         "x64"
       ],
@@ -1064,9 +1064,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz",
-      "integrity": "sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
       "cpu": [
         "arm64"
       ],
@@ -1081,9 +1081,9 @@
       }
     },
     "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz",
-      "integrity": "sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
       "cpu": [
         "x64"
       ],
@@ -1098,9 +1098,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz",
-      "integrity": "sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
       "cpu": [
         "arm"
       ],
@@ -1115,9 +1115,9 @@
       }
     },
     "node_modules/@esbuild/linux-arm64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz",
-      "integrity": "sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
       "cpu": [
         "arm64"
       ],
@@ -1132,9 +1132,9 @@
       }
     },
     "node_modules/@esbuild/linux-ia32": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz",
-      "integrity": "sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
       "cpu": [
         "ia32"
       ],
@@ -1149,9 +1149,9 @@
       }
     },
     "node_modules/@esbuild/linux-loong64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz",
-      "integrity": "sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
       "cpu": [
         "loong64"
       ],
@@ -1166,9 +1166,9 @@
       }
     },
     "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz",
-      "integrity": "sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
       "cpu": [
         "mips64el"
       ],
@@ -1183,9 +1183,9 @@
       }
     },
     "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz",
-      "integrity": "sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
       "cpu": [
         "ppc64"
       ],
@@ -1200,9 +1200,9 @@
       }
     },
     "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz",
-      "integrity": "sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
       "cpu": [
         "riscv64"
       ],
@@ -1217,9 +1217,9 @@
       }
     },
     "node_modules/@esbuild/linux-s390x": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz",
-      "integrity": "sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
       "cpu": [
         "s390x"
       ],
@@ -1234,9 +1234,9 @@
       }
     },
     "node_modules/@esbuild/linux-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz",
-      "integrity": "sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
       "cpu": [
         "x64"
       ],
@@ -1251,9 +1251,9 @@
       }
     },
     "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz",
-      "integrity": "sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
       "cpu": [
         "x64"
       ],
@@ -1268,9 +1268,9 @@
       }
     },
     "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz",
-      "integrity": "sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
       "cpu": [
         "x64"
       ],
@@ -1285,9 +1285,9 @@
       }
     },
     "node_modules/@esbuild/sunos-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz",
-      "integrity": "sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
       "cpu": [
         "x64"
       ],
@@ -1302,9 +1302,9 @@
       }
     },
     "node_modules/@esbuild/win32-arm64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz",
-      "integrity": "sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
       "cpu": [
         "arm64"
       ],
@@ -1319,9 +1319,9 @@
       }
     },
     "node_modules/@esbuild/win32-ia32": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz",
-      "integrity": "sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
       "cpu": [
         "ia32"
       ],
@@ -1336,9 +1336,9 @@
       }
     },
     "node_modules/@esbuild/win32-x64": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz",
-      "integrity": "sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
       "cpu": [
         "x64"
       ],
@@ -2713,31 +2713,32 @@
       }
     },
     "node_modules/@volar/language-core": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.5.tgz",
-      "integrity": "sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.0.tgz",
+      "integrity": "sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==",
       "dev": true,
       "dependencies": {
-        "@volar/source-map": "2.2.5"
+        "@volar/source-map": "2.3.0"
       }
     },
     "node_modules/@volar/source-map": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.5.tgz",
-      "integrity": "sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.0.tgz",
+      "integrity": "sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==",
       "dev": true,
       "dependencies": {
         "muggle-string": "^0.4.0"
       }
     },
     "node_modules/@volar/typescript": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.5.tgz",
-      "integrity": "sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.0.tgz",
+      "integrity": "sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==",
       "dev": true,
       "dependencies": {
-        "@volar/language-core": "2.2.5",
-        "path-browserify": "^1.0.1"
+        "@volar/language-core": "2.3.0",
+        "path-browserify": "^1.0.1",
+        "vscode-uri": "^3.0.8"
       }
     },
     "node_modules/@vue/compiler-core": {
@@ -2848,12 +2849,12 @@
       }
     },
     "node_modules/@vue/language-core": {
-      "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz",
-      "integrity": "sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==",
+      "version": "2.0.21",
+      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.21.tgz",
+      "integrity": "sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==",
       "dev": true,
       "dependencies": {
-        "@volar/language-core": "~2.2.4",
+        "@volar/language-core": "~2.3.0-alpha.15",
         "@vue/compiler-dom": "^3.4.0",
         "@vue/shared": "^3.4.0",
         "computeds": "^0.0.1",
@@ -3672,9 +3673,9 @@
       }
     },
     "node_modules/esbuild": {
-      "version": "0.21.4",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.4.tgz",
-      "integrity": "sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==",
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
       "dev": true,
       "hasInstallScript": true,
       "peer": true,
@@ -3685,29 +3686,29 @@
         "node": ">=12"
       },
       "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.21.4",
-        "@esbuild/android-arm": "0.21.4",
-        "@esbuild/android-arm64": "0.21.4",
-        "@esbuild/android-x64": "0.21.4",
-        "@esbuild/darwin-arm64": "0.21.4",
-        "@esbuild/darwin-x64": "0.21.4",
-        "@esbuild/freebsd-arm64": "0.21.4",
-        "@esbuild/freebsd-x64": "0.21.4",
-        "@esbuild/linux-arm": "0.21.4",
-        "@esbuild/linux-arm64": "0.21.4",
-        "@esbuild/linux-ia32": "0.21.4",
-        "@esbuild/linux-loong64": "0.21.4",
-        "@esbuild/linux-mips64el": "0.21.4",
-        "@esbuild/linux-ppc64": "0.21.4",
-        "@esbuild/linux-riscv64": "0.21.4",
-        "@esbuild/linux-s390x": "0.21.4",
-        "@esbuild/linux-x64": "0.21.4",
-        "@esbuild/netbsd-x64": "0.21.4",
-        "@esbuild/openbsd-x64": "0.21.4",
-        "@esbuild/sunos-x64": "0.21.4",
-        "@esbuild/win32-arm64": "0.21.4",
-        "@esbuild/win32-ia32": "0.21.4",
-        "@esbuild/win32-x64": "0.21.4"
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
       }
     },
     "node_modules/escape-string-regexp": {
@@ -6562,9 +6563,9 @@
       }
     },
     "node_modules/uglify-js": {
-      "version": "3.17.4",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
-      "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+      "version": "3.18.0",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz",
+      "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==",
       "dev": true,
       "optional": true,
       "bin": {
@@ -7100,6 +7101,12 @@
         "@esbuild/win32-x64": "0.20.2"
       }
     },
+    "node_modules/vscode-uri": {
+      "version": "3.0.8",
+      "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
+      "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
+      "dev": true
+    },
     "node_modules/vue": {
       "version": "3.4.27",
       "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz",
@@ -7178,13 +7185,13 @@
       }
     },
     "node_modules/vue-tsc": {
-      "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.19.tgz",
-      "integrity": "sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg==",
+      "version": "2.0.21",
+      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.21.tgz",
+      "integrity": "sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==",
       "dev": true,
       "dependencies": {
-        "@volar/typescript": "~2.2.4",
-        "@vue/language-core": "2.0.19",
+        "@volar/typescript": "~2.3.0-alpha.15",
+        "@vue/language-core": "2.0.21",
         "semver": "^7.5.4"
       },
       "bin": {
diff --git a/src/App.vue b/src/App.vue
index a3bef75cae380982e55d1128d9755588f159e95d..d48b90e30e90cbab56645584b3f1e2e547849cf8 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -62,6 +62,9 @@ onBeforeMount(() => {
   });
   router.beforeEach(async (to) => {
     // make sure the user is authenticated
+    if (to.meta.public) {
+      return;
+    }
     if (
       !userRepository.authenticated &&
       // ❗️ Avoid an infinite redirect
diff --git a/src/components/workflows/modals/ArbitraryWorkflowModal.vue b/src/components/workflows/modals/ArbitraryWorkflowModal.vue
index 132dd4a27f224721d79fb8aeaa6d96e7b0a60029..c3c4a7aecaa7bc17b30a098425cdb829ed9b9be3 100644
--- a/src/components/workflows/modals/ArbitraryWorkflowModal.vue
+++ b/src/components/workflows/modals/ArbitraryWorkflowModal.vue
@@ -27,6 +27,8 @@ let workflowModeCollapse: Collapse | null = null;
 const arbitraryWorkflowForm = ref<HTMLFormElement | undefined>(undefined);
 const workflowRepositoryElement = ref<HTMLInputElement | undefined>(undefined);
 
+type Tabs = "clowm" | "cluster" | "local";
+
 const router = useRouter();
 const workflowStore = useWorkflowStore();
 const s3KeyStore = useS3KeyStore();
@@ -61,13 +63,7 @@ const workflowMode = reactive<{
   modeEnabled: false,
 });
 
-const executionEnvironmentState = reactive<{
-  cli: boolean;
-  cluster: boolean;
-}>({
-  cli: false,
-  cluster: false,
-});
+const activeTab = ref<Tabs>("clowm");
 
 const formState = reactive<{
   loading: boolean;
@@ -156,15 +152,16 @@ const resourcePathPrefix = computed<string>(() => {
 });
 
 const nextflowConfig = computed<string>(() => {
-  if (executionEnvironmentState.cluster) {
+  if (activeTab.value === "cluster") {
     return `// Nextflow config to emulate CloWM native execution
 aws {
-    accessKey = '${s3KeyStore.keys[0]?.access_key ?? ""}'
-    secretKey = '${s3KeyStore.keys[0]?.secret_key ?? ""}'
     client {
        endpoint = '${environment.S3_URL}'
        s3PathStyleAccess = true
     }
+    // Your personal S3 keys
+    accessKey = '${s3KeyStore.keys[0]?.access_key ?? ""}'
+    secretKey = '${s3KeyStore.keys[0]?.secret_key ?? ""}'
 }
 
 // Docker container options
@@ -181,7 +178,6 @@ docker {
 }
 
 // Disable unwanted features
-// Attention: Docker is the only supported container engine so far!
 weblog.enabled = false
 shifter.enabled = false
 singularity.enabled = false
@@ -285,12 +281,14 @@ process {
         memory = {2000.MB}
     }
 }`;
-  }
-  return `aws {
+  } else if (activeTab.value === "local") {
+    return `// Basic Nextflow config to enable docker and S3 access
+aws {
     client {
         endpoint = '${environment.S3_URL}'
         s3PathStyleAccess = true
     }
+    // Your personal S3 keys
     accessKey = '${s3KeyStore.keys[0]?.access_key ?? ""}'
     secretKey = '${s3KeyStore.keys[0]?.secret_key ?? ""}'
 }
@@ -317,6 +315,8 @@ process {
     memory = { 4000.MB }
 }
 `;
+  }
+  return "";
 });
 
 const configDownloadUrl = computed<string>(() =>
@@ -386,7 +386,6 @@ onMounted(() => {
   tokenHelpCollapse = new Collapse("#tokenHelpCollapse", {
     toggle: false,
   });
-  console.log(nextflowConfig.value);
 });
 </script>
 
@@ -400,7 +399,7 @@ onMounted(() => {
   >
     <template v-slot:header>Test workflow prior registration</template>
     <template v-slot:body>
-      <h5>Choose your execution environment</h5>
+      <h5>Choose the environment for workflow execution</h5>
       <div class="btn-group justify-content-center w-100 mb-2" role="group">
         <input
           type="radio"
@@ -409,56 +408,42 @@ onMounted(() => {
           id="clowm-outlined"
           autocomplete="off"
           checked
-          v-model="executionEnvironmentState.cli"
-          :value="false"
+          v-model="activeTab"
+          value="clowm"
         />
-        <label class="btn btn-outline-primary" for="clowm-outlined"
-          >CloWM native execution</label
+        <label class="btn btn-outline-primary" for="clowm-outlined">
+          <font-awesome-icon icon="fa-solid fa-cloud" class="me-1" />
+          CloWM native execution</label
         >
-
+        <input
+          type="radio"
+          class="btn-check"
+          name="execution-environment-choice"
+          id="cluster-outlined"
+          autocomplete="off"
+          v-model="activeTab"
+          value="cluster"
+        />
+        <label class="btn btn-outline-primary" for="cluster-outlined">
+          <font-awesome-icon icon="fa-solid fa-server" class="me-1" />
+          Emulated CloWM environment
+        </label>
         <input
           type="radio"
           class="btn-check"
           name="execution-environment-choice"
           id="cli-outlined"
           autocomplete="off"
-          v-model="executionEnvironmentState.cli"
-          :value="true"
+          v-model="activeTab"
+          value="local"
         />
-        <label class="btn btn-outline-primary" for="cli-outlined"
-          >Local Execution</label
+        <label class="btn btn-outline-primary" for="cli-outlined">
+          <font-awesome-icon icon="fa-solid fa-laptop" class="me-1" />
+          Local Execution</label
         >
       </div>
-      <div v-if="executionEnvironmentState.cli">
-        <div class="btn-group justify-content-center w-100 mb-2" role="group">
-          <input
-            type="radio"
-            class="btn-check"
-            name="cluster-environment-choice"
-            id="laptop-outlined"
-            autocomplete="off"
-            checked
-            v-model="executionEnvironmentState.cluster"
-            :value="false"
-          />
-          <label class="btn btn-outline-primary" for="laptop-outlined"
-            >Personal computer</label
-          >
-
-          <input
-            type="radio"
-            class="btn-check"
-            name="cluster-environment-choice"
-            id="cluster-outlined"
-            autocomplete="off"
-            v-model="executionEnvironmentState.cluster"
-            :value="true"
-          />
-          <label class="btn btn-outline-primary" for="cluster-outlined"
-            >Emulated CloWM environment</label
-          >
-        </div>
-        <p v-if="executionEnvironmentState.cluster">
+      <div v-if="activeTab !== 'clowm'">
+        <p v-if="activeTab === 'cluster'">
           To emulate the CloWM native execution environment (e.g. docker
           configuration, S3 access, resource labels etc.) on the workflow
           development system, please download and use the Nextflow configuration
@@ -470,6 +455,7 @@ onMounted(() => {
           download and use the Nextflow configuration file
           (<code>clowm-nextflow.config</code>) as described below.
         </p>
+        <h6>Start Workflow:</h6>
         <pre
           class="rounded-1 w-100"
         ><code>nextflow run /path/to/main.nf -c clowm-nextflow.config ...</code></pre>
@@ -477,11 +463,15 @@ onMounted(() => {
         <pre class="w-100 rounded-1"><code>{{ nextflowConfig }}</code></pre>
       </div>
       <form
-        v-else
+        :hidden="activeTab !== 'clowm'"
         id="arbitraryWorkflowForm"
         :class="{ 'was-validated': formState.validated }"
         ref="arbitraryWorkflowForm"
       >
+        <p>
+          Fill out the form to run an execution of your workflow on the CloWM
+          infrastructure directly from your git repository.
+        </p>
         <div class="mb-3">
           <label for="arbitraryWorkflowRepositoryInput" class="form-label"
             >Git Repository URL</label
@@ -673,7 +663,7 @@ onMounted(() => {
     </template>
     <template v-slot:footer>
       <button
-        v-if="!executionEnvironmentState.cli"
+        v-if="activeTab === 'clowm'"
         type="button"
         class="btn btn-info me-auto"
         @click="checkRepository"
@@ -691,7 +681,7 @@ onMounted(() => {
         Close
       </button>
       <button
-        v-if="!executionEnvironmentState.cli"
+        v-if="activeTab === 'clowm'"
         type="submit"
         form="workflowCreateForm"
         class="btn btn-primary"
@@ -704,7 +694,7 @@ onMounted(() => {
           role="status"
           aria-hidden="true"
         ></span>
-        View
+        Run
       </button>
       <a
         v-else
diff --git a/src/router/index.ts b/src/router/index.ts
index 5b0b11e881bae9c07d7492bce00f49088edd0a5a..a6397578765f5c79e56599db5439a329a4a84d6d 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -29,6 +29,7 @@ const router = createRouter({
       component: LoginView,
       meta: {
         title: "Login",
+        public: true,
       },
       props: (route) => ({
         returnPath: route.query.next ?? undefined,
@@ -47,6 +48,7 @@ const router = createRouter({
       name: "privacy",
       meta: {
         title: "Privacy Policy",
+        public: true,
       },
       component: PrivacyPolicyView,
     },
@@ -55,6 +57,7 @@ const router = createRouter({
       name: "terms",
       meta: {
         title: "Terms of Usage",
+        public: true,
       },
       component: TermsOfUsageView,
     },
@@ -63,6 +66,7 @@ const router = createRouter({
       name: "imprint",
       meta: {
         title: "Imprint",
+        public: true,
       },
       component: ImprintView,
     },
@@ -70,6 +74,7 @@ const router = createRouter({
       path: "/:pathMatch(.*)",
       meta: {
         title: "Error",
+        public: true,
       },
       component: () => import("../views/NotFoundView.vue"),
     },
diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue
index c5eb8488445084d5b11c82baa2ebc2553fb3451d..4a281ec25c8201a0fe8d8b31f21f8225b8ea6af7 100644
--- a/src/views/LoginView.vue
+++ b/src/views/LoginView.vue
@@ -56,44 +56,54 @@ onMounted(() => {
       <p>Error Code: {{ props.loginError }}</p>
     </template>
   </bootstrap-toast>
-  <div class="position-fixed start-50 translate-middle-x text-center">
-    <img
-      src="/src/assets/images/clowm.svg"
-      class="img-fluid mb-3"
-      width="128"
-      height="128"
-      alt="CloWM Logo"
-    />
-    <h1>
-      <span class="blue fw-bold">Clo</span><span class="red fw-bold">W</span
-      ><span class="green fw-bold">M</span>
-    </h1>
-    <h2>
-      The <span class="blue fw-semibold">Clo</span>ud-based
-      <span class="red fw-semibold">W</span>orkflow
-      <span class="green fw-semibold">M</span>anager
-    </h2>
-  </div>
   <div
-    class="card text-center ms-md-auto position-fixed top-50 start-50 translate-middle shadow"
+    class="d-flex flex-column justify-content-between align-items-center"
+    style="min-height: 80vh"
   >
-    <div v-if="invitationToken" class="card-header">Invitation</div>
-    <div v-else class="card-header">Login</div>
-    <div class="card-body">
-      <p v-if="invitationToken" class="card-text text-secondary">
-        Connect your newly created CloWM account with your LifeScience account
-      </p>
-      <p v-else class="card-text text-secondary">
-        Login to this service with LifeScience
-      </p>
-      <a :href="loginPath" class="m-2">
-        <img src="/src/assets/images/ls-login.png" alt="[LS Login]" />
-      </a>
+    <div style="visibility: hidden">empty</div>
+    <div class="text-center w-fit">
+      <div class="fs-3 mb-3">
+        <img
+          src="/src/assets/images/clowm.svg"
+          class="mb-2 img-fluid"
+          width="48"
+          height="48"
+          alt="CloWM Logo"
+        />
+        <h5>
+          The <span class="blue fw-semibold">Clo</span>ud-based
+          <span class="red fw-semibold">W</span>orkflow
+          <span class="green fw-semibold">M</span>anager
+        </h5>
+      </div>
+      <div class="card text-center ms-md-auto">
+        <div v-if="invitationToken" class="card-header">Invitation</div>
+        <div class="card-body">
+          <p v-if="invitationToken" class="card-text text-secondary">
+            Connect your newly created <span class="blue fw-bold">Clo</span
+            ><span class="red fw-bold">W</span
+            ><span class="green fw-bold">M</span> account with your LifeScience
+            account
+          </p>
+          <p v-else class="card-text text-secondary">
+            Login to <span class="blue fw-bold">Clo</span
+            ><span class="red fw-bold">W</span
+            ><span class="green fw-bold">M</span> with LifeScience
+          </p>
+          <a :href="loginPath" class="m-2">
+            <img
+              src="/src/assets/images/ls-login.png"
+              alt="[LS Login]"
+              style="max-height: 70px"
+            />
+          </a>
+        </div>
+      </div>
     </div>
-  </div>
-  <div class="position-fixed bottom-0 w-100 start-0">
-    <div class="d-flex flex-row justify-content-evenly align-items-center">
-      <div class="border rounded p-4 icon text-center" hidden>
+    <div
+      class="d-flex flex-row justify-content-evenly align-items-center flex-wrap w-100"
+    >
+      <div class="border rounded p-4 icon text-center m-2" hidden>
         <h4 class="mb-4">A Service By</h4>
         <a href="https://nfdi4microbiota.de/">
           <img
@@ -103,7 +113,7 @@ onMounted(() => {
           />
         </a>
       </div>
-      <div class="border rounded p-4 icon text-center">
+      <div class="border rounded p-4 icon text-center m-2">
         <h4 class="mb-4">Powered By</h4>
         <a href="https://www.denbi.de/">
           <img
@@ -113,17 +123,17 @@ onMounted(() => {
           />
         </a>
       </div>
-      <div class="border rounded p-4 icon text-center">
+      <div class="border rounded p-4 icon text-center m-2">
         <h4 class="mb-4">Hosted By</h4>
         <a href="https://bibi.uni-bielefeld.de/">
           <img src="/src/assets/images/bibi.png" alt="BiBi Logo" height="50" />
         </a>
       </div>
-      <div class="border rounded p-4 icon text-center">
+      <div class="border rounded p-4 icon text-center m-2">
         <h4 class="mb-4">Funded By</h4>
         <img src="/src/assets/images/dfg.png" alt="DFG Logo" height="50" />
       </div>
-      <div class="border rounded p-4 icon text-center">
+      <div class="border rounded p-4 icon text-center m-2">
         <img
           src="/src/assets/images/unibi.svg"
           alt="Bielefeld University Logo"