diff --git a/package-lock.json b/package-lock.json
index d5573f8778fe2e22f5ffa2dd21afdc994f63b934..d8b60be3e0e4bcdd802407e5db76e4258e8b6eba 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,7 +26,7 @@
         "semver": "~7.6.0",
         "showdown": "~2.1.0",
         "sortablejs": "^1.15.2",
-        "vue": "~3.4.0",
+        "vue": "~3.5.0",
         "vue-matomo": "^4.2.0",
         "vue-router": "~4.4.0",
         "vue3-cookies": "~1.0.0"
@@ -46,7 +46,7 @@
         "@vue/tsconfig": "~0.5.0",
         "axios": "~1.7.0",
         "eslint": "~8.57.0",
-        "eslint-plugin-vue": "~9.27.0",
+        "eslint-plugin-vue": "~9.28.0",
         "highlight.js": "^11.9.0",
         "npm-run-all": "~4.1.5",
         "openapi-typescript-codegen": "^0.29.0",
@@ -55,7 +55,7 @@
         "typescript": "~5.5.0",
         "vite": "~5.4.0",
         "vite-plugin-node-polyfills": "^0.22.0",
-        "vue-tsc": "~2.0.0"
+        "vue-tsc": "~2.1.0"
       }
     },
     "node_modules/@apidevtools/json-schema-ref-parser": {
@@ -2735,9 +2735,9 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "20.16.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.2.tgz",
-      "integrity": "sha512-91s/n4qUPV/wg8eE9KHYW1kouTfDk2FPGjXbBMfRWP/2vg1rCXNQL1OCabwGs0XSdukuK+MwCDXE30QpSeMUhQ==",
+      "version": "20.16.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.4.tgz",
+      "integrity": "sha512-ioyQ1zK9aGEomJ45zz8S8IdzElyxhvP1RVWnPrXDf6wFaUb+kk1tEcVVJkF7RPGM0VWI7cp5U57oCPIn5iN1qg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -2987,82 +2987,82 @@
       }
     },
     "node_modules/@volar/language-core": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.1.tgz",
-      "integrity": "sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.2.tgz",
+      "integrity": "sha512-sONt5RLvLL1SlBdhyUSthZzuKePbJ7DwFFB9zT0eyWpDl+v7GXGh/RkPxxWaR22bIhYtTzp4Ka1MWatl/53Riw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@volar/source-map": "2.4.1"
+        "@volar/source-map": "2.4.2"
       }
     },
     "node_modules/@volar/source-map": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.1.tgz",
-      "integrity": "sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ==",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.2.tgz",
+      "integrity": "sha512-qiGfGgeZ5DEarPX3S+HcFktFCjfDrFPCXKeXNbrlB7v8cvtPRm8YVwoXOdGG1NhaL5rMlv5BZPVQyu4EdWWIvA==",
       "dev": true,
       "license": "MIT"
     },
     "node_modules/@volar/typescript": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.1.tgz",
-      "integrity": "sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q==",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.2.tgz",
+      "integrity": "sha512-m2uZduhaHO1SZuagi30OsjI/X1gwkaEAC+9wT/nCNAtJ5FqXEkKvUncHmffG7ESDZPlFFUBK4vJ0D9Hfr+f2EA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@volar/language-core": "2.4.1",
+        "@volar/language-core": "2.4.2",
         "path-browserify": "^1.0.1",
         "vscode-uri": "^3.0.8"
       }
     },
     "node_modules/@vue/compiler-core": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.38.tgz",
-      "integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.1.tgz",
+      "integrity": "sha512-WdjF+NSgFYdWttHevHw5uaJFtKPalhmxhlu2uREj8cLP0uyKKIR60/JvSZNTp0x+NSd63iTiORQTx3+tt55NWQ==",
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.24.7",
-        "@vue/shared": "3.4.38",
+        "@babel/parser": "^7.25.3",
+        "@vue/shared": "3.5.1",
         "entities": "^4.5.0",
         "estree-walker": "^2.0.2",
         "source-map-js": "^1.2.0"
       }
     },
     "node_modules/@vue/compiler-dom": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz",
