From 2b1c4c9cd90c6eb3fb2b81168848ebd0d7a04728 Mon Sep 17 00:00:00 2001
From: Pierre-Alexandre Martin <pierre-alexandre.martin@imt-atlantique.net>
Date: Wed, 5 Feb 2025 14:34:07 +0100
Subject: [PATCH] =?UTF-8?q?Mise=20en=20place=20de=20la=20cr=C3=A9ation=20d?=
 =?UTF-8?q?e=20parcours?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 components/exerciceItem.vue |   45 ++
 data/mock/exercices.json    |   16 +-
 nuxt.config.ts              |    3 +-
 package-lock.json           | 1313 +++++++++++------------------------
 package.json                |   14 +-
 pages/exercices.vue         |  145 +++-
 pages/parcours.vue          |   67 +-
 types/Exercice.ts           |    4 +-
 8 files changed, 689 insertions(+), 918 deletions(-)
 create mode 100644 components/exerciceItem.vue

diff --git a/components/exerciceItem.vue b/components/exerciceItem.vue
new file mode 100644
index 0000000..bcacfe1
--- /dev/null
+++ b/components/exerciceItem.vue
@@ -0,0 +1,45 @@
+<script setup lang="ts">
+import type Exercise from '../types/Exercice.js';
+
+function getIcon() {
+    switch (props.exercise.category) {
+        case ExerciseCategory.RENFORCEMENT:
+            return 'material-symbols:exercise-outline';
+        case ExerciseCategory.CARDIO:
+            return 'material-symbols:cardiology-outline';
+        case ExerciseCategory.STRETCHING:
+            return 'material-symbols:transfer-within-a-station';
+        default:
+            return 'material-symbols:question-mark';
+    }
+}
+
+const props = defineProps<{
+    exercise: Exercise
+}>()
+</script>
+
+<template>
+    <div class="exercise-item">
+        <UIcon :name="getIcon()" class="h-9 w-9 m-1.5" style="color: var(--color-accent-500)"/>
+        <div class="grid gap-2 w-full">
+            <p>{{ props.exercise.name }}</p>
+            <small>
+                {{ props.exercise.category }}
+                {{ props.exercise.subCategory ? '> ' + props.exercise.subCategory : '' }}
+            </small>
+        </div>
+    </div>
+</template>
+
+<style>
+div.exercise-item {
+    transition: 0.4s;
+}
+
+div.exercise-item:hover {
+    transform: scale(1.05);
+    background-color: var(--color-background-800);
+    border-radius: 25px;
+}
+</style>
\ No newline at end of file
diff --git a/data/mock/exercices.json b/data/mock/exercices.json
index bdd45eb..0ef66f1 100644
--- a/data/mock/exercices.json
+++ b/data/mock/exercices.json
@@ -15,24 +15,32 @@
       "Push yourself back up to the starting position."
     ],
     "diagram": "https://upload.wikimedia.org/wikipedia/commons/b/b8/Liegestuetz02_ani_fcm.gif",
-    "video": "https://www.youtube.com/watch?v=IODxDxX7oi4"
+    "video": "https://www.youtube.com/watch?v=IODxDxX7oi4",
+    "lat": 47.2878,
+    "lng": -1.5251
   },
   {
     "id": 2,
     "name": "Squat",
     "description": "The squat is a lower body exercise. It primarily targets the quadriceps and the glutes, but also involves the hamstrings, the calves, and the lower back. The squat is often called 'the king of exercises' because it works many muscles at the same time.",
-    "category": "Renforcement"
+    "category": "Renforcement",
+    "lat": 47.2858,
+    "lng": -1.5229
   },
   {
     "id": 3,
     "name": "Running",
     "description": "Running is a method of terrestrial locomotion allowing humans and other animals to move rapidly on foot. It is simply defined in athletics terms as a gait in which at regular points during the running cycle both feet are off the ground.",
-    "category": "Cardio"
+    "category": "Cardio",
+    "lat": 47.2814,
+    "lng": -1.5229
   },
   {
     "id": 4,
     "name": "Stretching exercises",
     "description": "Stretching is a form of physical exercise in which a specific muscle or tendon (or muscle group) is deliberately flexed or stretched in order to improve the muscle's felt elasticity and achieve comfortable muscle tone. The result is a feeling of increased muscle control, flexibility, and range of motion.",
-    "category": "Stretching"
+    "category": "Stretching",
+    "lat": 47.2858,
+    "lng": -1.5235
   }
 ]
\ No newline at end of file
diff --git a/nuxt.config.ts b/nuxt.config.ts
index df41e50..ff2b7d6 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -72,7 +72,8 @@ export default defineNuxtConfig({
     },
 
     routeRules: {
-        '/exercices': {ssr: false}
+        '/exercices': {ssr: false},
+        '/parcours': {ssr: false}
     },
 
     icon: {
diff --git a/package-lock.json b/package-lock.json
index bcfd805..b7b6f7e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,23 +7,23 @@
       "name": "nuxt-app",
       "hasInstallScript": true,
       "dependencies": {
-        "@iconify-json/material-symbols": "^1.2.13",
-        "@nuxt/eslint": "^0.7.5",
+        "@iconify-json/material-symbols": "^1.2.14",
+        "@nuxt/eslint": "^1.0.0",
         "@nuxt/ui": "^3.0.0-alpha.11",
         "@nuxtjs/leaflet": "^1.2.6",
-        "eslint": "^9.18.0",
+        "eslint": "^9.19.0",
         "leaflet.markercluster": "^1.5.3",
-        "nuxt": "^3.15.2",
-        "valibot": "^1.0.0-beta.14",
+        "nuxt": "^3.15.4",
+        "valibot": "^1.0.0-beta.15",
         "vue": "latest",
         "vue-router": "latest"
       },
       "devDependencies": {
         "@nuxt/test-utils": "^3.15.4",
         "@vue/test-utils": "^2.4.6",
-        "happy-dom": "^16.7.2",
+        "happy-dom": "^16.8.1",
         "typescript": "^5.7.3",
-        "vitest": "^3.0.4"
+        "vitest": "^3.0.5"
       }
     },
     "node_modules/@alloc/quick-lru": {
@@ -1124,9 +1124,9 @@
       }
     },
     "node_modules/@eslint/config-inspector": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/@eslint/config-inspector/-/config-inspector-0.7.1.tgz",
