diff --git a/AGENTS.md b/AGENTS.md
index 9058d2d..dda5693 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -6,7 +6,7 @@ Monorepo for aranroig.com — a personal portfolio website with blog, art galler
- **Frontend**: Nuxt 4 + Vue 3 + TypeScript + SCSS
- **Backend**: Express 5 + Mongoose (MongoDB)
-- **i18n**: @nuxtjs/i18n (English, Spanish, Catalan)
+- **i18n**: @nuxtjs/i18n (English, Spanish, Catalan, Chinese)
- **Content**: Nuxt Content v3 with Zod-sourced Markdown collections
- **Image optimization**: @nuxt/image
- **Build**: Vite
@@ -27,15 +27,15 @@ Monorepo for aranroig.com — a personal portfolio website with blog, art galler
│ │ │ ├── layouts/ # Page layout wrappers
│ │ │ ├── parts/ # Header, footer, navigation pieces
│ │ │ └── content/ # Blog, art content components
-│ │ ├── composables/ # useApi(), theme.ts (light/dark + accent colors)
+│ │ ├── composables/ # useApi(), useAuth(), theme.ts (light/dark + accent colors)
│ │ ├── i18n.config.ts# VueI18n fallback locale setup
-│ │ └── pages/ # File-based routing (index, blog, art, contact)
+│ │ └── pages/ # File-based routing (index, blog, art, contact, admin)
│ ├── content/ # Markdown collections organized by locale
│ │ ├── fixed/ # Static pages per locale
│ │ ├── blog/ # Blog posts
│ │ ├── art/ # Art pieces
│ │ └── projects/ # Project cards
-│ ├── i18n/locales/ # en.json, es.json, ca.json translation files
+│ ├── i18n/locales/ # en.json, es.json, ca.json, zh.json translation files
│ ├── content.config.ts # Content collection schemas (Zod)
│ └── nuxt.config.ts # Nuxt config: modules, i18n, runtime config
├── docker-compose.yml # Services: nginx, frontend, backend
@@ -75,6 +75,7 @@ In `backend/`:
- Backend reads `.env.development` or `.env.production` based on `NODE_ENV`. Requires `DB_URI` for MongoDB.
- Frontend runtime config key `public.apiBaseUrl` sets the backend API URL used by `useApi()`.
- Content lives in `frontend/content/` under collection folders (`blog`, `fixed`, `art`, `projects`), each with locale subdirectories (`en`, `es`, `ca`).
+- Admin panel lives at `/admin` (login, dashboard, orders), guarded by the `admin-auth` middleware and the `admin_token` cookie. Admin pages share the `AdminLayout` shell with the `AdminSidebar`.
## Code Style
@@ -84,6 +85,8 @@ In `backend/`:
- File names: kebab-case for components and pages.
- CSS variables driven by SCSS maps define themes (light/dark) and accent colors.
- TUI aesthetic: box-drawing characters, monospace font (**Hermit** / "Hurmit" via Nerd Fonts), `steps()` easing transitions, pixel-art SVG elements.
+- Headings and buttons carry no `>` prompt prefix.
+- Titles use proper capitalization: sentence case with capitalized proper nouns (e.g. "Admin dashboard", "Hibolia orders"), never ALL CAPS.
## Content Collections
diff --git a/frontend/app/components/Container.vue b/frontend/app/components/Container.vue
index 7998bc8..caf4a20 100644
--- a/frontend/app/components/Container.vue
+++ b/frontend/app/components/Container.vue
@@ -20,7 +20,7 @@
diff --git a/frontend/app/components/parts/AdminSidebar.vue b/frontend/app/components/parts/AdminSidebar.vue
new file mode 100644
index 0000000..1f75855
--- /dev/null
+++ b/frontend/app/components/parts/AdminSidebar.vue
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
diff --git a/frontend/app/components/parts/StickyHeader.vue b/frontend/app/components/parts/StickyHeader.vue
index cfc5c20..d8c267c 100644
--- a/frontend/app/components/parts/StickyHeader.vue
+++ b/frontend/app/components/parts/StickyHeader.vue
@@ -89,6 +89,13 @@ onUnmounted(() => window.removeEventListener('scroll', onScroll));
transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
opacity 0.3s ease;
+ // Below 900px the full header is hidden, so keep the bar always shown.
+ @media screen and (max-width: 900px) {
+ transform: translateY(0);
+ opacity: 1;
+ pointer-events: auto;
+ }
+
&.visible {
transform: translateY(0);
opacity: 1;
diff --git a/frontend/app/components/parts/TableHeader.vue b/frontend/app/components/parts/TableHeader.vue
index 693af86..3a5c5cb 100644
--- a/frontend/app/components/parts/TableHeader.vue
+++ b/frontend/app/components/parts/TableHeader.vue
@@ -120,7 +120,7 @@ const preloadImages = (imageArray) => {
diff --git a/frontend/i18n/locales/ca.json b/frontend/i18n/locales/ca.json
index 72d2def..9dacedb 100644
--- a/frontend/i18n/locales/ca.json
+++ b/frontend/i18n/locales/ca.json
@@ -146,20 +146,26 @@
"error_invalid": "Accés denegat: credencials no vàlides.",
"error_generic": "L'autenticació ha fallat. Torna-ho a provar més tard."
},
+ "sidebar": {
+ "title": "ADMIN",
+ "nav_dashboard": "panell",
+ "nav_orders": "comandes",
+ "back_site": "veure el lloc"
+ },
"dashboard": {
- "title": "TAULER D'ADMINISTRACIÓ",
+ "title": "Tauler d'administració",
"welcome": "sessió activa com a",
"logout": "tancar sessió",
"loading": "carregant dades del sistema...",
"load_error": "No s'han pogut carregar les dades del tauler.",
- "section_status": "estat del sistema",
+ "section_status": "Estat del sistema",
"status": "estat",
"mongo": "base de dades",
"uptime": "temps actiu",
"memory_rss": "memòria (rss)",
"memory_heap": "heap usat",
"total_cells": "cel·les pintades",
- "section_orders": "comandes hibolia",
+ "section_orders": "Comandes hibolia",
"orders_empty": "encara no hi ha comandes.",
"col_date": "data",
"col_name": "nom",
diff --git a/frontend/i18n/locales/en.json b/frontend/i18n/locales/en.json
index db87ac1..81fd96b 100644
--- a/frontend/i18n/locales/en.json
+++ b/frontend/i18n/locales/en.json
@@ -146,20 +146,26 @@
"error_invalid": "Access denied: invalid credentials.",
"error_generic": "Authentication failed. Try again later."
},
+ "sidebar": {
+ "title": "ADMIN",
+ "nav_dashboard": "dashboard",
+ "nav_orders": "orders",
+ "back_site": "view site"
+ },
"dashboard": {
- "title": "ADMIN DASHBOARD",
+ "title": "Admin dashboard",
"welcome": "session active as",
"logout": "logout",
"loading": "loading system data...",
"load_error": "Could not load dashboard data.",
- "section_status": "system status",
+ "section_status": "System status",
"status": "status",
"mongo": "database",
"uptime": "uptime",
"memory_rss": "memory (rss)",
"memory_heap": "heap used",
"total_cells": "cells painted",
- "section_orders": "hibolia orders",
+ "section_orders": "Hibolia orders",
"orders_empty": "no orders yet.",
"col_date": "date",
"col_name": "name",
diff --git a/frontend/i18n/locales/es.json b/frontend/i18n/locales/es.json
index baea27a..5a7e54c 100644
--- a/frontend/i18n/locales/es.json
+++ b/frontend/i18n/locales/es.json
@@ -146,20 +146,26 @@
"error_invalid": "Acceso denegado: credenciales no válidas.",
"error_generic": "La autenticación ha fallado. Inténtalo más tarde."
},
+ "sidebar": {
+ "title": "ADMIN",
+ "nav_dashboard": "panel",
+ "nav_orders": "pedidos",
+ "back_site": "ver el sitio"
+ },
"dashboard": {
- "title": "PANEL DE ADMINISTRACIÓN",
+ "title": "Panel de administración",
"welcome": "sesión activa como",
"logout": "cerrar sesión",
"loading": "cargando datos del sistema...",
"load_error": "No se pudieron cargar los datos del panel.",
- "section_status": "estado del sistema",
+ "section_status": "Estado del sistema",
"status": "estado",
"mongo": "base de datos",
"uptime": "tiempo activo",
"memory_rss": "memoria (rss)",
"memory_heap": "heap usado",
"total_cells": "células pintadas",
- "section_orders": "pedidos hibolia",
+ "section_orders": "Pedidos hibolia",
"orders_empty": "aún no hay pedidos.",
"col_date": "fecha",
"col_name": "nombre",
diff --git a/frontend/i18n/locales/zh.json b/frontend/i18n/locales/zh.json
index 0486756..337b851 100644
--- a/frontend/i18n/locales/zh.json
+++ b/frontend/i18n/locales/zh.json
@@ -146,6 +146,12 @@
"error_invalid": "访问被拒绝:凭据无效。",
"error_generic": "验证失败,请稍后再试。"
},
+ "sidebar": {
+ "title": "管理",
+ "nav_dashboard": "面板",
+ "nav_orders": "订单",
+ "back_site": "访问网站"
+ },
"dashboard": {
"title": "管理面板",
"welcome": "当前会话用户",
@@ -159,7 +165,7 @@
"memory_rss": "内存 (rss)",
"memory_heap": "已用堆内存",
"total_cells": "已绘制像素",
- "section_orders": "hibolia 订单",
+ "section_orders": "Hibolia 订单",
"orders_empty": "暂无订单。",
"col_date": "日期",
"col_name": "姓名",
diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts
index 1623381..99cc284 100644
--- a/frontend/nuxt.config.ts
+++ b/frontend/nuxt.config.ts
@@ -44,5 +44,5 @@ export default defineNuxtConfig({
}
},
- modules: ['@nuxtjs/i18n', '@nuxt/content', '@nuxt/image']
-})
+ modules: ['@nuxtjs/i18n', '@nuxt/content', '@nuxt/image', '@nuxtjs/turnstile']
+})
\ No newline at end of file
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 57e4b5d..7d9042b 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -9,7 +9,9 @@
"dependencies": {
"@nuxt/content": "^3.12.0",
"@nuxt/image": "^2.0.0",
+ "@nuxt/scripts": "^1.3.9",
"@nuxtjs/i18n": "10.2.3",
+ "@nuxtjs/turnstile": "^1.1.3",
"better-sqlite3": "^12.10.0",
"nuxt": "^4.3.1",
"sass": "^1.98.0",
@@ -704,28 +706,31 @@
"integrity": "sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ=="
},
"node_modules/@emnapi/core": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz",
- "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==",
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz",
+ "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==",
+ "license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/wasi-threads": "1.2.0",
+ "@emnapi/wasi-threads": "1.2.2",
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/runtime": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz",
- "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==",
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz",
+ "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==",
+ "license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
}
},
"node_modules/@emnapi/wasi-threads": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz",
- "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
+ "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
+ "license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
@@ -2153,9 +2158,10 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.31",
@@ -2218,18 +2224,24 @@
}
},
"node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz",
- "integrity": "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==",
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.4.tgz",
+ "integrity": "sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==",
+ "license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1",
- "@tybys/wasm-util": "^0.10.1"
+ "@tybys/wasm-util": "^0.10.3"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=23.5.0"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4",
+ "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4"
}
},
"node_modules/@nodelib/fs.scandir": {
@@ -2597,6 +2609,568 @@
"node": "^14.18.0 || >=16.10.0"
}
},
+ "node_modules/@nuxt/scripts": {
+ "version": "1.3.9",
+ "resolved": "https://registry.npmjs.org/@nuxt/scripts/-/scripts-1.3.9.tgz",
+ "integrity": "sha512-6OIvXXZ736YHtF7qLueO0foxQvhLhhjJ4zifBEhxAV7ouxI/NStmLIz70pQiPdhr26/1JZqHgGVfC91vJZPZIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@nuxt/devtools-kit": "^3.2.4",
+ "@vueuse/core": "^14.3.0",
+ "@vueuse/shared": "^14.3.0",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "h3": "^1.15.11",
+ "magic-string": "^1.0.0",
+ "ofetch": "^1.5.1",
+ "ohash": "^2.0.11",
+ "oxc-parser": "^0.140.0",
+ "oxc-walker": "^1.0.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "sirv": "^3.0.2",
+ "std-env": "^4.2.0",
+ "ufo": "^1.6.4",
+ "ultrahtml": "^1.7.0",
+ "undici": "^6.27.0",
+ "unplugin": "^3.3.0",
+ "unstorage": "^1.17.5",
+ "valibot": "^1.4.2"
+ },
+ "bin": {
+ "nuxt-scripts": "bin/cli.mjs"
+ },
+ "peerDependencies": {
+ "@googlemaps/markerclusterer": "^2.6.2",
+ "@paypal/paypal-js": "^8.1.2 || ^9.0.0",
+ "@speedcurve/lux": "^4.4.3",
+ "@stripe/stripe-js": "^7.0.0 || ^8.0.0 || ^9.0.0",
+ "@types/google.maps": "^3.58.1",
+ "@types/vimeo__player": "^2.18.3",
+ "@types/youtube": "^0.1.0",
+ "@unhead/vue": "^2.0.3 || ^3.0.0",
+ "posthog-js": "^1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@googlemaps/markerclusterer": {
+ "optional": true
+ },
+ "@paypal/paypal-js": {
+ "optional": true
+ },
+ "@speedcurve/lux": {
+ "optional": true
+ },
+ "@stripe/stripe-js": {
+ "optional": true
+ },
+ "@types/google.maps": {
+ "optional": true
+ },
+ "@types/vimeo__player": {
+ "optional": true
+ },
+ "@types/youtube": {
+ "optional": true
+ },
+ "@unhead/vue": {
+ "optional": true
+ },
+ "posthog-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-android-arm-eabi": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.140.0.tgz",
+ "integrity": "sha512-ZfjDZ422mo7eo3b3VltqNsV9kmv1qt/sPEAMSl64iOSwhVfd0eIZ9LB79Mbs1xYXJnk7WSROwzBCKDIiVxPTvQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-android-arm64": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.140.0.tgz",
+ "integrity": "sha512-Ia8jSvikUX6Sf+Ht+KOCUF/k1HpR0VlmqIYymubmWDebOEGtsyliHDR6JxsZ4IX3/c/GbrB1uh09aVGQv/LQmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-darwin-arm64": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.140.0.tgz",
+ "integrity": "sha512-G6VK0nK61pH0d0mBjUqSZbVxGqqO5uzeginLDQj+gOO6ObfJjXRwgkD/ol0w1INcnFeAb6YGGO7qc3ueGHaycQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-darwin-x64": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.140.0.tgz",
+ "integrity": "sha512-HazBOuZzd2pO1C2uMmp8Gv7mhzMHqKSKDS1OZfcLEvpIcgA+48J92HEtNanVHDIzRD9PRPCV6aS6fkZIWOVl8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-freebsd-x64": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.140.0.tgz",
+ "integrity": "sha512-9hSUU+HmTUyOe4JzMHxNGgLWNY7rrO+6ShicZwImNJacEAACDMIkuEQQkvXSL+WJN50jaNtLYJv8s4OcBdpyUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-arm-gnueabihf": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.140.0.tgz",
+ "integrity": "sha512-RAEuQsYtS0KcDFqN0ABTjyyNlokS91JeuDuoW9tEbG0JTbRNXnpQUdbYc/16JoA6Z/2ALbNrE3KmxtqDiuIjCQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-arm-musleabihf": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.140.0.tgz",
+ "integrity": "sha512-c4CkHvPvqfojouredJ0w3e6+jiBq0SbFyhH61kr/zPb/7XsaYTNKQ54vmlSsopfdQbNDX40ZeK9Abs2Qet6wcw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-arm64-gnu": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.140.0.tgz",
+ "integrity": "sha512-yrjmLj8ixPB25yqvPGr28meGjb+keed7m1GqqY/0uqkhZIoT4t9zmfwUgFEtC33C7dtE+UQ7TU0IaVxf97SWJg==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-arm64-musl": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.140.0.tgz",
+ "integrity": "sha512-ggGMQTN8Agwxp2WiLMpdY671dt0qTDJWiWlJeig3HnUwTnerRl0J2JdGVghWBeDcss2D9S2V2Js6dZHEiVabVA==",
+ "cpu": [
+ "arm64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-ppc64-gnu": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.140.0.tgz",
+ "integrity": "sha512-IgTs8xYAFgAUGNmR65tIqjlJ8vKgrfXzC515e9goSdfMyKQV4aJpd2pUUudU4u51G64H0/DSEJEXKOraxm9ZCA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-riscv64-gnu": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.140.0.tgz",
+ "integrity": "sha512-A1x+PMWZmSGaFVOx2YeNTFau8uD+QO14/vLP4GrcuvUPs3+nBkUOjy9Lus86ftHsDojjYMbvBelmKc3F7Rv08g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-riscv64-musl": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.140.0.tgz",
+ "integrity": "sha512-zBqpfRo2myWPrPo5xUjeZqlnPXPXsX8BcWtWff66/eGRQdbPjhzPgXa/F+AtxT2afUViPxbuDlwscMKzQ5tg+g==",
+ "cpu": [
+ "riscv64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-s390x-gnu": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.140.0.tgz",
+ "integrity": "sha512-2M1DPm/8w9I//YzFlFC9qXw+r2tJFh5CYwRlYTq2vUJQS7qoQftEDeCZ8EnN7KHtvSiXvYj8mZI5pR7DpXmcEw==",
+ "cpu": [
+ "s390x"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-x64-gnu": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.140.0.tgz",
+ "integrity": "sha512-8aRDbZ/U/jO8N7go1MO72jtbpb4uswV8d7vOkMvt/BPgZiyEYvl1VIWK4ESxZZhnJ4tqwVldgX7dNiP/eB1Jdg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-linux-x64-musl": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.140.0.tgz",
+ "integrity": "sha512-xRqpeI8U2sQQS1W5BMWRyMTxtagkuLG2dEWruet5lFsWHTvBth11/TpSaJatHdqVVwHN0q3uuoS9zRsGinq8hg==",
+ "cpu": [
+ "x64"
+ ],
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-openharmony-arm64": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.140.0.tgz",
+ "integrity": "sha512-GbGRe26MqAKciFRvXeHNQJ6VAHYs9R4miP89sEAncysM3n+f4lnyLWgsa9kklJNpfnxdq2yRoNYHFqwBckVimw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-wasm32-wasi": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.140.0.tgz",
+ "integrity": "sha512-vFiC1hqys+hkX1GnQkIoiTQJNiUm43Z0lO35ETKXTw0YtpW7+cN58YRRXFAQQ+TgpkIi3lrhcxdlnqz+Oi3ptQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "1.11.2",
+ "@emnapi/runtime": "1.11.2",
+ "@napi-rs/wasm-runtime": "^1.1.6"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-win32-arm64-msvc": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.140.0.tgz",
+ "integrity": "sha512-fGSQldwEYKhM+H8uLt76Op8hh5+FYaR6lvvQ1Txw3Mhn86DyQXLcI0fi1EkFlTK7F+46OCk/j0AJMzZQm6g5Xg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-win32-ia32-msvc": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.140.0.tgz",
+ "integrity": "sha512-sDS2Bai+g3ZWYwfZqmosiSuFDBcVnZ3Ta6pszzsiJoLMqsJEWKcxXXbGa7b7yXr++W2lQNPb3ZRJ8czseqL7RA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-parser/binding-win32-x64-msvc": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.140.0.tgz",
+ "integrity": "sha512-kHbE1zWyb5OQgJA6/5P4WjiuB01sYdQwtZnSSyE58FQEXDAMnyeeq4vj7KgN75i5SlBzOs8A5MrtlD3gOlDKqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/@oxc-project/types": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.140.0.tgz",
+ "integrity": "sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/magic-string": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz",
+ "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.6.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/oxc-parser": {
+ "version": "0.140.0",
+ "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.140.0.tgz",
+ "integrity": "sha512-h6QFWd6lBMfjESqgQ27GjzrSDb0qbznp7VDQqp2zvgsrWut4vcchyMIzOVXvGQ2GMZgKw9RWrFNWv9WqGL0p7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "^0.140.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxc-parser/binding-android-arm-eabi": "0.140.0",
+ "@oxc-parser/binding-android-arm64": "0.140.0",
+ "@oxc-parser/binding-darwin-arm64": "0.140.0",
+ "@oxc-parser/binding-darwin-x64": "0.140.0",
+ "@oxc-parser/binding-freebsd-x64": "0.140.0",
+ "@oxc-parser/binding-linux-arm-gnueabihf": "0.140.0",
+ "@oxc-parser/binding-linux-arm-musleabihf": "0.140.0",
+ "@oxc-parser/binding-linux-arm64-gnu": "0.140.0",
+ "@oxc-parser/binding-linux-arm64-musl": "0.140.0",
+ "@oxc-parser/binding-linux-ppc64-gnu": "0.140.0",
+ "@oxc-parser/binding-linux-riscv64-gnu": "0.140.0",
+ "@oxc-parser/binding-linux-riscv64-musl": "0.140.0",
+ "@oxc-parser/binding-linux-s390x-gnu": "0.140.0",
+ "@oxc-parser/binding-linux-x64-gnu": "0.140.0",
+ "@oxc-parser/binding-linux-x64-musl": "0.140.0",
+ "@oxc-parser/binding-openharmony-arm64": "0.140.0",
+ "@oxc-parser/binding-wasm32-wasi": "0.140.0",
+ "@oxc-parser/binding-win32-arm64-msvc": "0.140.0",
+ "@oxc-parser/binding-win32-ia32-msvc": "0.140.0",
+ "@oxc-parser/binding-win32-x64-msvc": "0.140.0"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/oxc-walker": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/oxc-walker/-/oxc-walker-1.1.1.tgz",
+ "integrity": "sha512-Hwd7dq28zu/Er99+bpWp16CGwFrhyalJh0W3JOB7XpPvgWo3MqMi2ksWGKuzzA9zt50mJ2pIUwR5lpAdZ9ACNQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@oxc-project/types": ">=0.98.0",
+ "oxc-parser": ">=0.98.0",
+ "rolldown": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@oxc-project/types": {
+ "optional": true
+ },
+ "oxc-parser": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/undici": {
+ "version": "6.28.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.1.tgz",
+ "integrity": "sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
+ }
+ },
+ "node_modules/@nuxt/scripts/node_modules/unplugin": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.4.0.tgz",
+ "integrity": "sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "picomatch": "^4.0.7",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@farmfe/core": "*",
+ "@rsbuild/core": "*",
+ "@rspack/core": "*",
+ "bun-types-no-globals": "*",
+ "esbuild": "*",
+ "rolldown": "*",
+ "rollup": "*",
+ "unloader": "*",
+ "vite": "*",
+ "webpack": "*"
+ },
+ "peerDependenciesMeta": {
+ "@farmfe/core": {
+ "optional": true
+ },
+ "@rsbuild/core": {
+ "optional": true
+ },
+ "@rspack/core": {
+ "optional": true
+ },
+ "bun-types-no-globals": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "rolldown": {
+ "optional": true
+ },
+ "rollup": {
+ "optional": true
+ },
+ "unloader": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@nuxt/telemetry": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.7.0.tgz",
@@ -3015,6 +3589,53 @@
"@types/hast": "^3.0.4"
}
},
+ "node_modules/@nuxtjs/turnstile": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@nuxtjs/turnstile/-/turnstile-1.1.3.tgz",
+ "integrity": "sha512-NKiRHvdCuuWz85VHWzhofPXxHFq6y2eOHXQPsrRJhLnEZ/YBvGt6beOxI0M50rHKMEmdYjM/30QomyzNLIBz4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@nuxt/kit": "^3.16.0",
+ "@types/cloudflare-turnstile": "0.2.2",
+ "defu": "^6.1.4",
+ "pathe": "^2.0.3"
+ },
+ "peerDependencies": {
+ "@nuxt/scripts": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^1.0.0"
+ }
+ },
+ "node_modules/@nuxtjs/turnstile/node_modules/@nuxt/kit": {
+ "version": "3.21.11",
+ "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.21.11.tgz",
+ "integrity": "sha512-0Xi3tgwN77w43Q8GCPIrvWmF1J7Peehkts44E0uKNIml9lB8WoUn8YxyUjxBv47XtVR86NWoWALAT+/IEMHJEA==",
+ "license": "MIT",
+ "dependencies": {
+ "c12": "^3.3.4",
+ "consola": "^3.4.2",
+ "defu": "^6.1.7",
+ "destr": "^2.0.5",
+ "errx": "^0.1.2",
+ "exsolve": "^1.1.1",
+ "ignore": "^7.0.6",
+ "jiti": "^2.7.0",
+ "klona": "^2.0.6",
+ "knitwork": "^1.3.0",
+ "mlly": "^1.8.2",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.3.1",
+ "rc9": "^3.0.1",
+ "scule": "^1.3.0",
+ "semver": "^7.8.5",
+ "tinyglobby": "^0.2.17",
+ "ufo": "^1.6.4",
+ "unctx": "^2.5.0",
+ "untyped": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
"node_modules/@one-ini/wasm": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz",
@@ -5250,9 +5871,10 @@
"license": "MIT"
},
"node_modules/@tybys/wasm-util": {
- "version": "0.10.1",
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
- "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz",
+ "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==",
+ "license": "MIT",
"optional": true,
"dependencies": {
"tslib": "^2.4.0"
@@ -5276,6 +5898,12 @@
"assertion-error": "^2.0.1"
}
},
+ "node_modules/@types/cloudflare-turnstile": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@types/cloudflare-turnstile/-/cloudflare-turnstile-0.2.2.tgz",
+ "integrity": "sha512-3Yf7b1Glci+V2bFWwWBbZkRgTuegp7RDgNTOG4U0UNPB9RV4AWvwqg2/qqLff8G+SwKFNXoXvTkqaRBZrAFdKA==",
+ "license": "MIT"
+ },
"node_modules/@types/debug": {
"version": "4.1.12",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
@@ -5387,6 +6015,12 @@
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
"license": "MIT"
},
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.21",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+ "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
+ "license": "MIT"
+ },
"node_modules/@types/webxr": {
"version": "0.5.24",
"resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz",
@@ -6001,6 +6635,44 @@
}
}
},
+ "node_modules/@vueuse/core": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz",
+ "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.21",
+ "@vueuse/metadata": "14.4.0",
+ "@vueuse/shared": "14.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz",
+ "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "14.4.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz",
+ "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vue": "^3.5.0"
+ }
+ },
"node_modules/@webcontainer/env": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz",
@@ -7144,9 +7816,10 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
},
"node_modules/cookie-es": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz",
- "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg=="
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.3.tgz",
+ "integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
+ "license": "MIT"
},
"node_modules/core-util-is": {
"version": "1.0.3",
@@ -8045,9 +8718,10 @@
}
},
"node_modules/errx": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz",
- "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.2.tgz",
+ "integrity": "sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==",
+ "license": "MIT"
},
"node_modules/es-define-property": {
"version": "1.0.1",
@@ -8462,9 +9136,10 @@
}
},
"node_modules/exsolve": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
- "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
+ "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
+ "license": "MIT"
},
"node_modules/extend": {
"version": "3.0.2",
@@ -8950,13 +9625,14 @@
}
},
"node_modules/h3": {
- "version": "1.15.8",
- "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.8.tgz",
- "integrity": "sha512-iOH6Vl8mGd9nNfu9C0IZ+GuOAfJHcyf3VriQxWaSWIB76Fg4BnFuk4cxBxjmQSSxJS664+pgjP6e7VBnUzFfcg==",
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.11.tgz",
+ "integrity": "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==",
+ "license": "MIT",
"dependencies": {
- "cookie-es": "^1.2.2",
+ "cookie-es": "^1.2.3",
"crossws": "^0.3.5",
- "defu": "^6.1.4",
+ "defu": "^6.1.6",
"destr": "^2.0.5",
"iron-webcrypto": "^1.2.1",
"node-mock-http": "^1.0.4",
@@ -9496,9 +10172,10 @@
]
},
"node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "version": "7.0.9",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz",
+ "integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==",
+ "license": "MIT",
"engines": {
"node": ">= 4"
}
@@ -14282,9 +14959,9 @@
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
},
"node_modules/picomatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -15665,9 +16342,9 @@
"integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="
},
"node_modules/semver": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz",
- "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -16255,9 +16932,10 @@
}
},
"node_modules/std-env": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz",
- "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ=="
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
+ "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
+ "license": "MIT"
},
"node_modules/stop-iteration-iterator": {
"version": "1.1.0",
@@ -16911,9 +17589,10 @@
"license": "MIT"
},
"node_modules/ultrahtml": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz",
- "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.7.0.tgz",
+ "integrity": "sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==",
+ "license": "MIT"
},
"node_modules/uncrypto": {
"version": "0.1.3",
@@ -17275,15 +17954,16 @@
}
},
"node_modules/unstorage": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz",
- "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==",
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
+ "integrity": "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==",
+ "license": "MIT",
"dependencies": {
"anymatch": "^3.1.3",
"chokidar": "^5.0.0",
"destr": "^2.0.5",
- "h3": "^1.15.5",
- "lru-cache": "^11.2.0",
+ "h3": "^1.15.10",
+ "lru-cache": "^11.2.7",
"node-fetch-native": "^1.6.7",
"ofetch": "^1.5.1",
"ufo": "^1.6.3"
@@ -17471,6 +18151,20 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
+ "node_modules/valibot": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.5.0.tgz",
+ "integrity": "sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "typescript": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/vfile": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 8de9c48..23f4f65 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,7 +14,9 @@
"dependencies": {
"@nuxt/content": "^3.12.0",
"@nuxt/image": "^2.0.0",
+ "@nuxt/scripts": "^1.3.9",
"@nuxtjs/i18n": "10.2.3",
+ "@nuxtjs/turnstile": "^1.1.3",
"better-sqlite3": "^12.10.0",
"nuxt": "^4.3.1",
"sass": "^1.98.0",