-      "integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.1.tgz",
+      "integrity": "sha512-Ao23fB1lINo18HLCbJVApvzd9OQe8MgmQSgyY5+umbWj2w92w9KykVmJ4Iv2US5nak3ixc2B+7Km7JTNhQ8kSQ==",
       "license": "MIT",
       "dependencies": {
-        "@vue/compiler-core": "3.4.38",
-        "@vue/shared": "3.4.38"
+        "@vue/compiler-core": "3.5.1",
+        "@vue/shared": "3.5.1"
       }
     },
     "node_modules/@vue/compiler-sfc": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz",
-      "integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.1.tgz",
+      "integrity": "sha512-DFizMNH8eDglLhlfwJ0+ciBsztaYe3fY/zcZjrqL1ljXvUw/UpC84M1d7HpBTCW68SNqZyIxrs1XWmf+73Y65w==",
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.24.7",
-        "@vue/compiler-core": "3.4.38",
-        "@vue/compiler-dom": "3.4.38",
-        "@vue/compiler-ssr": "3.4.38",
-        "@vue/shared": "3.4.38",
+        "@babel/parser": "^7.25.3",
+        "@vue/compiler-core": "3.5.1",
+        "@vue/compiler-dom": "3.5.1",
+        "@vue/compiler-ssr": "3.5.1",
+        "@vue/shared": "3.5.1",
         "estree-walker": "^2.0.2",
-        "magic-string": "^0.30.10",
-        "postcss": "^8.4.40",
+        "magic-string": "^0.30.11",
+        "postcss": "^8.4.44",
         "source-map-js": "^1.2.0"
       }
     },
     "node_modules/@vue/compiler-ssr": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz",
-      "integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.1.tgz",
+      "integrity": "sha512-C1hpSHQgRM8bg+5XWWD7CkFaVpSn9wZHCLRd10AmxqrH17d4EMP6+XcZpwBOM7H1jeStU5naEapZZWX0kso1tQ==",
       "license": "MIT",
       "dependencies": {
-        "@vue/compiler-dom": "3.4.38",
-        "@vue/shared": "3.4.38"
+        "@vue/compiler-dom": "3.5.1",
+        "@vue/shared": "3.5.1"
       }
     },
     "node_modules/@vue/compiler-vue2": {
@@ -3123,13 +3123,13 @@
       }
     },
     "node_modules/@vue/language-core": {
-      "version": "2.0.29",
-      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.29.tgz",
-      "integrity": "sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==",
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.1.4.tgz",
+      "integrity": "sha512-i8pfAgNjTNjabBX1xRsuV6aRw2E8bdQXwd5H8m3cUkTVJju3QN5nfdoXET0uK+yXsuloNJPzo6PXFujRRPNmMA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@volar/language-core": "~2.4.0-alpha.18",
+        "@volar/language-core": "~2.4.1",
         "@vue/compiler-dom": "^3.4.0",
         "@vue/compiler-vue2": "^2.7.16",
         "@vue/shared": "^3.4.0",
@@ -3148,53 +3148,53 @@
       }
     },
     "node_modules/@vue/reactivity": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.38.tgz",
-      "integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.1.tgz",
+      "integrity": "sha512-aFE1nMDfbG7V+U5vdOk/NXxH/WX78XuAfX59vWmCM7Ao4lieoc83RkzOAWun61sQXlzNZ4IgROovFBHg+Iz1+Q==",
       "license": "MIT",
       "dependencies": {
-        "@vue/shared": "3.4.38"
+        "@vue/shared": "3.5.1"
       }
     },
     "node_modules/@vue/runtime-core": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.38.tgz",
-      "integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.1.tgz",
+      "integrity": "sha512-Ce92CCholNRHR3ZtzpRp/7CDGIPFxQ7ElXt9iH91ilK5eOrUv3Z582NWJesuM3aYX71BujVG5/4ypUxigGNxjA==",
       "license": "MIT",
       "dependencies": {
-        "@vue/reactivity": "3.4.38",
-        "@vue/shared": "3.4.38"
+        "@vue/reactivity": "3.5.1",
+        "@vue/shared": "3.5.1"
       }
     },
     "node_modules/@vue/runtime-dom": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz",