-      "integrity": "sha512-80+MJay0D/Kf2ImH04UOQtnL4141KviU0KNuT34xvQZ0TQ/aAfIzKnx4cc4lxIDOLi/ITCV3BxOQkHRrDULFQw==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@eslint/config-inspector/-/config-inspector-1.0.0.tgz",
+      "integrity": "sha512-fzl4OHQazPSpsT5LIoE5qQV+8m48pdLN92lPdmIZJpQpD+kZmYC5JfxRilj5vcSaVmB9klJ8s81knNyC3hG7Eg==",
       "license": "Apache-2.0",
       "dependencies": {
         "@nodelib/fs.walk": "^3.0.1",
@@ -1135,11 +1135,11 @@
         "chokidar": "^4.0.3",
         "debug": "^4.4.0",
         "esbuild": "^0.24.2",
-        "fast-glob": "^3.3.2",
+        "fast-glob": "^3.3.3",
         "find-up": "^7.0.0",
         "get-port-please": "^3.1.2",
-        "h3": "^1.13.0",
-        "mlly": "^1.7.3",
+        "h3": "^1.13.1",
+        "mlly": "^1.7.4",
         "mrmime": "^2.0.0",
         "open": "^10.1.0",
         "picocolors": "^1.1.1",
@@ -1235,9 +1235,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "9.18.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz",
-      "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==",
+      "version": "9.19.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz",
+      "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==",
       "license": "MIT",
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -1389,9 +1389,9 @@
       }
     },
     "node_modules/@iconify-json/material-symbols": {
-      "version": "1.2.13",
-      "resolved": "https://registry.npmjs.org/@iconify-json/material-symbols/-/material-symbols-1.2.13.tgz",
-      "integrity": "sha512-7sVem5paCT87e1Hvk9tA2CHcmTSCwlJj6UlhouyNfgAqoC0W/Yj2vA9NFOdjviHgvoHT9kDCEfKxT5tpEMH6qA==",
+      "version": "1.2.14",
+      "resolved": "https://registry.npmjs.org/@iconify-json/material-symbols/-/material-symbols-1.2.14.tgz",
+      "integrity": "sha512-S0AAFFQPVr8Dkrprspz/otNjxdD3rJRXDGZjbO8a8zn8ZR5mO8jAF81lVoTfUWxPH6SCtH2lK1JQGXHGPxld7g==",
       "license": "Apache-2.0",
       "dependencies": {
         "@iconify/types": "*"
@@ -1775,29 +1775,29 @@
       }
     },
     "node_modules/@nuxt/cli": {
-      "version": "3.20.0",
-      "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.20.0.tgz",
-      "integrity": "sha512-TmQPjIHXJFPTssPMMFuLF48nr9cm6ctaNwrnhDFl4xLunfLR4rrMJNJAQhepWyukg970ZgokZVbUYMqf6eCnTQ==",
+      "version": "3.21.1",
+      "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.21.1.tgz",
+      "integrity": "sha512-GFFHSEtNtf1s4anMKWFfKSbKiNvEwOKxfP3uls7anZ8GCVYrKthMMxeou4fZBcRhTAFbiLC7DytsKnjfmY2t9w==",
       "license": "MIT",
       "dependencies": {
         "c12": "^2.0.1",
         "chokidar": "^4.0.3",
         "citty": "^0.1.6",
         "clipboardy": "^4.0.0",
-        "consola": "^3.3.3",
+        "consola": "^3.4.0",
         "defu": "^6.1.4",
         "fuse.js": "^7.0.0",
-        "giget": "^1.2.3",
-        "h3": "^1.13.0",
-        "httpxy": "^0.1.5",
+        "giget": "^1.2.4",
+        "h3": "^1.14.0",
+        "httpxy": "^0.1.7",
         "jiti": "^2.4.2",
         "listhen": "^1.9.0",
-        "nypm": "^0.4.1",
+        "nypm": "^0.5.2",
         "ofetch": "^1.4.1",
         "ohash": "^1.1.4",
-        "pathe": "^2.0.1",
+        "pathe": "^2.0.2",
         "perfect-debounce": "^1.0.0",
-        "pkg-types": "^1.3.0",
+        "pkg-types": "^1.3.1",
         "scule": "^1.3.0",
         "semver": "^7.6.3",
         "std-env": "^3.8.0",
@@ -1814,32 +1814,6 @@
         "node": "^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/@nuxt/cli/node_modules/nypm": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.4.1.tgz",
-      "integrity": "sha512-1b9mihliBh8UCcKtcGRu//G50iHpjxIQVUqkdhPT/SDVE7KdJKoHXLS0heuYTQCx95dFqiyUbXZB9r8ikn+93g==",
-      "license": "MIT",
-      "dependencies": {
-        "citty": "^0.1.6",
-        "consola": "^3.2.3",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.2.1",
-        "tinyexec": "^0.3.1",
-        "ufo": "^1.5.4"
-      },
-      "bin": {
-        "nypm": "dist/cli.mjs"
-      },
-      "engines": {
-        "node": "^14.16.0 || >=16.10.0"
-      }
-    },
-    "node_modules/@nuxt/cli/node_modules/nypm/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
-    },
     "node_modules/@nuxt/devalue": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz",
@@ -1980,29 +1954,29 @@
       }
     },
     "node_modules/@nuxt/eslint": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@nuxt/eslint/-/eslint-0.7.5.tgz",
-      "integrity": "sha512-xK6ZhESR5G5ML5f1uKy99aMFoKxdDE7uzxpRFKGoJdXReTRBuBiWPmSn2xsD1K69cnZZ76J1YZN9wmLHH3nnBg==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@nuxt/eslint/-/eslint-1.0.0.tgz",
+      "integrity": "sha512-RtVvRM+rv9q4x9nZVHkVo7X0gRvockZm6b5EYshO0A0qjughD3fj7N1sSYxvyO9n8IBxrnWT5jHa+2txdzuthg==",
       "license": "MIT",
       "dependencies": {
-        "@eslint/config-inspector": "^0.7.1",
+        "@eslint/config-inspector": "^1.0.0",
         "@nuxt/devtools-kit": "^1.7.0",
-        "@nuxt/eslint-config": "0.7.5",
-        "@nuxt/eslint-plugin": "0.7.5",
-        "@nuxt/kit": "^3.15.1",
+        "@nuxt/eslint-config": "1.0.0",
+        "@nuxt/eslint-plugin": "1.0.0",
+        "@nuxt/kit": "^3.15.4",
         "chokidar": "^4.0.3",
-        "eslint-flat-config-utils": "^1.0.0",
+        "eslint-flat-config-utils": "^2.0.0",
         "eslint-typegen": "^1.0.0",
         "find-up": "^7.0.0",
         "get-port-please": "^3.1.2",
-        "mlly": "^1.7.3",
-        "pathe": "^2.0.0",
-        "unimport": "^3.14.5"
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.2",
+        "unimport": "^4.0.0"
       },
       "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0",
+        "eslint": "^9.0.0",
         "eslint-webpack-plugin": "^4.1.0",
-        "vite-plugin-eslint2": "^4.4.0 || ^5.0.0"
+        "vite-plugin-eslint2": "^5.0.0"
       },
       "peerDependenciesMeta": {
         "eslint-webpack-plugin": {
@@ -2014,34 +1988,34 @@
       }
     },
     "node_modules/@nuxt/eslint-config": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@nuxt/eslint-config/-/eslint-config-0.7.5.tgz",
-      "integrity": "sha512-nUMMiVNZ7qk7FP5Uev/zuTZoTwBnlfr0qSt355aw21SoUkXw0YFRFsImdzkjnEN7kQjgZj0PcCJs/ejv8mRROg==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@nuxt/eslint-config/-/eslint-config-1.0.0.tgz",
+      "integrity": "sha512-Bxvx6y68WqLkubKv9zDP7mdl82ljO7Zmqi13RWveGTvFt61BwP4bQIF10s8r1rfE+2svDN8d0L9eIDoDHtHZQg==",
       "license": "MIT",
       "dependencies": {
         "@antfu/install-pkg": "^1.0.0",
         "@clack/prompts": "^0.9.1",
-        "@eslint/js": "^9.17.0",
-        "@nuxt/eslint-plugin": "0.7.5",
-        "@stylistic/eslint-plugin": "^2.12.1",
-        "@typescript-eslint/eslint-plugin": "^8.19.1",
-        "@typescript-eslint/parser": "^8.19.1",
-        "eslint-config-flat-gitignore": "0.2.0",
-        "eslint-flat-config-utils": "^1.0.0",
+        "@eslint/js": "^9.19.0",
+        "@nuxt/eslint-plugin": "1.0.0",
+        "@stylistic/eslint-plugin": "^3.0.1",
+        "@typescript-eslint/eslint-plugin": "^8.22.0",
+        "@typescript-eslint/parser": "^8.22.0",
+        "eslint-config-flat-gitignore": "^2.0.0",
+        "eslint-flat-config-utils": "^2.0.0",
         "eslint-merge-processors": "^1.0.0",
         "eslint-plugin-import-x": "^4.6.1",
-        "eslint-plugin-jsdoc": "^50.6.1",
+        "eslint-plugin-jsdoc": "^50.6.3",
         "eslint-plugin-regexp": "^2.7.0",
         "eslint-plugin-unicorn": "^56.0.1",
         "eslint-plugin-vue": "^9.32.0",
-        "eslint-processor-vue-blocks": "^0.1.2",
+        "eslint-processor-vue-blocks": "^1.0.0",
         "globals": "^15.14.0",
-        "local-pkg": "^0.5.1",
-        "pathe": "^2.0.0",
+        "local-pkg": "^1.0.0",
+        "pathe": "^2.0.2",
         "vue-eslint-parser": "^9.4.3"
       },
       "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0",
+        "eslint": "^9.0.0",
         "eslint-plugin-format": "*"
       },
       "peerDependenciesMeta": {
@@ -2050,17 +2024,86 @@
         }
       }
     },
+    "node_modules/@nuxt/eslint-config/node_modules/local-pkg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
+      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
+      "license": "MIT",
+      "dependencies": {
+        "mlly": "^1.7.3",
+        "pkg-types": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
     "node_modules/@nuxt/eslint-plugin": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/@nuxt/eslint-plugin/-/eslint-plugin-0.7.5.tgz",
-      "integrity": "sha512-EBb9KiUbnGK6yJnOmGAaURS8NTfNaMXHiAyRtEmLTtj/IwNqFUtgoDLFqBDBCGIjd8my2WA1m9HjQK/+la9Z0Q==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/@nuxt/eslint-plugin/-/eslint-plugin-1.0.0.tgz",
+      "integrity": "sha512-mYkq6V3xCVwnJxiwqTYfEe3HYV/Nxayes9cqY5maijSMJSCSI8l73FYWal2HFvsSoqilYhN4EfgzCHPhyWHqQQ==",
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "^8.19.1",
-        "@typescript-eslint/utils": "^8.19.1"
+        "@typescript-eslint/types": "^8.22.0",
+        "@typescript-eslint/utils": "^8.22.0"
       },
       "peerDependencies": {
-        "eslint": "^8.57.0 || ^9.0.0"
+        "eslint": "^9.0.0"
+      }
+    },
+    "node_modules/@nuxt/eslint/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@nuxt/eslint/node_modules/local-pkg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
+      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
+      "license": "MIT",
+      "dependencies": {
+        "mlly": "^1.7.3",
+        "pkg-types": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@nuxt/eslint/node_modules/unimport": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.0.0.tgz",
+      "integrity": "sha512-FH+yZ36YaVlh0ZjHesP20Q4uL+wL0EqTNxDZcUupsIn6WRYXZAbIYEMDLTaLBpkNVzFpqZXS+am51/HR3ANUNw==",
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.1.4",
+        "acorn": "^8.14.0",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.3",
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.2",
+        "picomatch": "^4.0.2",
+        "pkg-types": "^1.3.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^3.0.0",
+        "unplugin": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=18.12.0"
       }
     },
     "node_modules/@nuxt/fonts": {
@@ -2126,12 +2169,11 @@
       "license": "MIT"
     },
     "node_modules/@nuxt/kit": {
-      "version": "3.15.2",
-      "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.2.tgz",
-      "integrity": "sha512-nxiPJVz2fICcyBKlN5pL1IgZVejyArulREsS5HvAk07hijlYuZ5toRM8soLt51VQNpFd/PedL+Z1AlYu/bQCYQ==",
+      "version": "3.15.4",
+      "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.4.tgz",
+      "integrity": "sha512-dr7I7eZOoRLl4uxdxeL2dQsH0OrbEiVPIyBHnBpA4co24CBnoJoF+JINuP9l3PAM3IhUzc5JIVq3/YY3lEc3Hw==",
       "license": "MIT",
       "dependencies": {
-        "@nuxt/schema": "3.15.2",
         "c12": "^2.0.1",
         "consola": "^3.4.0",
         "defu": "^6.1.4",
@@ -2143,29 +2185,82 @@
         "knitwork": "^1.2.0",
         "mlly": "^1.7.4",
         "ohash": "^1.1.4",
-        "pathe": "^2.0.1",
+        "pathe": "^2.0.2",
         "pkg-types": "^1.3.1",
         "scule": "^1.3.0",
         "semver": "^7.6.3",
         "std-env": "^3.8.0",
         "ufo": "^1.5.4",
         "unctx": "^2.4.1",
-        "unimport": "^3.14.6",
+        "unimport": "^4.0.0",
         "untyped": "^1.5.2"
       },
       "engines": {
-        "node": ">=18.0.0"
+        "node": ">=18.12.0"
+      }
+    },
+    "node_modules/@nuxt/kit/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@nuxt/kit/node_modules/local-pkg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
+      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
+      "license": "MIT",
+      "dependencies": {
+        "mlly": "^1.7.3",
+        "pkg-types": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@nuxt/kit/node_modules/unimport": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.0.0.tgz",
+      "integrity": "sha512-FH+yZ36YaVlh0ZjHesP20Q4uL+wL0EqTNxDZcUupsIn6WRYXZAbIYEMDLTaLBpkNVzFpqZXS+am51/HR3ANUNw==",
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.1.4",
+        "acorn": "^8.14.0",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.3",
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.2",
+        "picomatch": "^4.0.2",
+        "pkg-types": "^1.3.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^3.0.0",
+        "unplugin": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=18.12.0"
       }
     },
     "node_modules/@nuxt/schema": {
-      "version": "3.15.2",
-      "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.2.tgz",
-      "integrity": "sha512-cTHGbLTbrQ83B+7Mh0ggc5MzIp74o8KciA0boCiBJyK5uImH9QQNK6VgfwRWcTD5sj3WNKiIB1luOMom3LHgVw==",
+      "version": "3.15.4",
+      "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.4.tgz",
+      "integrity": "sha512-pAYZb/3ocSC/db1EFd5y+otmgHqUkvfxfhd9EknDB5DygnJuOIQNuGJ7LMJM6S2c0DYgBIHOdEelLxKHOjwbgQ==",
       "license": "MIT",
       "dependencies": {
         "consola": "^3.4.0",
         "defu": "^6.1.4",
-        "pathe": "^2.0.1",
+        "pathe": "^2.0.2",
         "std-env": "^3.8.0"
       },
       "engines": {
@@ -2355,12 +2450,12 @@
       }
     },
     "node_modules/@nuxt/vite-builder": {
-      "version": "3.15.2",
-      "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.15.2.tgz",
-      "integrity": "sha512-YtP6hIOKhqa1JhX0QzuULpA84lseO76bv5OqJzUl7yoaykhOkZjkEk9c20hamtMdoxhVeUAXGZJCsp9Ivjfb3g==",
+      "version": "3.15.4",
+      "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.15.4.tgz",
+      "integrity": "sha512-yBK6tWT973+ExKC3ciTWymZpjJ+enToOtYz574kXCyGO0PbSnuXdoJKTvrwXw1lK97PajCKxExlmwI/3oLOmMQ==",
       "license": "MIT",
       "dependencies": {
-        "@nuxt/kit": "3.15.2",
+        "@nuxt/kit": "3.15.4",
         "@rollup/plugin-replace": "^6.0.2",
         "@vitejs/plugin-vue": "^5.2.1",
         "@vitejs/plugin-vue-jsx": "^4.1.1",
@@ -2372,13 +2467,13 @@
         "escape-string-regexp": "^5.0.0",
         "externality": "^1.0.2",
         "get-port-please": "^3.1.2",
-        "h3": "^1.13.1",
+        "h3": "^1.14.0",
         "jiti": "^2.4.2",
         "knitwork": "^1.2.0",
         "magic-string": "^0.30.17",
         "mlly": "^1.7.4",
         "ohash": "^1.1.4",
-        "pathe": "^2.0.1",
+        "pathe": "^2.0.2",
         "perfect-debounce": "^1.0.0",
         "pkg-types": "^1.3.1",
         "postcss": "^8.5.1",
@@ -2387,8 +2482,8 @@
         "ufo": "^1.5.4",
         "unenv": "^1.10.0",
         "unplugin": "^2.1.2",
-        "vite": "^6.0.7",
-        "vite-node": "^2.1.8",
+        "vite": "^6.0.11",
+        "vite-node": "^3.0.4",
         "vite-plugin-checker": "^0.8.0",
         "vue-bundle-renderer": "^2.1.1"
       },
@@ -3300,9 +3395,9 @@
       }
     },
     "node_modules/@stylistic/eslint-plugin": {
-      "version": "2.13.0",
-      "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz",
-      "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-3.0.1.tgz",
+      "integrity": "sha512-rQ3tcT5N2cynofJfbjUsnL4seoewTaOVBLyUEwtNldo7iNMPo3h/GUQk+Cl3iHEWwRxjq2wuH6q0FufQrbVL1A==",
       "license": "MIT",
       "dependencies": {
         "@typescript-eslint/utils": "^8.13.0",
@@ -3732,16 +3827,16 @@
       "license": "MIT"
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.21.0.tgz",
-      "integrity": "sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz",
+      "integrity": "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==",
       "license": "MIT",
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.21.0",
-        "@typescript-eslint/type-utils": "8.21.0",
-        "@typescript-eslint/utils": "8.21.0",
-        "@typescript-eslint/visitor-keys": "8.21.0",
+        "@typescript-eslint/scope-manager": "8.22.0",
+        "@typescript-eslint/type-utils": "8.22.0",
+        "@typescript-eslint/utils": "8.22.0",
+        "@typescript-eslint/visitor-keys": "8.22.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -3770,15 +3865,15 @@
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.21.0.tgz",
-      "integrity": "sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.22.0.tgz",
+      "integrity": "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==",
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.21.0",
-        "@typescript-eslint/types": "8.21.0",
-        "@typescript-eslint/typescript-estree": "8.21.0",
-        "@typescript-eslint/visitor-keys": "8.21.0",
+        "@typescript-eslint/scope-manager": "8.22.0",
+        "@typescript-eslint/types": "8.22.0",
+        "@typescript-eslint/typescript-estree": "8.22.0",
+        "@typescript-eslint/visitor-keys": "8.22.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -3794,13 +3889,13 @@
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.21.0.tgz",
-      "integrity": "sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz",
+      "integrity": "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==",
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.21.0",
-        "@typescript-eslint/visitor-keys": "8.21.0"
+        "@typescript-eslint/types": "8.22.0",
+        "@typescript-eslint/visitor-keys": "8.22.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3811,13 +3906,13 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.21.0.tgz",
-      "integrity": "sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz",
+      "integrity": "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==",
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.21.0",
-        "@typescript-eslint/utils": "8.21.0",
+        "@typescript-eslint/typescript-estree": "8.22.0",
+        "@typescript-eslint/utils": "8.22.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.0.0"
       },
@@ -3834,9 +3929,9 @@
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.21.0.tgz",
-      "integrity": "sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.22.0.tgz",
+      "integrity": "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==",
       "license": "MIT",
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3847,13 +3942,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.21.0.tgz",
-      "integrity": "sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz",
+      "integrity": "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==",
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.21.0",
-        "@typescript-eslint/visitor-keys": "8.21.0",
+        "@typescript-eslint/types": "8.22.0",
+        "@typescript-eslint/visitor-keys": "8.22.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -3873,15 +3968,15 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.21.0.tgz",
-      "integrity": "sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.22.0.tgz",
+      "integrity": "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==",
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.21.0",
-        "@typescript-eslint/types": "8.21.0",
-        "@typescript-eslint/typescript-estree": "8.21.0"
+        "@typescript-eslint/scope-manager": "8.22.0",
+        "@typescript-eslint/types": "8.22.0",
+        "@typescript-eslint/typescript-estree": "8.22.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3896,12 +3991,12 @@
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.21.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.21.0.tgz",
-      "integrity": "sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==",
+      "version": "8.22.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz",
+      "integrity": "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==",
       "license": "MIT",
       "dependencies": {
-        "@typescript-eslint/types": "8.21.0",
+        "@typescript-eslint/types": "8.22.0",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -4055,14 +4150,14 @@
       }
     },
     "node_modules/@vitest/expect": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.4.tgz",