-      "integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.1.tgz",
+      "integrity": "sha512-B/fUJfBLp5PwE0EWNfBYnA4JUea8Yufb3wN8fN0/HzaqBdkiRHh4sFHOjWqIY8GS75gj//8VqeEqhcU6yUjIkA==",
       "license": "MIT",
       "dependencies": {
-        "@vue/reactivity": "3.4.38",
-        "@vue/runtime-core": "3.4.38",
-        "@vue/shared": "3.4.38",
+        "@vue/reactivity": "3.5.1",
+        "@vue/runtime-core": "3.5.1",
+        "@vue/shared": "3.5.1",
         "csstype": "^3.1.3"
       }
     },
     "node_modules/@vue/server-renderer": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.38.tgz",
-      "integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.1.tgz",
+      "integrity": "sha512-C5V/fjQTitgVaRNH5wCoHynaWysjZ+VH68drNsAvQYg4ArHsZUQNz0nHoEWRj41nzqkVn2RUlnWaEOTl2o1Ppg==",
       "license": "MIT",
       "dependencies": {
-        "@vue/compiler-ssr": "3.4.38",
-        "@vue/shared": "3.4.38"
+        "@vue/compiler-ssr": "3.5.1",
+        "@vue/shared": "3.5.1"
       },
       "peerDependencies": {
-        "vue": "3.4.38"
+        "vue": "3.5.1"
       }
     },
     "node_modules/@vue/shared": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.38.tgz",
-      "integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.1.tgz",
+      "integrity": "sha512-NdcTRoO4KuW2RSFgpE2c+E/R/ZHaRzWPxAGxhmxZaaqLh6nYCXx7lc9a88ioqOCxCaV2SFJmujkxbUScW7dNsQ==",
       "license": "MIT"
     },
     "node_modules/@vue/tsconfig": {
@@ -3397,9 +3397,9 @@
       }
     },
     "node_modules/axios": {
-      "version": "1.7.5",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz",
-      "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==",
+      "version": "1.7.7",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
+      "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4543,9 +4543,9 @@
       }
     },
     "node_modules/eslint-plugin-vue": {
-      "version": "9.27.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
-      "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
+      "version": "9.28.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz",
+      "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4554,7 +4554,7 @@
         "natural-compare": "^1.4.0",
         "nth-check": "^2.1.1",
         "postcss-selector-parser": "^6.0.15",
-        "semver": "^7.6.0",
+        "semver": "^7.6.3",
         "vue-eslint-parser": "^9.4.3",
         "xml-name-validator": "^4.0.0"
       },