-      "integrity": "sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz",
+      "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.4",
-        "@vitest/utils": "3.0.4",
+        "@vitest/spy": "3.0.5",
+        "@vitest/utils": "3.0.5",
         "chai": "^5.1.2",
         "tinyrainbow": "^2.0.0"
       },
@@ -4071,13 +4166,13 @@
       }
     },
     "node_modules/@vitest/mocker": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.4.tgz",
-      "integrity": "sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz",
+      "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/spy": "3.0.4",
+        "@vitest/spy": "3.0.5",
         "estree-walker": "^3.0.3",
         "magic-string": "^0.30.17"
       },
@@ -4098,9 +4193,9 @@
       }
     },
     "node_modules/@vitest/pretty-format": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.4.tgz",
-      "integrity": "sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz",
+      "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4111,13 +4206,13 @@
       }
     },
     "node_modules/@vitest/runner": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.4.tgz",
-      "integrity": "sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz",
+      "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/utils": "3.0.4",
+        "@vitest/utils": "3.0.5",
         "pathe": "^2.0.2"
       },
       "funding": {
@@ -4125,13 +4220,13 @@
       }
     },
     "node_modules/@vitest/snapshot": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.4.tgz",
-      "integrity": "sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz",
+      "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.4",
+        "@vitest/pretty-format": "3.0.5",
         "magic-string": "^0.30.17",
         "pathe": "^2.0.2"
       },
@@ -4140,9 +4235,9 @@
       }
     },
     "node_modules/@vitest/spy": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.4.tgz",
-      "integrity": "sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz",
+      "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -4153,13 +4248,13 @@
       }
     },
     "node_modules/@vitest/utils": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.4.tgz",
-      "integrity": "sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz",
+      "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/pretty-format": "3.0.4",
+        "@vitest/pretty-format": "3.0.5",
         "loupe": "^3.1.2",
         "tinyrainbow": "^2.0.0"
       },
@@ -6503,9 +6598,9 @@
       }
     },
     "node_modules/eslint": {
-      "version": "9.18.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz",
-      "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==",
+      "version": "9.19.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz",
+      "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==",
       "license": "MIT",
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
@@ -6513,7 +6608,7 @@
         "@eslint/config-array": "^0.19.0",
         "@eslint/core": "^0.10.0",
         "@eslint/eslintrc": "^3.2.0",
-        "@eslint/js": "9.18.0",
+        "@eslint/js": "9.19.0",
         "@eslint/plugin-kit": "^0.2.5",
         "@humanfs/node": "^0.16.6",
         "@humanwhocodes/module-importer": "^1.0.1",
@@ -6562,25 +6657,27 @@
       }
     },
     "node_modules/eslint-config-flat-gitignore": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-0.2.0.tgz",
-      "integrity": "sha512-s4lsQLYX+76FCt3PZPwdLwWlqssa5SLufl2gopFmCo3PETOLY3OW5IrD3/l2R0FfYEJvd9BRJ19yJ+yfc5oW3g==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.0.0.tgz",
+      "integrity": "sha512-9iH+DZO94uxsw5iFjzqa9GfahA5oK3nA1GoJK/6u8evAtooYJMwuSWiLcGDfrdLoqdQ5/kqFJKKuMY/+SAasvg==",
       "license": "MIT",
       "dependencies": {
-        "@eslint/compat": "^1.1.1",
-        "find-up-simple": "^1.0.0"
+        "@eslint/compat": "^1.2.5"
       },
       "funding": {
         "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "eslint": "^9.5.0"
       }
     },
     "node_modules/eslint-flat-config-utils": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-1.1.0.tgz",
-      "integrity": "sha512-W49wz7yQJGRfg4QSV3nwdO/fYcWetiSKhLV5YykfQMcqnIATNpoS7EPdINhLB9P3fmdjNmFtOgZjiKnCndWAnw==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-2.0.0.tgz",
+      "integrity": "sha512-AbpYwI9FBmjF6BQ8UcaDCrM750DWEB6UJzEjQEg+iWFP6UX9rGsUGJlMf7sWbW3dOA0klUEwmWGZa5FoynXU/w==",
       "license": "MIT",
       "dependencies": {
-        "pathe": "^2.0.0"
+        "pathe": "^2.0.2"
       },
       "funding": {
         "url": "https://github.com/sponsors/antfu"
@@ -6646,9 +6743,9 @@
       }
     },
     "node_modules/eslint-plugin-jsdoc": {
-      "version": "50.6.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.2.tgz",
-      "integrity": "sha512-n7GNZ4czMAAbDg7DsDA7PvHo1IPIUwAXYmxTx6j/hTlXbt5V0x5q/kGkiJ7s4wA9SpB/yaiK8jF7CO237lOLew==",
+      "version": "50.6.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.3.tgz",
+      "integrity": "sha512-NxbJyt1M5zffPcYZ8Nb53/8nnbIScmiLAMdoe0/FAszwb7lcSiX3iYBTsuF7RV84dZZJC8r3NghomrUXsmWvxQ==",
       "license": "BSD-3-Clause",
       "dependencies": {
         "@es-joy/jsdoccomment": "~0.49.0",
@@ -6774,9 +6871,9 @@
       }
     },
     "node_modules/eslint-processor-vue-blocks": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-0.1.2.tgz",
-      "integrity": "sha512-PfpJ4uKHnqeL/fXUnzYkOax3aIenlwewXRX8jFinA1a2yCFnLgMuiH3xvCgvHHUlV2xJWQHbCTdiJWGwb3NqpQ==",
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-1.0.0.tgz",
+      "integrity": "sha512-q+Wn9bCml65NwYtuINVCE5dUqZa/uVoY4jfc8qEDwWbcGqdRyfJJmAONNZsreA4Q9EJqjYGjk8Hk1QuwAktgkw==",
       "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/antfu"
@@ -7308,18 +7405,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/find-up-simple": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz",
-      "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/flat-cache": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
@@ -7565,30 +7650,24 @@
       }
     },
     "node_modules/giget": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz",
-      "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.4.tgz",
+      "integrity": "sha512-Wv+daGyispVoA31TrWAVR+aAdP7roubTPEM/8JzRnqXhLbdJH0T9eQyXVFF8fjk3WKTsctII6QcyxILYgNp2DA==",
       "license": "MIT",
       "dependencies": {
         "citty": "^0.1.6",
-        "consola": "^3.2.3",
+        "consola": "^3.4.0",
         "defu": "^6.1.4",
-        "node-fetch-native": "^1.6.3",
-        "nypm": "^0.3.8",
-        "ohash": "^1.1.3",
-        "pathe": "^1.1.2",
-        "tar": "^6.2.0"
+        "node-fetch-native": "^1.6.6",
+        "nypm": "^0.5.1",
+        "ohash": "^1.1.4",
+        "pathe": "^2.0.2",
+        "tar": "^6.2.1"
       },
       "bin": {
         "giget": "dist/cli.mjs"
       }
     },
-    "node_modules/giget/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
-    },
     "node_modules/git-config-path": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz",
@@ -7778,9 +7857,9 @@
       }
     },
     "node_modules/happy-dom": {
-      "version": "16.7.2",
-      "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.7.2.tgz",
-      "integrity": "sha512-zOzw0xyYlDaF/ylwbAsduYZZVRTd5u7IwlFkGbEathIeJMLp3vrN3cHm3RS7PZpD9gr/IO16bHEswcgNyWTsqw==",
+      "version": "16.8.1",
+      "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.8.1.tgz",
+      "integrity": "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
@@ -7876,9 +7955,9 @@
       }
     },
     "node_modules/httpxy": {
-      "version": "0.1.6",
-      "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.6.tgz",
-      "integrity": "sha512-GxJLI6oJZ3NbJl/vDlPmTCtP4WHwboNhGLHOcgf/3ia1QC5sdLglWbRHZwQjzjPuiCyw7MWwpwbsUfRDQlOdeg==",
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz",
+      "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==",
       "license": "MIT"
     },
     "node_modules/human-signals": {
@@ -8926,9 +9005,9 @@
       "license": "MIT"
     },
     "node_modules/loupe": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
-      "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
+      "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
       "dev": true,
       "license": "MIT"
     },
@@ -9202,9 +9281,9 @@
       }
     },
     "node_modules/nanotar": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.1.1.tgz",
-      "integrity": "sha512-AiJsGsSF3O0havL1BydvI4+wR76sKT+okKRwWIaK96cZUnXqH0uNBOsHlbwZq3+m2BR1VKqHDVudl3gO4mYjpQ==",
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.2.0.tgz",
+      "integrity": "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==",
       "license": "MIT"
     },
     "node_modules/natural-compare": {
@@ -9535,18 +9614,18 @@
       }
     },
     "node_modules/nuxt": {
-      "version": "3.15.2",
-      "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.15.2.tgz",
-      "integrity": "sha512-1EiQ5wYYVhgkRyaMCyuc4R5lhJtOPJTdOe3LwYNbIol3pmcO1urhNDNKfhiy9zdcA3G14zzN0W/+TqXXidchRw==",
+      "version": "3.15.4",
+      "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.15.4.tgz",
+      "integrity": "sha512-hSbZO4mR0uAMJtZPNTnCfiAtgleoOu28gvJcBNU7KQHgWnNXPjlWgwMczko2O4Tmnv9zIe/CQged+2HsPwl2ZA==",
       "license": "MIT",
       "dependencies": {
-        "@nuxt/cli": "^3.20.0",
+        "@nuxt/cli": "^3.21.1",
         "@nuxt/devalue": "^2.0.2",
         "@nuxt/devtools": "^1.7.0",
-        "@nuxt/kit": "3.15.2",
-        "@nuxt/schema": "3.15.2",
+        "@nuxt/kit": "3.15.4",
+        "@nuxt/schema": "3.15.4",
         "@nuxt/telemetry": "^2.6.4",
-        "@nuxt/vite-builder": "3.15.2",
+        "@nuxt/vite-builder": "3.15.4",
         "@unhead/dom": "^1.11.18",
         "@unhead/shared": "^1.11.18",
         "@unhead/ssr": "^1.11.18",
@@ -9566,7 +9645,7 @@
         "escape-string-regexp": "^5.0.0",
         "estree-walker": "^3.0.3",
         "globby": "^14.0.2",
-        "h3": "^1.13.1",
+        "h3": "^1.14.0",
         "hookable": "^5.5.3",
         "ignore": "^7.0.3",
         "impound": "^0.2.0",
@@ -9575,12 +9654,12 @@
         "knitwork": "^1.2.0",
         "magic-string": "^0.30.17",
         "mlly": "^1.7.4",
-        "nanotar": "^0.1.1",
+        "nanotar": "^0.2.0",
         "nitropack": "^2.10.4",
-        "nypm": "^0.4.1",
+        "nypm": "^0.5.2",
         "ofetch": "^1.4.1",
         "ohash": "^1.1.4",
-        "pathe": "^2.0.1",
+        "pathe": "^2.0.2",
         "perfect-debounce": "^1.0.0",
         "pkg-types": "^1.3.1",
         "radix3": "^1.1.2",
@@ -9595,9 +9674,9 @@
         "unctx": "^2.4.1",
         "unenv": "^1.10.0",
         "unhead": "^1.11.18",
-        "unimport": "^3.14.6",
+        "unimport": "^4.0.0",
         "unplugin": "^2.1.2",
-        "unplugin-vue-router": "^0.10.9",
+        "unplugin-vue-router": "^0.11.2",
         "unstorage": "^1.14.4",
         "untyped": "^1.5.2",
         "vue": "^3.5.13",
@@ -9637,43 +9716,58 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/nuxt/node_modules/nypm": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.4.1.tgz",
-      "integrity": "sha512-1b9mihliBh8UCcKtcGRu//G50iHpjxIQVUqkdhPT/SDVE7KdJKoHXLS0heuYTQCx95dFqiyUbXZB9r8ikn+93g==",
+    "node_modules/nuxt/node_modules/local-pkg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
+      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
       "license": "MIT",
       "dependencies": {
-        "citty": "^0.1.6",
-        "consola": "^3.2.3",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.2.1",
-        "tinyexec": "^0.3.1",
-        "ufo": "^1.5.4"
-      },
-      "bin": {
-        "nypm": "dist/cli.mjs"
+        "mlly": "^1.7.3",
+        "pkg-types": "^1.3.0"
       },
       "engines": {
-        "node": "^14.16.0 || >=16.10.0"
-      }
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
     },
-    "node_modules/nuxt/node_modules/nypm/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
+    "node_modules/nuxt/node_modules/unimport": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.0.0.tgz",
+      "integrity": "sha512-FH+yZ36YaVlh0ZjHesP20Q4uL+wL0EqTNxDZcUupsIn6WRYXZAbIYEMDLTaLBpkNVzFpqZXS+am51/HR3ANUNw==",
+      "license": "MIT",
+      "dependencies": {
+        "@rollup/pluginutils": "^5.1.4",
+        "acorn": "^8.14.0",
+        "escape-string-regexp": "^5.0.0",
+        "estree-walker": "^3.0.3",
+        "fast-glob": "^3.3.3",
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.2",
+        "picomatch": "^4.0.2",
+        "pkg-types": "^1.3.1",
+        "scule": "^1.3.0",
+        "strip-literal": "^3.0.0",
+        "unplugin": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=18.12.0"
+      }
     },
     "node_modules/nypm": {
-      "version": "0.3.12",
-      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.12.tgz",
-      "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==",
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.2.tgz",
+      "integrity": "sha512-AHzvnyUJYSrrphPhRWWZNcoZfArGNp3Vrc4pm/ZurO74tYNTgAPrEyBQEKy+qioqmWlPXwvMZCG2wOaHlPG0Pw==",
       "license": "MIT",
       "dependencies": {
         "citty": "^0.1.6",
-        "consola": "^3.2.3",
-        "execa": "^8.0.1",
-        "pathe": "^1.1.2",
-        "pkg-types": "^1.2.0",
+        "consola": "^3.4.0",
+        "pathe": "^2.0.2",
+        "pkg-types": "^1.3.1",
+        "tinyexec": "^0.3.2",
         "ufo": "^1.5.4"
       },
       "bin": {
@@ -9683,68 +9777,6 @@
         "node": "^14.16.0 || >=16.10.0"
       }
     },