@@ -4842,9 +4842,9 @@
       }
     },
     "node_modules/filesize": {
-      "version": "10.1.4",
-      "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.4.tgz",
-      "integrity": "sha512-ryBwPIIeErmxgPnm6cbESAzXjuEFubs+yKYLBZvg3CaiNcmkJChoOGcBSrZ6IwkMwPABwPpVXE6IlNdGJJrvEg==",
+      "version": "10.1.5",
+      "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.5.tgz",
+      "integrity": "sha512-jcw4nVu7/Tsf9H8Unni6N8qcUOF6fPq7riSahe1S/paGV8C2Zbjtm9zPULqUapQBVBBUU6HbcXzGPWqQ8MnRVA==",
       "license": "BSD-3-Clause",
       "engines": {
         "node": ">= 10.4.0"
@@ -4903,9 +4903,9 @@
       "license": "ISC"
     },
     "node_modules/follow-redirects": {
-      "version": "1.15.6",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
-      "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+      "version": "1.15.8",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz",
+      "integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==",
       "dev": true,
       "funding": [
         {
@@ -6755,9 +6755,9 @@
       }
     },
     "node_modules/picocolors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
-      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
+      "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
       "license": "ISC"
     },
     "node_modules/picomatch": {
@@ -6872,9 +6872,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.41",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz",
-      "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
+      "version": "8.4.45",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz",
+      "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==",
       "funding": [
         {
           "type": "opencollective",
@@ -7340,9 +7340,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.77.8",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz",
-      "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==",
+      "version": "1.78.0",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.78.0.tgz",
+      "integrity": "sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7512,9 +7512,9 @@
       }
     },
     "node_modules/sortablejs": {
-      "version": "1.15.2",
-      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.2.tgz",
-      "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==",
+      "version": "1.15.3",
+      "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.3.tgz",
+      "integrity": "sha512-zdK3/kwwAK1cJgy1rwl1YtNTbRmc8qW/+vgXf75A7NHag5of4pyI6uK86ktmQETyWRH7IGaE73uZOOBcGxgqZg==",
       "license": "MIT"
     },
     "node_modules/source-map": {
@@ -8071,14 +8071,14 @@
       }
     },
     "node_modules/vite": {
-      "version": "5.4.2",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.2.tgz",
-      "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
+      "version": "5.4.3",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.3.tgz",
+      "integrity": "sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
         "esbuild": "^0.21.3",
-        "postcss": "^8.4.41",
+        "postcss": "^8.4.43",
         "rollup": "^4.20.0"
       },
       "bin": {
@@ -8162,16 +8162,16 @@
       "license": "MIT"
     },
     "node_modules/vue": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz",
-      "integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.1.tgz",
+      "integrity": "sha512-k4UNnbPOEskodSxMtv+B9GljdB0C9ubZDOmW6vnXVGIfMqmEsY2+ohasjGguhGkMkrcP/oOrbH0dSD41x5JQFw==",
       "license": "MIT",
       "dependencies": {
-        "@vue/compiler-dom": "3.4.38",
-        "@vue/compiler-sfc": "3.4.38",
-        "@vue/runtime-dom": "3.4.38",
-        "@vue/server-renderer": "3.4.38",
-        "@vue/shared": "3.4.38"
+        "@vue/compiler-dom": "3.5.1",
+        "@vue/compiler-sfc": "3.5.1",
+        "@vue/runtime-dom": "3.5.1",
+        "@vue/server-renderer": "3.5.1",
+        "@vue/shared": "3.5.1"
       },
       "peerDependencies": {
         "typescript": "*"
@@ -8233,14 +8233,14 @@
       }
     },
     "node_modules/vue-tsc": {
-      "version": "2.0.29",
-      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.29.tgz",
-      "integrity": "sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==",
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.1.4.tgz",
+      "integrity": "sha512-XTzMXQcsixAvNbpou/9qngEsZawaiJRZH3Ja+lfgRfv2A1TJv9vnZ/Kyv7XxPqv/TaZVFSnjGpM87VbWIg6yQg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@volar/typescript": "~2.4.0-alpha.18",
-        "@vue/language-core": "2.0.29",
+        "@volar/typescript": "~2.4.1",
+        "@vue/language-core": "2.1.4",
         "semver": "^7.5.4"
       },
       "bin": {
diff --git a/package.json b/package.json
index 8a63311838bd7eab3e0767a9750ed6db07d9cce4..c050a655176ea2f67afc15d2cba550b8ab9ac6f8 100644
--- a/package.json
+++ b/package.json
@@ -30,7 +30,7 @@
     "semver": "~7.6.0",
     "showdown": "~2.1.0",
     "sortablejs": "^1.15.2",
-    "vue": "~3.4.0",
+    "vue": "~3.5.0",
     "vue-matomo": "^4.2.0",
     "vue-router": "~4.4.0",
     "vue3-cookies": "~1.0.0"
@@ -50,7 +50,7 @@
     "@vue/tsconfig": "~0.5.0",
     "axios": "~1.7.0",
     "eslint": "~8.57.0",
-    "eslint-plugin-vue": "~9.27.0",
+    "eslint-plugin-vue": "~9.28.0",
     "highlight.js": "^11.9.0",
     "npm-run-all": "~4.1.5",
     "openapi-typescript-codegen": "^0.29.0",
@@ -59,6 +59,6 @@
     "typescript": "~5.5.0",
     "vite": "~5.4.0",
     "vite-plugin-node-polyfills": "^0.22.0",
-    "vue-tsc": "~2.0.0"
+    "vue-tsc": "~2.1.0"
   }
 }