-    "node_modules/nypm/node_modules/execa": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
-      "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
-      "license": "MIT",
-      "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^8.0.1",
-        "human-signals": "^5.0.0",
-        "is-stream": "^3.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^5.1.0",
-        "onetime": "^6.0.0",
-        "signal-exit": "^4.1.0",
-        "strip-final-newline": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=16.17"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
-      }
-    },
-    "node_modules/nypm/node_modules/get-stream": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
-      "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/nypm/node_modules/human-signals": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
-      "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=16.17.0"
-      }
-    },
-    "node_modules/nypm/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
-    },
-    "node_modules/nypm/node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
     "node_modules/ofetch": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz",
@@ -12709,25 +12741,25 @@
       }
     },
     "node_modules/unplugin-vue-router": {
-      "version": "0.10.9",
-      "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.10.9.tgz",
-      "integrity": "sha512-DXmC0GMcROOnCmN56GRvi1bkkG1BnVs4xJqNvucBUeZkmB245URvtxOfbo3H6q4SOUQQbLPYWd6InzvjRh363A==",
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.11.2.tgz",
+      "integrity": "sha512-X8BbQ3BNnMqaCYeMj80jtz5jC4AB0jcpdmECIYey9qKm6jy/upaPZ/WzfuT+iTGRiQAY4WemHueXxuzH127oOg==",
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.0",
-        "@rollup/pluginutils": "^5.1.3",
-        "@vue-macros/common": "^1.15.0",
+        "@babel/types": "^7.26.5",
+        "@rollup/pluginutils": "^5.1.4",
+        "@vue-macros/common": "^1.16.1",
         "ast-walker-scope": "^0.6.2",
         "chokidar": "^3.6.0",
-        "fast-glob": "^3.3.2",
+        "fast-glob": "^3.3.3",
         "json5": "^2.2.3",
-        "local-pkg": "^0.5.1",
-        "magic-string": "^0.30.14",
-        "mlly": "^1.7.3",
-        "pathe": "^1.1.2",
+        "local-pkg": "^1.0.0",
+        "magic-string": "^0.30.17",
+        "mlly": "^1.7.4",
+        "pathe": "^2.0.2",
         "scule": "^1.3.0",
-        "unplugin": "2.0.0-beta.1",
-        "yaml": "^2.6.1"
+        "unplugin": "2.1.2",
+        "yaml": "^2.7.0"
       },
       "peerDependencies": {
         "vue-router": "^4.4.0"
@@ -12774,11 +12806,21 @@
         "node": ">= 6"
       }
     },
-    "node_modules/unplugin-vue-router/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
+    "node_modules/unplugin-vue-router/node_modules/local-pkg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz",
+      "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==",
+      "license": "MIT",
+      "dependencies": {
+        "mlly": "^1.7.3",
+        "pkg-types": "^1.3.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
     },
     "node_modules/unplugin-vue-router/node_modules/picomatch": {
       "version": "2.3.1",
@@ -12804,19 +12846,6 @@
         "node": ">=8.10.0"
       }
     },
-    "node_modules/unplugin-vue-router/node_modules/unplugin": {
-      "version": "2.0.0-beta.1",
-      "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.0.0-beta.1.tgz",
-      "integrity": "sha512-2qzQo5LN2DmUZXkWDHvGKLF5BP0WN+KthD6aPnPJ8plRBIjv4lh5O07eYcSxgO2znNw9s4MNhEO1sB+JDllDbQ==",
-      "license": "MIT",
-      "dependencies": {
-        "acorn": "^8.14.0",
-        "webpack-virtual-modules": "^0.6.2"
-      },
-      "engines": {
-        "node": ">=18.12.0"
-      }
-    },
     "node_modules/unstorage": {
       "version": "1.14.4",
       "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.14.4.tgz",
@@ -13111,9 +13140,9 @@
       "license": "MIT"
     },
     "node_modules/valibot": {
-      "version": "1.0.0-beta.14",
-      "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.0.0-beta.14.tgz",
-      "integrity": "sha512-tLyV2rE5QL6U29MFy3xt4AqMrn+/HErcp2ZThASnQvPMwfSozjV1uBGKIGiegtZIGjinJqn0SlBdannf18wENA==",
+      "version": "1.0.0-beta.15",
+      "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.0.0-beta.15.tgz",
+      "integrity": "sha512-BKy8XosZkDHWmYC+cJG74LBzP++Gfntwi33pP3D3RKztz2XV9jmFWnkOi21GoqARP8wAWARwhV6eTr1JcWzjGw==",
       "license": "MIT",
       "peerDependencies": {
         "typescript": ">=5"
@@ -13330,498 +13359,27 @@
       }
     },
     "node_modules/vite-node": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz",
-      "integrity": "sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz",
+      "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==",
       "license": "MIT",
       "dependencies": {
         "cac": "^6.7.14",
-        "debug": "^4.3.7",
-        "es-module-lexer": "^1.5.4",
-        "pathe": "^1.1.2",
-        "vite": "^5.0.0"
+        "debug": "^4.4.0",
+        "es-module-lexer": "^1.6.0",
+        "pathe": "^2.0.2",
+        "vite": "^5.0.0 || ^6.0.0"
       },
       "bin": {
         "vite-node": "vite-node.mjs"
       },
       "engines": {
-        "node": "^18.0.0 || >=20.0.0"
+        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
       },
       "funding": {
         "url": "https://opencollective.com/vitest"
       }
     },
-    "node_modules/vite-node/node_modules/@esbuild/aix-ppc64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/android-arm": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/android-arm64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/android-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
-      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/darwin-arm64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/darwin-x64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/freebsd-arm64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/freebsd-x64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
-      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
-      "cpu": [
-        "arm"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-arm64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
-      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
-      "cpu": [
-        "ia32"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-loong64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
-      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
-      "cpu": [
-        "mips64el"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-ppc64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-riscv64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-s390x": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
-      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
-      "cpu": [
-        "s390x"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/linux-x64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
-      "cpu": [
-        "x64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/sunos-x64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/win32-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
-      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
-      "cpu": [
-        "arm64"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/win32-ia32": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/@esbuild/win32-x64": {
-      "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"
-      ],
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite-node/node_modules/esbuild": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
-      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@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/vite-node/node_modules/pathe": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
-      "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
-      "license": "MIT"
-    },
-    "node_modules/vite-node/node_modules/vite": {
-      "version": "5.4.14",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
-      "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
-      "license": "MIT",
-      "dependencies": {
-        "esbuild": "^0.21.3",
-        "postcss": "^8.4.43",
-        "rollup": "^4.20.0"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^18.0.0 || >=20.0.0",
-        "less": "*",
-        "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.4.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/vite-plugin-checker": {
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz",
@@ -14085,19 +13643,19 @@
       }
     },
     "node_modules/vitest": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.4.tgz",
-      "integrity": "sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz",
+      "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==",
       "dev": true,
       "license": "MIT",
       "dependencies": {
-        "@vitest/expect": "3.0.4",
-        "@vitest/mocker": "3.0.4",
-        "@vitest/pretty-format": "^3.0.4",
-        "@vitest/runner": "3.0.4",
-        "@vitest/snapshot": "3.0.4",
-        "@vitest/spy": "3.0.4",
-        "@vitest/utils": "3.0.4",
+        "@vitest/expect": "3.0.5",
+        "@vitest/mocker": "3.0.5",
+        "@vitest/pretty-format": "^3.0.5",
+        "@vitest/runner": "3.0.5",
+        "@vitest/snapshot": "3.0.5",
+        "@vitest/spy": "3.0.5",
+        "@vitest/utils": "3.0.5",
         "chai": "^5.1.2",
         "debug": "^4.4.0",
         "expect-type": "^1.1.0",
@@ -14109,7 +13667,7 @@
         "tinypool": "^1.0.2",
         "tinyrainbow": "^2.0.0",
         "vite": "^5.0.0 || ^6.0.0",
-        "vite-node": "3.0.4",
+        "vite-node": "3.0.5",
         "why-is-node-running": "^2.3.0"
       },
       "bin": {
@@ -14125,8 +13683,8 @@
         "@edge-runtime/vm": "*",
         "@types/debug": "^4.1.12",
         "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
-        "@vitest/browser": "3.0.4",
-        "@vitest/ui": "3.0.4",
+        "@vitest/browser": "3.0.5",
+        "@vitest/ui": "3.0.5",
         "happy-dom": "*",
         "jsdom": "*"
       },
@@ -14164,29 +13722,6 @@
         "@nuxt/test-utils": ">=3.13.1"
       }
     },
-    "node_modules/vitest/node_modules/vite-node": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.4.tgz",
-      "integrity": "sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cac": "^6.7.14",
-        "debug": "^4.4.0",
-        "es-module-lexer": "^1.6.0",
-        "pathe": "^2.0.2",
-        "vite": "^5.0.0 || ^6.0.0"
-      },
-      "bin": {
-        "vite-node": "vite-node.mjs"
-      },
-      "engines": {
-        "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/vitest"
-      }
-    },
     "node_modules/vscode-jsonrpc": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz",
diff --git a/package.json b/package.json
index 360855a..ed2f66b 100644
--- a/package.json
+++ b/package.json
@@ -14,23 +14,23 @@
     "test": "node_modules/.bin/vitest run --passWithNoTests"
   },
   "dependencies": {
-    "@iconify-json/material-symbols": "^1.2.13",
-    "@nuxt/eslint": "^0.7.5",
+    "@iconify-json/material-symbols": "^1.2.14",
+    "@nuxt/eslint": "^1.0.0",
     "@nuxt/ui": "^3.0.0-alpha.11",
     "@nuxtjs/leaflet": "^1.2.6",
-    "eslint": "^9.18.0",
+    "eslint": "^9.19.0",
     "leaflet.markercluster": "^1.5.3",
-    "nuxt": "^3.15.2",
-    "valibot": "^1.0.0-beta.14",
+    "nuxt": "^3.15.4",
+    "valibot": "^1.0.0-beta.15",
     "vue": "latest",
     "vue-router": "latest"
   },
   "devDependencies": {
     "@nuxt/test-utils": "^3.15.4",
     "@vue/test-utils": "^2.4.6",
-    "happy-dom": "^16.7.2",
+    "happy-dom": "^16.8.1",
     "typescript": "^5.7.3",
-    "vitest": "^3.0.4"
+    "vitest": "^3.0.5"
   },
   "overrides": {
     "glob": "^11.0.1"
diff --git a/pages/exercices.vue b/pages/exercices.vue
index 58d4ef2..e27fb6a 100644
--- a/pages/exercices.vue
+++ b/pages/exercices.vue
@@ -1,22 +1,43 @@
 <script setup lang="ts">
 import L, {type LeafletMouseEvent, Marker, type PointTuple} from 'leaflet';
 import 'leaflet.markercluster';
+import myData from '../data/mock/exercices.json';
+import type Exercise from "~/types/Exercice";
 
 const map = ref(null) as any;
 const inCreation = ref(false);
+const exercises = ref(myData);
 
 // TODO : Move to a separate file
 interface MarkerCluster {
-    markerCluster: any;
+    markerCluster: L.LayerGroup;
+    // markerCluster: L.Map;
     markers: Marker[];
+    // options?: L.MarkerClusterGroupOptions;
 }
 
-let markerCluster: MarkerCluster;
+let _markerCluster: MarkerCluster;
+let newMarkerCluster: MarkerCluster;
 
 // DATA
 const zoom = ref(17)
 const chantrerie: PointTuple = [47.287, -1.524]
 
+const locations2: any = myData.map((exo) => {
+    return {
+        name: exo.id,
+        lat: exo.lat,
+        lng: exo.lng,
+        options: {
+            icon: L.icon({
+                iconUrl: '/svg/pin.svg',
+                iconSize: [30, 30],
+            })
+        },
+        popup: exo.name
+    }
+})
+
 const locations = [
     {
         name: 'Chantrerie',
@@ -73,15 +94,27 @@ const items = ref([
 
 // Functions
 async function onMapReady() {
-    markerCluster = await useLMarkerCluster({
+    _markerCluster = await useLMarkerCluster({
         leafletObject: map?.value?.leafletObject,
         markers: locations
     });
+    newMarkerCluster = await useLMarkerCluster({
+        leafletObject: map?.value?.leafletObject,
+        markers: locations2
+    });
+
+    // newMarkerCluster = L.markerClusterGroup();
+    // map.addLayer(newMarkerCluster);
+
+    map.value.leafletObject.on('moveend', () => {
+        // ask api for new markers in bounds
+        // map.value.leafletObject.getBounds()
+    });
 }
 
 function deleteMarker(): void {
     if (!inCreation.value) return;
-    markerCluster.markerCluster.removeLayer(markerCluster.markerCluster.getLayers().find((layer: Marker) => layer.options.title === 'New marker'));
+    newMarkerCluster.markerCluster.clearLayers();
     inCreation.value = false;
 }
 
@@ -96,28 +129,75 @@ function MapEvents(e: LeafletMouseEvent): void {
         iconUrl: '/svg/pinadd.svg',
         iconSize: [30, 30],
     }));
-    markerCluster.markerCluster.addLayer(newMarker);
+    newMarkerCluster.markerCluster.addLayer(newMarker);
 }
 
+const _cluster_visible = (cluster: any) => L.divIcon({
+    html: `<div style="background-color: red;">${cluster.getChildCount()}</div>`,
+    className: 'marker-cluster',
+    iconSize: L.point(40, 40)
+});
+
+// FIXME : still a lot of works around this
+function hooverMarker(exo: Exercise): void {
+    newMarkerCluster.markers.find((marker: Marker) => {
+        if (marker.getLatLng().lat === exo.lat && marker.getLatLng().lng === exo.lng) {
+            if (map.value.leafletObject.hasLayer(marker)) {
+                // Not in a cluster (ie marker is visible on map)
+                marker.setIcon(L.icon({
+                    iconUrl: '/svg/pin.svg',
+                    iconSize: [45, 45],
+                }));
+            } else {
+                // In a cluster (ie marker is not visible on map)
+                map.value.leafletObject.eachLayer((layer: any) => {
+                    if (layer instanceof L.FeatureGroup && layer.hasLayer(marker)) {
+                        (layer as any).options = {
+                            iconCreateFunction: (cluster: any) => {
+                                return L.divIcon({
+                                    html: `<div style="background-color: red;">${cluster.getChildCount()}</div>`,
+                                    className: 'marker-cluster',
+                                    iconSize: L.point(40, 40)
+                                });
+                            }
+                        }
+                        // console.log((layer as any));
+                        // console.log((layer as any)._markerCluster);
+                        // (newMarkerCluster as any).refreshClusters();
+                        // (layer as any).setIcon(cluster_visible);
+                        // map.value.leafletObject.removeLayer(layer);
+                        // map.value.leafletObject.addLayer(layer);
+                        // (map.value.leafletObject as L.LayerGroup)
+                    }
+                });
+            }
+        }
+    });
+}
+
+function leaveMarker(exo: Exercise): void {
+    newMarkerCluster.markers.find((marker: any) => {
+        if (marker.getLatLng().lat === exo.lat && marker.getLatLng().lng === exo.lng) {
+            marker.setIcon(L.icon({
+                iconUrl: '/svg/pin.svg',
+                iconSize: [30, 30],
+            }));
+        }
+    });
+}
 </script>
 
 <template>
     <div id="exercices">
-        <h2>Exercices</h2>
-        <UContextMenu
-            :items="items"
-            :ui="{
-                          content: 'w-48'
-                        }"
-        >
+        <UContextMenu :items="items" :ui="{ content: 'w-48' }">
             <div>
                 <LMap
                     ref="map"
-                    style="height: 75vh"
                     :zoom="zoom"
                     :min-zoom="15"
                     :center="chantrerie"
                     :use-global-leaflet="true"
+                    :options="{ zoomSnap: 0.75 }"
                     @ready="onMapReady"
                     @click="MapEvents"
                 >
@@ -130,11 +210,48 @@ function MapEvents(e: LeafletMouseEvent): void {
                 </LMap>
             </div>
         </UContextMenu>
+        <div id="side" class="flex flex-col w-full h-full p-2 overflow-hidden">
+            <UInput
+                id="search-input"
+                icon="material-symbols:search"
+                size="md" variant="outline" placeholder=""
+                :ui="{ base: 'peer' }">
+                <label
+                    for="search-input"
+                    class="pointer-events-none absolute left-6 peer-focus:left-1 -top-2.5 text-[var(--ui-text-highlighted)] text-xs font-medium px-1.5 transition-all
+                    peer-focus:-top-2.5 peer-focus:text-[var(--ui-text-highlighted)] peer-focus:text-xs peer-focus:font-medium
+                    peer-placeholder-shown:text-sm peer-placeholder-shown:text-[var(--ui-text-dimmed)] peer-placeholder-shown:top-1.5 peer-placeholder-shown:font-normal">
+                    <span class="inline-flex bg-[var(--ui-bg)] px-1">Rechercher un exercice</span>
+                </label>
+            </UInput>
+            <USeparator class="m-1 w-full"/>
+            <div id="exercices-list" class="flex flex-col w-full h-full overflow-auto gap-1">
+                <exerciceItem
+                    v-for="exercise in exercises" :key="exercise.id" :exercise="exercise as Exercise"
+                    class="skeletton gap-4"
+                    @mouseover="hooverMarker(exercise as Exercise)" @mouseleave="leaveMarker(exercise as Exercise)"/>
+                <div class="skeletton gap-4">
+                    <USkeleton class="h-12 w-12 rounded-full"/>
+                    <div class="grid gap-2 w-full">
+                        <USkeleton class="h-4 w-[250px]"/>
+                        <USkeleton class="h-4 w-[200px]"/>
+                    </div>
+                </div>
+            </div>
+        </div>
     </div>
 </template>
 
 <style>
 div#exercices {
-    margin: 1vh 1vw 6vh 1vw;
+    margin: 1vh 1vw;
+    height: 60vh;
+    display: grid;
+    grid-template-columns: 60% 40%;
+}
+
+.skeletton {
+    display: grid;
+    grid-template-columns: auto 1fr;
 }
 </style>
diff --git a/pages/parcours.vue b/pages/parcours.vue
index 8e436cc..15e83c3 100644
--- a/pages/parcours.vue
+++ b/pages/parcours.vue
@@ -1,3 +1,66 @@
+<script setup lang="ts">
+import Exercices from "~/pages/exercices.vue";
+
+const items = [
+    {
+        slot: 'exercises',
+        title: 'Exercises',
+        description: 'Choix des exercices',
+        icon: 'material-symbols:exercise-outline'
+    }, {
+        slot: 'parcours',
+        title: 'Parcours',
+        description: 'Dessin du parcours',
+        icon: 'material-symbols:route-outline'
+    }, {
+        slot: 'details',
+        title: 'Détails',
+        description: 'Détails du parcours',
+        icon: 'material-symbols:data-info-alert'
+    }
+]
+
+const stepper = useTemplateRef('stepper')
+</script>
+
 <template>
-    <div/>
-</template>
\ No newline at end of file
+    <div id="parcours" class="w-full flex flex-col justify-between">
+        <UStepper ref="stepper" :items="items">
+            <template #exercises>
+                <Exercices/>
+            </template>
+
+            <template #parcours>
+                Parcours
+            </template>
+
+            <template #details>
+                Détails
+            </template>
+        </UStepper>
+
+        <div class="flex gap-2 justify-between mt-4">
+            <UButton
+                leading-icon="i-lucide-arrow-left"
+                :disabled="!stepper?.hasPrev"
+                @click="stepper?.prev()"
+            >
+                Prev
+            </UButton>
+
+            <UButton
+                trailing-icon="i-lucide-arrow-right"
+                :disabled="!stepper?.hasNext"
+                @click="stepper?.next()"
+            >
+                Next
+            </UButton>
+        </div>
+    </div>
+</template>
+
+<style>
+div#parcours {
+    padding: 1vh 1vw 6vh 1vw;
+}
+</style>
\ No newline at end of file
diff --git a/types/Exercice.ts b/types/Exercice.ts
index 80fc46f..c0945ed 100644
--- a/types/Exercice.ts
+++ b/types/Exercice.ts
@@ -1,7 +1,7 @@
 import type {ExerciseCategory} from "~/types/enum/ExerciseCategory";
 import type {ExerciseSubCategory} from "~/types/enum/ExerciseSubCategory";
 
-export interface Exercise {
+export default interface Exercise {
     id: number;
     name: string;
     description: string;
@@ -11,4 +11,6 @@ export interface Exercise {
     generalInstructions?: string[];
     diagram?: string;
     video?: string;
+    lat: number;
+    lng: number;
 }
\ No newline at end of file
-- 
GitLab