diff --git a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue
index 44f35c5a93a8c575a75a0ee901eb75aeb99d6f08..06b03081dc04371c190e0aba9e462c9def5ee9fc 100644
--- a/src/components/parameter-schema/form-mode/ParameterEnumInput.vue
+++ b/src/components/parameter-schema/form-mode/ParameterEnumInput.vue
@@ -38,7 +38,7 @@ const dynamicCssClasses = computed<string[]>(() => {
     v-model="model"
     class="form-select"
     :class="dynamicCssClasses"
-    :required="required"
+    :required="props.required"
   >
     <option v-for="val in possibleValues" :key="val">
       {{ val }}
diff --git a/src/components/parameter-schema/form-mode/ParameterFileInput.vue b/src/components/parameter-schema/form-mode/ParameterFileInput.vue
index 6b76c7ae05dd812afbb77e5691d438673704d368..ea53eba4fd99860c067d1b44ed966b2a5d8a2355 100644
--- a/src/components/parameter-schema/form-mode/ParameterFileInput.vue
+++ b/src/components/parameter-schema/form-mode/ParameterFileInput.vue
@@ -204,7 +204,7 @@ onMounted(() => {
     <option v-for="obj in keyDataList" :value="obj" :key="obj" />
   </datalist>
   <button
-    v-if="allowRaw"
+    v-if="props.allowRaw"
     type="button"
     class="btn btn-outline-secondary"
     @click="emit('switch-to-raw')"
diff --git a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
index 9e9571a683c72e5b87f304db97e50874ff5c2966..7683a99675e69b9c0a19923a00faf7aa12fa1b5b 100644
--- a/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
+++ b/src/components/parameter-schema/form-mode/ParameterGroupForm.vue
@@ -70,7 +70,10 @@ function parameterId(parameterName: string): string {
 <template>
   <div
     class="card mb-3"
-    :hidden="(!showHidden && groupHidden) || (!showOptional && !groupRequired)"
+    :hidden="
+      (!props.showHidden && groupHidden) ||
+      (!props.showOptional && !groupRequired)
+    "
   >
     <h3 class="card-header" :id="props.parameterGroupName">
       <font-awesome-icon :icon="icon" class="me-2" v-if="icon" />
@@ -84,15 +87,16 @@ function parameterId(parameterName: string): string {
       >
         <div
           :hidden="
-            (!showHidden && parameter['hidden']) ||
-            (!showOptional && !parameterRequired(parameterGroup, parameterName))
+            (!props.showHidden && parameter['hidden']) ||
+            (!props.showOptional &&
+              !parameterRequired(props.parameterGroup, parameterName))
           "
         >
           <code
             class="p-2 rounded-top border-bottom-0 border bg-secondary-subtle border-secondary"
             >--{{ parameter["name"] ?? parameterName }}</code
           ><span
-            v-if="parameterRequired(parameterGroup, parameterName)"
+            v-if="parameterRequired(props.parameterGroup, parameterName)"
             class="rounded p-1 bg-warning text-light ms-2"
             >required</span
           >
@@ -106,11 +110,13 @@ function parameterId(parameterName: string): string {
             <parameter-input
               :parameter="parameter"
               v-model="model[parameterName]"
-              :required="parameterRequired(parameterGroup, parameterName)"
+              :required="parameterRequired(props.parameterGroup, parameterName)"
               border="secondary"
-              :resource-parameter="resourceParameters?.includes(parameterName)"
-              :allow-raw="showOptional"
-              :mapping="mapping?.[parameterName]"
+              :resource-parameter="
+                props.resourceParameters?.includes(parameterName)
+              "
+              :allow-raw="props.showOptional"
+              :mapping="props.mapping?.[parameterName]"
             />
             <span
               class="input-group-text cursor-pointer px-2 border border-secondary"