From 3ce44d7aac921c01931dc0f6dc63a6c3e24e7c8f Mon Sep 17 00:00:00 2001 From: "david.martinez" Date: Sat, 25 Jul 2026 01:35:36 -0600 Subject: [PATCH] Ruleta actvidad completa en React --- .gitignore | 24 + .oxlintrc.json | 8 + README.md | 238 +++ Ruleta.code-workspace | 8 + index.html | 13 + package-lock.json | 2384 ++++++++++++++++++++++ package.json | 29 + public/audios/click.mp3 | Bin 0 -> 14912 bytes public/audios/feedback-correct.mpeg | Bin 0 -> 39228 bytes public/audios/feedback-incorrect.mpeg | Bin 0 -> 15539 bytes public/audios/wheel-spin.mp3 | Bin 0 -> 49066 bytes public/favicon.svg | 1 + public/icons.svg | 24 + public/img/indicador.png | Bin 0 -> 3228 bytes public/img/pr.png | Bin 0 -> 410 bytes public/img/progress.png | Bin 0 -> 973 bytes public/img/ruleta.png | Bin 0 -> 23036 bytes public/imsmanifest.xml | 30 + src/App.css | 184 ++ src/App.tsx | 51 + src/assets/hero.png | Bin 0 -> 13057 bytes src/assets/react.svg | 1 + src/assets/vite.svg | 1 + src/audio/AudioController.ts | 80 + src/audio/ExtendedHowl.ts | 69 + src/audio/audios.ts | 6 + src/components/game/QuestionModal.tsx | 124 ++ src/components/game/ResultModal.tsx | 23 + src/components/game/Ruleta/RuletaSVG.tsx | 99 + src/components/layout/Footer.tsx | 9 + src/components/layout/Header.tsx | 10 + src/components/screens/Cover.tsx | 46 + src/components/screens/Game.tsx | 72 + src/components/screens/Result.tsx | 52 + src/components/ui/Button.tsx | 52 + src/data/preguntas.json | 297 +++ src/hooks/useAudio.ts | 23 + src/hooks/useIntentos.ts | 31 + src/hooks/useRuleta.ts | 134 ++ src/hooks/useSCORM.ts | 46 + src/hooks/useScale.ts | 34 + src/index.css | 1 + src/layouts/MainLayout.tsx | 24 + src/main.tsx | 18 + src/scorm/scorm.ts | 145 ++ src/types/index.ts | 20 + src/vite-env.d.ts | 11 + tsconfig.json | 20 + vite.config.js | 7 + 49 files changed, 4449 insertions(+) create mode 100644 .gitignore create mode 100644 .oxlintrc.json create mode 100644 README.md create mode 100644 Ruleta.code-workspace create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/audios/click.mp3 create mode 100644 public/audios/feedback-correct.mpeg create mode 100644 public/audios/feedback-incorrect.mpeg create mode 100644 public/audios/wheel-spin.mp3 create mode 100644 public/favicon.svg create mode 100644 public/icons.svg create mode 100644 public/img/indicador.png create mode 100644 public/img/pr.png create mode 100644 public/img/progress.png create mode 100644 public/img/ruleta.png create mode 100644 public/imsmanifest.xml create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/hero.png create mode 100644 src/assets/react.svg create mode 100644 src/assets/vite.svg create mode 100644 src/audio/AudioController.ts create mode 100644 src/audio/ExtendedHowl.ts create mode 100644 src/audio/audios.ts create mode 100644 src/components/game/QuestionModal.tsx create mode 100644 src/components/game/ResultModal.tsx create mode 100644 src/components/game/Ruleta/RuletaSVG.tsx create mode 100644 src/components/layout/Footer.tsx create mode 100644 src/components/layout/Header.tsx create mode 100644 src/components/screens/Cover.tsx create mode 100644 src/components/screens/Game.tsx create mode 100644 src/components/screens/Result.tsx create mode 100644 src/components/ui/Button.tsx create mode 100644 src/data/preguntas.json create mode 100644 src/hooks/useAudio.ts create mode 100644 src/hooks/useIntentos.ts create mode 100644 src/hooks/useRuleta.ts create mode 100644 src/hooks/useSCORM.ts create mode 100644 src/hooks/useScale.ts create mode 100644 src/index.css create mode 100644 src/layouts/MainLayout.tsx create mode 100644 src/main.tsx create mode 100644 src/scorm/scorm.ts create mode 100644 src/types/index.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.json create mode 100644 vite.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..0b89d61 --- /dev/null +++ b/README.md @@ -0,0 +1,238 @@ +# 🎡 Ruleta Interactiva — SCORM 1.2 + +Actividad e-learning interactiva basada en una ruleta con preguntas de cultura general, construida con React, TypeScript, Tailwind CSS y empaquetada como contenido SCORM 1.2. + +--- + +## 🛠️ Stack Tecnológico + +| Tecnología | Versión | Uso | +|---|---|---| +| React | 19 | UI y manejo de estado | +| TypeScript | 5 | Tipado estático | +| Tailwind CSS | 4 | Estilos utilitarios | +| Vite | 6 | Bundler y dev server | +| Howler.js | 2 | Manejo de audio | +| scorm-again | 3 | Simulador SCORM en desarrollo | + +--- + +## 📁 Estructura del Proyecto + +``` +src/ +├── audio/ +│ ├── ExtendedHowl.ts # Clase que extiende Howl con eventos de timeupdate (250ms) +│ ├── AudioController.ts # Controlador global de audio + sonidos precargados +│ └── audios.ts # Constantes con rutas de archivos de audio +│ +├── components/ +│ ├── ui/ +│ │ └── Button.tsx # Botón reutilizable (variantes: primary, secondary, outline, danger) +│ ├── layout/ +│ │ ├── Header.tsx # Cabecera de la aplicación +│ │ └── Footer.tsx # Pie de página +│ ├── screens/ +│ │ ├── Cover.tsx # Pantalla de portada con introducción y botón comenzar +│ │ ├── Game.tsx # Pantalla principal del juego +│ │ └── Result.tsx # Pantalla de cierre (3 estados) +│ └── game/ +│ ├── Ruleta/ +│ │ └── RuletaSVG.tsx # Ruleta SVG con 4 secciones de colores +│ ├── QuestionModal.tsx # Modal de pregunta con temporizador y feedback +│ └── ResultModal.tsx # Modal interno (reservado) +│ +├── data/ +│ └── preguntas.json # 4 categorías × 8 preguntas + banco genérico +│ +├── hooks/ +│ ├── useAudio.ts # Hook para consumir el AudioController +│ ├── useIntentos.ts # Manejo de intentos con persistencia en sessionStorage +│ ├── useRuleta.ts # Lógica completa del juego +│ ├── useSCORM.ts # Hook para inicializar y usar SCORM 1.2 +│ └── useScale.ts # Escalado adaptativo 1920×1080 +│ +├── layouts/ +│ └── MainLayout.tsx # Template principal con escalado adaptativo +│ +├── scorm/ +│ └── scorm.ts # Funciones SCORM 1.2 con fallback a sessionStorage +│ +├── types/ +│ └── index.ts # Interfaces TypeScript (Pregunta, Categoria, PreguntasData) +│ +├── App.tsx # Manejo de pantallas y flujo de intentos +└── main.tsx # Entry point con simulador SCORM en desarrollo + +public/ +├── audios/ +│ ├── click.mp3 # Sonido de clic en botones +│ ├── wheel-spin.mp3 # Sonido al girar la ruleta +│ ├── feedback-correct.mpeg # Sonido de respuesta correcta +│ └── feedback-incorrect.mpeg # Sonido de respuesta incorrecta +├── img/ +│ ├── ruleta.png # Imagen de ruleta (respaldo) +│ └── indicador.png # Imagen de indicador (respaldo) +└── imsmanifest.xml # Manifiesto SCORM 1.2 requerido por el LMS +``` + +--- + +## 🎮 Flujo de la Actividad + +``` +Portada (Cover) + │ + │ clic en "Comenzar" → consume 1 intento + sonido click + ▼ +Juego (Game) + │ + │ clic en la ruleta → gira + sonido wheel-spin (4s) + ▼ +Detecta sección (4 categorías × 90°) + │ + ▼ +Modal de Pregunta (temporizador 30s) + ├── Respuesta correcta → sonido correct → feedback → círculo de progreso + ├── Respuesta incorrecta → sonido incorrect → feedback → círculo de progreso + └── Tiempo agotado → cuenta como incorrecta → feedback + │ + │ 10 preguntas respondidas + ▼ +Pantalla de Resultado + ├── ≥ 8 correctas → ¡Felicidades! (sin botón) + ├── < 8 correctas + intentos disponibles → "Casi" + botón Reintentar + └── Sin intentos → Mensaje final (persiste al recargar) +``` + +--- + +## 🎯 Categorías de Preguntas + +| # | Categoría | Color | Preguntas | +|---|---|---|---| +| 1 | 🏛️ Historia | Morado `#7C3AED` | 8 | +| 2 | 🌍 Geografía | Verde `#059669` | 8 | +| 3 | 🔬 Ciencia | Rojo `#DC2626` | 8 | +| 4 | 🎨 Arte y Literatura | Naranja `#D97706` | 8 | + +> Las preguntas se seleccionan aleatoriamente sin repetir dentro de cada categoría. +> Si se agotan las preguntas de una categoría, se usa el **banco genérico** (5 preguntas). + +--- + +## 🏆 Criterios de Aprobación + +| Criterio | Valor | +|---|---| +| Preguntas por actividad | 10 | +| Mínimo para aprobar | 8 correctas | +| Intentos totales | 3 | +| Tiempo por pregunta | 30 segundos | +| Tiempo agotado | Cuenta como incorrecta | + +--- + +## 🔄 Sistema de Intentos + +- El intento se consume al hacer clic en **"Comenzar"** +- Se persiste en `sessionStorage`, por lo que recargar la página **no** recupera el intento +- Al agotar los 3 intentos, la pantalla de cierre final persiste aunque se recargue + +--- + +## 📐 Escalado Adaptativo + +El hook `useScale` escala toda la actividad a una resolución base de **1920×1080** manteniendo proporciones en cualquier pantalla: + +```ts +const BASE_WIDTH = 1920 +const BASE_HEIGHT = 1080 +const scale = Math.min(window.innerWidth / BASE_WIDTH, window.innerHeight / BASE_HEIGHT) +``` + +> Solo orientación horizontal. No aplica diseño para pantallas verticales. + +--- + +## 🔊 Audio + +Los audios se precargan al iniciar la aplicación mediante `AudioController`: + +```ts +sounds.click?.play() // Botones de navegación +sounds.wheelSpin?.play() // Al girar la ruleta +sounds.correct?.play() // Respuesta correcta +sounds.incorrect?.play() // Respuesta incorrecta +``` + +--- + +## 📡 SCORM 1.2 + +El módulo SCORM (`src/scorm/scorm.ts`) implementa todas las funciones estándar con **fallback automático a `sessionStorage`** cuando no hay LMS disponible: + +| Función | CMI Key | +|---|---| +| `initSCORM()` | Inicializa y establece status `incomplete` | +| `getStudentName()` | `cmi.core.student_name` | +| `getLessonStatus()` / `setLessonStatus()` | `cmi.core.lesson_status` | +| `getLessonLocation()` / `setLessonLocation()` | `cmi.core.lesson_location` | +| `getScore()` / `setScore()` | `cmi.core.score.raw/max/min` | +| `getSuspendData()` / `setSuspendData()` | `cmi.suspend_data` | +| `getScormData()` / `setScormData()` | Cualquier clave CMI | +| `finishSCORM()` | Calcula `session_time` en HH:MM:SS y cierra | +| `completeLesson()` | Establece status `completed` | + +> En desarrollo, `scorm-again` simula el `window.API` del LMS automáticamente. + +--- + +## 🧩 Componente Button + +```tsx + + + + +``` + +--- + +## 🚀 Comandos + +```bash +# Instalar dependencias +npm install + +# Desarrollo +npm run dev + +# Build para producción +npm run build + +# Verificar TypeScript +npx tsc --noEmit +``` + +--- + +## 📦 Empaquetado SCORM + +Para publicar en un LMS (Moodle, Cornerstone, etc.): + +1. Ejecutar `npm run build` +2. Abrir la carpeta `dist/` — el `imsmanifest.xml` se copia automáticamente +3. Seleccionar **todo** el contenido de `dist/` y comprimir en un `.zip` +4. Subir el `.zip` al LMS como paquete SCORM 1.2 + +> El `masteryscore` está configurado en **80** en el `imsmanifest.xml`. + +--- + +## 📋 Pendientes + +- [ ] Reemplazar categorías y preguntas de cultura general por el contenido real del cliente +- [ ] Integrar `setScore` y `completeLesson` con SCORM al finalizar la actividad +- [ ] Pruebas en LMS real (Moodle) +- [ ] Definir diseño visual final (colores, logo, imágenes del cliente) diff --git a/Ruleta.code-workspace b/Ruleta.code-workspace new file mode 100644 index 0000000..876a149 --- /dev/null +++ b/Ruleta.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..eb1a7ed --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + ruleta + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d53b2b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2384 @@ +{ + "name": "ruleta", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ruleta", + "version": "0.0.0", + "dependencies": { + "howler": "^2.2.4", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "scorm-again": "^3.1.1" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.3", + "@types/howler": "^2.2.13", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.3", + "oxlint": "^1.71.0", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + "vite": "^8.1.1" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.139.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", + "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.74.0.tgz", + "integrity": "sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.74.0.tgz", + "integrity": "sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.74.0.tgz", + "integrity": "sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.74.0.tgz", + "integrity": "sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.74.0.tgz", + "integrity": "sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.74.0.tgz", + "integrity": "sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.74.0.tgz", + "integrity": "sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.74.0.tgz", + "integrity": "sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.74.0.tgz", + "integrity": "sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.74.0.tgz", + "integrity": "sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.74.0.tgz", + "integrity": "sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.74.0.tgz", + "integrity": "sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.74.0.tgz", + "integrity": "sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.74.0.tgz", + "integrity": "sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.74.0.tgz", + "integrity": "sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.74.0.tgz", + "integrity": "sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.74.0.tgz", + "integrity": "sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.74.0.tgz", + "integrity": "sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.74.0.tgz", + "integrity": "sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz", + "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz", + "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz", + "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz", + "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz", + "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz", + "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz", + "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.11.1", + "@emnapi/runtime": "1.11.1", + "@napi-rs/wasm-runtime": "^1.1.6" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/howler": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.13.tgz", + "integrity": "sha512-40+EBjqIHHrC4VShlz/7i0lBUsE3QkgzZinQQji74Hd8sBkJZUBaT7LWFLK6rcabsDOOQpoMbEJvtaFQwxOu/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript/typescript-aix-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz", + "integrity": "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz", + "integrity": "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-darwin-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz", + "integrity": "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz", + "integrity": "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-freebsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz", + "integrity": "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz", + "integrity": "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz", + "integrity": "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-loong64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz", + "integrity": "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-mips64el": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz", + "integrity": "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-ppc64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz", + "integrity": "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-riscv64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz", + "integrity": "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-s390x": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz", + "integrity": "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-linux-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz", + "integrity": "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz", + "integrity": "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-netbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz", + "integrity": "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz", + "integrity": "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-openbsd-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz", + "integrity": "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-sunos-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz", + "integrity": "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-arm64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz", + "integrity": "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@typescript/typescript-win32-x64": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz", + "integrity": "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", + "integrity": "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/howler": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", + "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==", + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oxlint": { + "version": "1.74.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.74.0.tgz", + "integrity": "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.74.0", + "@oxlint/binding-android-arm64": "1.74.0", + "@oxlint/binding-darwin-arm64": "1.74.0", + "@oxlint/binding-darwin-x64": "1.74.0", + "@oxlint/binding-freebsd-x64": "1.74.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.74.0", + "@oxlint/binding-linux-arm-musleabihf": "1.74.0", + "@oxlint/binding-linux-arm64-gnu": "1.74.0", + "@oxlint/binding-linux-arm64-musl": "1.74.0", + "@oxlint/binding-linux-ppc64-gnu": "1.74.0", + "@oxlint/binding-linux-riscv64-gnu": "1.74.0", + "@oxlint/binding-linux-riscv64-musl": "1.74.0", + "@oxlint/binding-linux-s390x-gnu": "1.74.0", + "@oxlint/binding-linux-x64-gnu": "1.74.0", + "@oxlint/binding-linux-x64-musl": "1.74.0", + "@oxlint/binding-openharmony-arm64": "1.74.0", + "@oxlint/binding-win32-arm64-msvc": "1.74.0", + "@oxlint/binding-win32-ia32-msvc": "1.74.0", + "@oxlint/binding-win32-x64-msvc": "1.74.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.24.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.20.tgz", + "integrity": "sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.7" + } + }, + "node_modules/rolldown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", + "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.139.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.1.5", + "@rolldown/binding-darwin-arm64": "1.1.5", + "@rolldown/binding-darwin-x64": "1.1.5", + "@rolldown/binding-freebsd-x64": "1.1.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", + "@rolldown/binding-linux-arm64-gnu": "1.1.5", + "@rolldown/binding-linux-arm64-musl": "1.1.5", + "@rolldown/binding-linux-ppc64-gnu": "1.1.5", + "@rolldown/binding-linux-s390x-gnu": "1.1.5", + "@rolldown/binding-linux-x64-gnu": "1.1.5", + "@rolldown/binding-linux-x64-musl": "1.1.5", + "@rolldown/binding-openharmony-arm64": "1.1.5", + "@rolldown/binding-wasm32-wasi": "1.1.5", + "@rolldown/binding-win32-arm64-msvc": "1.1.5", + "@rolldown/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/scorm-again": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/scorm-again/-/scorm-again-3.1.1.tgz", + "integrity": "sha512-WoZkssQoMJnZE5jzTXgxOeAAlgp5P9kjeT0ha506poljdfJ+t9vhQwQjmGTWEiHwDFVxNI3lpDuFrXA90/QcVw==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/typescript": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", + "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc" + }, + "engines": { + "node": ">=16.20.0" + }, + "optionalDependencies": { + "@typescript/typescript-aix-ppc64": "7.0.2", + "@typescript/typescript-darwin-arm64": "7.0.2", + "@typescript/typescript-darwin-x64": "7.0.2", + "@typescript/typescript-freebsd-arm64": "7.0.2", + "@typescript/typescript-freebsd-x64": "7.0.2", + "@typescript/typescript-linux-arm": "7.0.2", + "@typescript/typescript-linux-arm64": "7.0.2", + "@typescript/typescript-linux-loong64": "7.0.2", + "@typescript/typescript-linux-mips64el": "7.0.2", + "@typescript/typescript-linux-ppc64": "7.0.2", + "@typescript/typescript-linux-riscv64": "7.0.2", + "@typescript/typescript-linux-s390x": "7.0.2", + "@typescript/typescript-linux-x64": "7.0.2", + "@typescript/typescript-netbsd-arm64": "7.0.2", + "@typescript/typescript-netbsd-x64": "7.0.2", + "@typescript/typescript-openbsd-arm64": "7.0.2", + "@typescript/typescript-openbsd-x64": "7.0.2", + "@typescript/typescript-sunos-x64": "7.0.2", + "@typescript/typescript-win32-arm64": "7.0.2", + "@typescript/typescript-win32-x64": "7.0.2" + } + }, + "node_modules/vite": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz", + "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.3.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..322e4c9 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "ruleta", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "howler": "^2.2.4", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "scorm-again": "^3.1.1" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.3.3", + "@types/howler": "^2.2.13", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.3", + "oxlint": "^1.71.0", + "tailwindcss": "^4.3.3", + "typescript": "^7.0.2", + "vite": "^8.1.1" + } +} diff --git a/public/audios/click.mp3 b/public/audios/click.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..62e0a38de759846f442037bd09a73035bba4a8d1 GIT binary patch literal 14912 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
+
+ + {!mostrarFeedback && ( + <> + {/* Header con categoría */} +
+ {categoria.emoji} +

{categoria.nombre}

+

{pregunta.pregunta}

+
+ + {/* Temporizador */} +
+
+ Tiempo restante + {tiempo}s +
+
+
+
+
+ + {/* Opciones */} +
+ {pregunta.opciones.map((opcion, i) => ( + + ))} +
+ + )} + + {/* Feedback */} + {mostrarFeedback && ( +
+ {feedbackCorrecto ? '🎉' : '❌'} +

+ {feedbackCorrecto ? '¡Correcto!' : '¡Incorrecto!'} +

+ {feedbackCorrecto + ?

{pregunta.retroalimentacion}

+ :

{tiempo === 0 ? 'Se agotó el tiempo.' : 'Respuesta incorrecta.'}

+ } + +
+ )} + +
+
+ ) +} diff --git a/src/components/game/ResultModal.tsx b/src/components/game/ResultModal.tsx new file mode 100644 index 0000000..8daf628 --- /dev/null +++ b/src/components/game/ResultModal.tsx @@ -0,0 +1,23 @@ +interface ResultModalProps { + totalPuntos: number + onCerrar: () => void +} + +export default function ResultModal({ totalPuntos, onCerrar }: ResultModalProps) { + return ( +
+
+ 🏆 +

¡Bien hecho!

+

Has concluido la actividad.

+

{totalPuntos} pts

+ +
+
+ ) +} diff --git a/src/components/game/Ruleta/RuletaSVG.tsx b/src/components/game/Ruleta/RuletaSVG.tsx new file mode 100644 index 0000000..49566ab --- /dev/null +++ b/src/components/game/Ruleta/RuletaSVG.tsx @@ -0,0 +1,99 @@ +import type { Categoria } from '../../../types' + +interface RuletaSVGProps { + categorias: Categoria[] + rotacion: number + isSpinning: boolean + onClick: () => void +} + +export default function RuletaSVG({ categorias, rotacion, isSpinning, onClick }: RuletaSVGProps) { + const cx = 200 + const cy = 200 + const r = 180 + const total = categorias.length + const angleStep = 360 / total + + function polarToCartesian(angle: number, radius: number) { + const rad = (angle - 90) * (Math.PI / 180) + return { + x: cx + radius * Math.cos(rad), + y: cy + radius * Math.sin(rad), + } + } + + function sectorPath(startAngle: number, endAngle: number) { + const start = polarToCartesian(startAngle, r) + const end = polarToCartesian(endAngle, r) + const largeArc = endAngle - startAngle > 180 ? 1 : 0 + return `M ${cx} ${cy} L ${start.x} ${start.y} A ${r} ${r} 0 ${largeArc} 1 ${end.x} ${end.y} Z` + } + + return ( +
+ + {/* Indicador */} +
+
+
+ + {/* Ruleta SVG */} + + {categorias.map((cat, i) => { + const startAngle = i * angleStep + const endAngle = startAngle + angleStep + const midAngle = startAngle + angleStep / 2 + const textPos = polarToCartesian(midAngle, r * 0.62) + + return ( + + {/* Sector */} + + {/* Emoji */} + + {cat.emoji} + + {/* Nombre */} + + {cat.nombre} + + + ) + })} + + {/* Centro */} + + + +
+ ) +} diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx new file mode 100644 index 0000000..a787d16 --- /dev/null +++ b/src/components/layout/Footer.tsx @@ -0,0 +1,9 @@ +export default function Footer() { + return ( +
+
+ © {new Date().getFullYear()} Actividad Interactiva — Todos los derechos reservados +
+
+ ) +} diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx new file mode 100644 index 0000000..67ce4e7 --- /dev/null +++ b/src/components/layout/Header.tsx @@ -0,0 +1,10 @@ +export default function Header() { + return ( +
+
+ 🎡 Ruleta + Actividad Interactiva +
+
+ ) +} diff --git a/src/components/screens/Cover.tsx b/src/components/screens/Cover.tsx new file mode 100644 index 0000000..53c1421 --- /dev/null +++ b/src/components/screens/Cover.tsx @@ -0,0 +1,46 @@ +import hero from '../../assets/hero.png' +import Button from '../ui/Button' +import { useAudio } from '../../hooks/useAudio' + +interface CoverProps { + onStart: () => void +} + +export default function Cover({ onStart }: CoverProps) { + const { sounds } = useAudio() + + function handleStart() { + sounds.click?.play() + onStart() + } + return ( +
+ + {/* Texto izquierdo */} +
+

+ ¡Bienvenido a la Ruleta Interactiva! +

+

+ Pon a prueba tus conocimientos girando la ruleta. + Responde cada pregunta correctamente y acumula el mayor puntaje posible. +

+
+ +
+
+ + {/* Imagen derecha */} +
+ Ruleta Interactiva +
+ +
+ ) +} diff --git a/src/components/screens/Game.tsx b/src/components/screens/Game.tsx new file mode 100644 index 0000000..943222f --- /dev/null +++ b/src/components/screens/Game.tsx @@ -0,0 +1,72 @@ +import { useEffect } from 'react' +import { useRuleta } from '../../hooks/useRuleta' +import { sounds } from '../../audio/AudioController' +import QuestionModal from '../game/QuestionModal' +import RuletaSVG from '../game/Ruleta/RuletaSVG' + +interface GameProps { + onEnd: (aprobado: boolean) => void +} + +export default function Game({ onEnd }: GameProps) { + const { estado, categorias, girar, responder, cerrarFeedback, MAX_PREGUNTAS } = useRuleta() + + useEffect(() => { + if (estado.completado) onEnd(estado.aprobado) + }, [estado.completado]) + + function handleGirar() { + sounds.click?.play() + girar() + } + + return ( +
+ + {/* Instrucciones */} +
+

¿Cómo jugar?

+

+ Haz clic en la ruleta para girarla y responde correctamente para ganar puntos. +

+
+ +
+ + {/* Progreso de preguntas */} +
+ {Array.from({ length: MAX_PREGUNTAS }).map((_, i) => ( +
+ ))} +
+ + {/* Ruleta SVG */} + + +
+ + {/* Modal pregunta */} + {estado.preguntaActual && !estado.completado && ( + + )} + +
+ ) +} diff --git a/src/components/screens/Result.tsx b/src/components/screens/Result.tsx new file mode 100644 index 0000000..acb0601 --- /dev/null +++ b/src/components/screens/Result.tsx @@ -0,0 +1,52 @@ +interface ResultProps { + aprobado: boolean + sinIntentos: boolean + onReintentar: () => void +} + +export default function Result({ aprobado, sinIntentos, onReintentar }: ResultProps) { + return ( +
+ + {/* Aprobado */} + {aprobado && ( + <> + 🏆 +

¡Felicidades!

+

+ Has completado la actividad exitosamente. ¡Excelente desempeño! +

+ + )} + + {/* Reprobado con intentos disponibles */} + {!aprobado && !sinIntentos && ( + <> + 💪 +

¡Casi lo logras!

+

+ Aún te falta un poco. Vuelve a intentarlo, ¡tú puedes! +

+ + + )} + + {/* Sin intentos */} + {sinIntentos && ( + <> + 😔 +

Intentos agotados

+

+ Has utilizado todos tus intentos disponibles. Te recomendamos repasar el contenido del curso antes de volver a intentarlo. +

+ + )} + +
+ ) +} diff --git a/src/components/ui/Button.tsx b/src/components/ui/Button.tsx new file mode 100644 index 0000000..91f56cb --- /dev/null +++ b/src/components/ui/Button.tsx @@ -0,0 +1,52 @@ +import type { ReactNode } from 'react' + +type Variant = 'primary' | 'secondary' | 'danger' | 'outline' +type Size = 'sm' | 'md' | 'lg' + +interface ButtonProps { + children: ReactNode + variant?: Variant + size?: Size + disabled?: boolean + onClick?: () => void + type?: 'button' | 'submit' | 'reset' + className?: string +} + +const variants: Record = { + primary: 'bg-purple-600 text-white hover:bg-purple-700 active:bg-purple-800', + secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300 active:bg-gray-400', + danger: 'bg-red-500 text-white hover:bg-red-600 active:bg-red-700', + outline: 'border-2 border-purple-600 text-purple-600 hover:bg-purple-50 active:bg-purple-100', +} + +const sizes: Record = { + sm: 'px-3 py-1.5 text-sm', + md: 'px-5 py-2.5 text-base', + lg: 'px-7 py-3.5 text-lg', +} + +export default function Button({ + children, + variant = 'primary', + size = 'md', + disabled = false, + onClick, + type = 'button', + className = '', +}: ButtonProps) { + return ( + + ) +} diff --git a/src/data/preguntas.json b/src/data/preguntas.json new file mode 100644 index 0000000..e37b50f --- /dev/null +++ b/src/data/preguntas.json @@ -0,0 +1,297 @@ +{ + "categorias": [ + { + "id": 0, + "nombre": "Historia", + "color": "#7C3AED", + "emoji": "🏛️", + "preguntas": [ + { + "id": 1, + "pregunta": "¿En qué año cayó el Muro de Berlín?", + "opciones": ["1987", "1989", "1991", "1993"], + "correcta": 1, + "retroalimentacion": "El Muro de Berlín cayó el 9 de noviembre de 1989, marcando el fin de la Guerra Fría." + }, + { + "id": 2, + "pregunta": "¿Quién fue el primer presidente de los Estados Unidos?", + "opciones": ["Abraham Lincoln", "Thomas Jefferson", "George Washington", "Benjamin Franklin"], + "correcta": 2, + "retroalimentacion": "George Washington fue el primer presidente de EE.UU., gobernando de 1789 a 1797." + }, + { + "id": 3, + "pregunta": "¿En qué año comenzó la Primera Guerra Mundial?", + "opciones": ["1912", "1914", "1916", "1918"], + "correcta": 1, + "retroalimentacion": "La Primera Guerra Mundial comenzó en 1914 tras el asesinato del archiduque Francisco Fernando." + }, + { + "id": 4, + "pregunta": "¿Qué civilización construyó las pirámides de Giza?", + "opciones": ["Griega", "Romana", "Egipcia", "Mesopotámica"], + "correcta": 2, + "retroalimentacion": "Las pirámides de Giza fueron construidas por los antiguos egipcios hace más de 4,500 años." + }, + { + "id": 5, + "pregunta": "¿En qué año llegó Cristóbal Colón a América?", + "opciones": ["1488", "1490", "1492", "1495"], + "correcta": 2, + "retroalimentacion": "Cristóbal Colón llegó a América el 12 de octubre de 1492." + }, + { + "id": 6, + "pregunta": "¿Quién fue Napoleón Bonaparte?", + "opciones": ["Rey de España", "Emperador de Francia", "Presidente de Italia", "General inglés"], + "correcta": 1, + "retroalimentacion": "Napoleón Bonaparte fue Emperador de Francia entre 1804 y 1815." + }, + { + "id": 7, + "pregunta": "¿En qué país se originó la Revolución Industrial?", + "opciones": ["Francia", "Alemania", "Estados Unidos", "Inglaterra"], + "correcta": 3, + "retroalimentacion": "La Revolución Industrial comenzó en Inglaterra a mediados del siglo XVIII." + }, + { + "id": 8, + "pregunta": "¿Cuál fue el primer país en conceder el voto a la mujer?", + "opciones": ["Francia", "Nueva Zelanda", "Estados Unidos", "Suecia"], + "correcta": 1, + "retroalimentacion": "Nueva Zelanda fue el primer país en conceder el voto a la mujer en 1893." + } + ] + }, + { + "id": 1, + "nombre": "Geografía", + "color": "#059669", + "emoji": "🌍", + "preguntas": [ + { + "id": 9, + "pregunta": "¿Cuál es el río más largo del mundo?", + "opciones": ["Amazonas", "Nilo", "Yangtsé", "Misisipi"], + "correcta": 1, + "retroalimentacion": "El río Nilo, con aproximadamente 6,650 km, es considerado el río más largo del mundo." + }, + { + "id": 10, + "pregunta": "¿Cuál es el país más grande del mundo por superficie?", + "opciones": ["China", "Canadá", "Estados Unidos", "Rusia"], + "correcta": 3, + "retroalimentacion": "Rusia es el país más grande del mundo con 17.1 millones de km²." + }, + { + "id": 11, + "pregunta": "¿En qué continente se encuentra el desierto del Sahara?", + "opciones": ["Asia", "América", "África", "Australia"], + "correcta": 2, + "retroalimentacion": "El Sahara se encuentra en África y es el desierto cálido más grande del mundo." + }, + { + "id": 12, + "pregunta": "¿Cuál es la capital de Australia?", + "opciones": ["Sídney", "Melbourne", "Canberra", "Brisbane"], + "correcta": 2, + "retroalimentacion": "Canberra es la capital de Australia, no Sídney como muchos creen." + }, + { + "id": 13, + "pregunta": "¿Cuántos océanos hay en el planeta?", + "opciones": ["3", "4", "5", "6"], + "correcta": 2, + "retroalimentacion": "Hay 5 océanos: Pacífico, Atlántico, Índico, Ártico y Antártico." + }, + { + "id": 14, + "pregunta": "¿Cuál es el volcán activo más alto del mundo?", + "opciones": ["Etna", "Kilimanjaro", "Ojos del Salado", "Cotopaxi"], + "correcta": 3, + "retroalimentacion": "El Cotopaxi en Ecuador es uno de los volcanes activos más altos del mundo con 5,897 metros." + }, + { + "id": 15, + "pregunta": "¿En qué país se encuentra la Torre de Pisa?", + "opciones": ["España", "Francia", "Italia", "Portugal"], + "correcta": 2, + "retroalimentacion": "La Torre de Pisa se encuentra en la ciudad de Pisa, Italia." + }, + { + "id": 16, + "pregunta": "¿Cuál es el país más pequeño del mundo?", + "opciones": ["Mónaco", "San Marino", "Liechtenstein", "Ciudad del Vaticano"], + "correcta": 3, + "retroalimentacion": "Ciudad del Vaticano es el país más pequeño del mundo con apenas 0.44 km²." + } + ] + }, + { + "id": 2, + "nombre": "Ciencia", + "color": "#DC2626", + "emoji": "🔬", + "preguntas": [ + { + "id": 17, + "pregunta": "¿Cuál es el elemento más abundante en el universo?", + "opciones": ["Oxígeno", "Carbono", "Hidrógeno", "Helio"], + "correcta": 2, + "retroalimentacion": "El hidrógeno es el elemento más abundante del universo, constituyendo el 75% de su masa." + }, + { + "id": 18, + "pregunta": "¿A qué velocidad viaja la luz en el vacío?", + "opciones": ["200,000 km/s", "300,000 km/s", "400,000 km/s", "150,000 km/s"], + "correcta": 1, + "retroalimentacion": "La luz viaja a aproximadamente 299,792 km/s en el vacío." + }, + { + "id": 19, + "pregunta": "¿Cuántos huesos tiene el cuerpo humano adulto?", + "opciones": ["196", "206", "216", "226"], + "correcta": 1, + "retroalimentacion": "El cuerpo humano adulto tiene 206 huesos." + }, + { + "id": 20, + "pregunta": "¿Cuál es el planeta más grande del sistema solar?", + "opciones": ["Saturno", "Neptuno", "Júpiter", "Urano"], + "correcta": 2, + "retroalimentacion": "Júpiter es el planeta más grande del sistema solar." + }, + { + "id": 21, + "pregunta": "¿Qué gas es el más abundante en la atmósfera terrestre?", + "opciones": ["Oxígeno", "Dióxido de carbono", "Nitrógeno", "Argón"], + "correcta": 2, + "retroalimentacion": "El nitrógeno constituye aproximadamente el 78% de la atmósfera terrestre." + }, + { + "id": 22, + "pregunta": "¿Cuántos cromosomas tiene una célula humana normal?", + "opciones": ["23", "44", "46", "48"], + "correcta": 2, + "retroalimentacion": "Las células humanas normales tienen 46 cromosomas, organizados en 23 pares." + }, + { + "id": 23, + "pregunta": "¿Quién formuló la teoría de la relatividad?", + "opciones": ["Isaac Newton", "Albert Einstein", "Nikola Tesla", "Stephen Hawking"], + "correcta": 1, + "retroalimentacion": "Albert Einstein formuló la teoría de la relatividad especial en 1905 y la general en 1915." + }, + { + "id": 24, + "pregunta": "¿Cuál es el símbolo químico del oro?", + "opciones": ["Go", "Ag", "Au", "Or"], + "correcta": 2, + "retroalimentacion": "El símbolo químico del oro es Au, del latín Aurum." + } + ] + }, + { + "id": 3, + "nombre": "Arte y Literatura", + "color": "#D97706", + "emoji": "🎨", + "preguntas": [ + { + "id": 25, + "pregunta": "¿Quién escribió 'Cien años de soledad'?", + "opciones": ["Mario Vargas Llosa", "Pablo Neruda", "Gabriel García Márquez", "Jorge Luis Borges"], + "correcta": 2, + "retroalimentacion": "Gabriel García Márquez escribió Cien años de soledad en 1967, obra cumbre del realismo mágico." + }, + { + "id": 26, + "pregunta": "¿Quién pintó 'La noche estrellada'?", + "opciones": ["Pablo Picasso", "Claude Monet", "Salvador Dalí", "Vincent van Gogh"], + "correcta": 3, + "retroalimentacion": "La noche estrellada fue pintada por Vincent van Gogh en 1889." + }, + { + "id": 27, + "pregunta": "¿En qué país nació Mozart?", + "opciones": ["Alemania", "Austria", "Italia", "Francia"], + "correcta": 1, + "retroalimentacion": "Wolfgang Amadeus Mozart nació en Salzburgo, Austria, en 1756." + }, + { + "id": 28, + "pregunta": "¿Quién escribió 'Don Quijote de la Mancha'?", + "opciones": ["Lope de Vega", "Miguel de Cervantes", "Francisco de Quevedo", "Garcilaso de la Vega"], + "correcta": 1, + "retroalimentacion": "Don Quijote de la Mancha fue escrita por Miguel de Cervantes y publicada en 1605." + }, + { + "id": 29, + "pregunta": "¿Quién compuso la Quinta Sinfonía?", + "opciones": ["Mozart", "Bach", "Beethoven", "Chopin"], + "correcta": 2, + "retroalimentacion": "La Quinta Sinfonía fue compuesta por Ludwig van Beethoven entre 1804 y 1808." + }, + { + "id": 30, + "pregunta": "¿En qué museo se encuentra la Mona Lisa?", + "opciones": ["Museo del Prado", "Museo Británico", "Museo del Louvre", "Museo Uffizi"], + "correcta": 2, + "retroalimentacion": "La Mona Lisa se encuentra en el Museo del Louvre en París, Francia." + }, + { + "id": 31, + "pregunta": "¿Quién escribió 'Romeo y Julieta'?", + "opciones": ["Charles Dickens", "William Shakespeare", "Jane Austen", "Victor Hugo"], + "correcta": 1, + "retroalimentacion": "Romeo y Julieta fue escrita por William Shakespeare alrededor de 1595." + }, + { + "id": 32, + "pregunta": "¿Qué movimiento artístico lideró Salvador Dalí?", + "opciones": ["Cubismo", "Impresionismo", "Surrealismo", "Expresionismo"], + "correcta": 2, + "retroalimentacion": "Salvador Dalí fue uno de los principales representantes del Surrealismo." + } + ] + } + ], + "bancoGenerico": [ + { + "id": 101, + "pregunta": "¿Cuál es el océano más grande del mundo?", + "opciones": ["Atlántico", "Índico", "Pacífico", "Ártico"], + "correcta": 2, + "retroalimentacion": "El océano Pacífico es el más grande, cubriendo más de 165 millones de km²." + }, + { + "id": 102, + "pregunta": "¿Cuántos planetas tiene el sistema solar?", + "opciones": ["7", "8", "9", "10"], + "correcta": 1, + "retroalimentacion": "El sistema solar tiene 8 planetas desde que Plutón fue reclasificado en 2006." + }, + { + "id": 103, + "pregunta": "¿Cuál es el animal terrestre más rápido?", + "opciones": ["León", "Guepardo", "Antílope", "Caballo"], + "correcta": 1, + "retroalimentacion": "El guepardo puede alcanzar velocidades de hasta 120 km/h, siendo el animal terrestre más rápido." + }, + { + "id": 104, + "pregunta": "¿En qué año se fundó la ONU?", + "opciones": ["1943", "1945", "1947", "1950"], + "correcta": 1, + "retroalimentacion": "La ONU fue fundada el 24 de octubre de 1945 tras el fin de la Segunda Guerra Mundial." + }, + { + "id": 105, + "pregunta": "¿Cuál es el idioma más hablado en el mundo?", + "opciones": ["Inglés", "Español", "Mandarín", "Hindi"], + "correcta": 2, + "retroalimentacion": "El mandarín es el idioma con más hablantes nativos, con más de 900 millones." + } + ] +} diff --git a/src/hooks/useAudio.ts b/src/hooks/useAudio.ts new file mode 100644 index 0000000..b6de53b --- /dev/null +++ b/src/hooks/useAudio.ts @@ -0,0 +1,23 @@ +import { useEffect, useCallback } from 'react' +import { audioController, sounds } from '../audio/AudioController' +import { createSound, stopAllSounds } from '../audio/ExtendedHowl' + +export function useAudio() { + useEffect(() => { + return () => audioController.stop() + }, []) + + const load = useCallback((url: string) => audioController.load(url), []) + const play = useCallback(() => audioController.play(), []) + const pause = useCallback(() => audioController.pause(), []) + const stop = useCallback(() => audioController.stop(), []) + const toggle = useCallback(() => audioController.toggle(), []) + const toggleMute = useCallback(() => audioController.toggleMute(), []) + const stopAll = useCallback(() => stopAllSounds(), []) + const playNew = useCallback((url: string) => { + const howl = createSound(url) + if (howl) audioController.stopAllAndPlay(howl) + }, []) + + return { load, play, pause, stop, toggle, toggleMute, stopAll, playNew, sounds, audioController } +} diff --git a/src/hooks/useIntentos.ts b/src/hooks/useIntentos.ts new file mode 100644 index 0000000..4262c47 --- /dev/null +++ b/src/hooks/useIntentos.ts @@ -0,0 +1,31 @@ +const KEY_INTENTOS = 'ruleta_intentos_usados' +const KEY_AGOTADOS = 'ruleta_intentos_agotados' +const MAX_INTENTOS = 3 + +function getIntentosUsados(): number { + return parseInt(sessionStorage.getItem(KEY_INTENTOS) ?? '0', 10) +} + +function setIntentosUsados(n: number): void { + sessionStorage.setItem(KEY_INTENTOS, String(n)) + if (n >= MAX_INTENTOS) { + sessionStorage.setItem(KEY_AGOTADOS, 'true') + } +} + +export function intentosAgotados(): boolean { + return sessionStorage.getItem(KEY_AGOTADOS) === 'true' +} + +export function intentosRestantes(): number { + return Math.max(0, MAX_INTENTOS - getIntentosUsados()) +} + +export function consumirIntento(): void { + setIntentosUsados(getIntentosUsados() + 1) +} + +export function resetIntentos(): void { + sessionStorage.removeItem(KEY_INTENTOS) + sessionStorage.removeItem(KEY_AGOTADOS) +} diff --git a/src/hooks/useRuleta.ts b/src/hooks/useRuleta.ts new file mode 100644 index 0000000..a98ba70 --- /dev/null +++ b/src/hooks/useRuleta.ts @@ -0,0 +1,134 @@ +import { useState, useRef } from 'react' +import type { Pregunta, Categoria, PreguntasData } from '../types' +import data from '../data/preguntas.json' +import { sounds } from '../audio/AudioController' + +const { categorias, bancoGenerico } = data as PreguntasData +const MAX_PREGUNTAS = 10 +const MIN_CORRECTAS = 8 +const SECCIONES = categorias.length +const ANGULO_SECCION = 360 / SECCIONES + +export interface EstadoJuego { + isSpinning: boolean + rotacion: number + preguntaActual: Pregunta | null + categoriaActual: Categoria | null + mostrarFeedback: boolean + feedbackCorrecto: boolean + preguntasRespondidas: number + correctas: number + completado: boolean + aprobado: boolean + preguntasUsadas: Record + bancoPreguntasUsadas: number[] +} + +export function useRuleta() { + const [estado, setEstado] = useState({ + isSpinning: false, + rotacion: 0, + preguntaActual: null, + categoriaActual: null, + mostrarFeedback: false, + feedbackCorrecto: false, + preguntasRespondidas: 0, + correctas: 0, + completado: false, + aprobado: false, + preguntasUsadas: {}, + bancoPreguntasUsadas: [], + }) + + const rotacionRef = useRef(0) + + function seleccionarPregunta(categoria: Categoria, preguntasUsadas: Record, bancoPreguntasUsadas: number[]): { pregunta: Pregunta, esGenerica: boolean } { + const usadas = preguntasUsadas[categoria.id] ?? [] + const disponibles = categoria.preguntas.filter((_, i) => !usadas.includes(i)) + + if (disponibles.length > 0) { + const idx = Math.floor(Math.random() * disponibles.length) + return { pregunta: disponibles[idx], esGenerica: false } + } + + // Banco genérico + const disponiblesGenericas = bancoGenerico.filter((_, i) => !bancoPreguntasUsadas.includes(i)) + const pool = disponiblesGenericas.length > 0 ? disponiblesGenericas : bancoGenerico + const idx = Math.floor(Math.random() * pool.length) + return { pregunta: pool[idx], esGenerica: true } + } + + function girar() { + if (estado.isSpinning || estado.completado) return + + sounds.wheelSpin?.play() + + const vueltas = 3 + Math.random() * 2 + const anguloFinal = Math.random() * 360 + const rotacionTotal = rotacionRef.current + vueltas * 360 + anguloFinal + rotacionRef.current = rotacionTotal + + setEstado((prev) => ({ ...prev, isSpinning: true, rotacion: rotacionTotal })) + + setTimeout(() => { + const anguloNormalizado = ((360 - (rotacionRef.current % 360)) + 360) % 360 + const indiceCategoria = Math.floor(anguloNormalizado / ANGULO_SECCION) % SECCIONES + const categoria = categorias[indiceCategoria] + + setEstado((prev) => { + const { pregunta, esGenerica } = seleccionarPregunta(categoria, prev.preguntasUsadas, prev.bancoPreguntasUsadas) + const originalIdx = esGenerica + ? bancoGenerico.indexOf(pregunta) + : categoria.preguntas.indexOf(pregunta) + + return { + ...prev, + preguntaActual: pregunta, + categoriaActual: categoria, + preguntasUsadas: esGenerica ? prev.preguntasUsadas : { + ...prev.preguntasUsadas, + [categoria.id]: [...(prev.preguntasUsadas[categoria.id] ?? []), originalIdx], + }, + bancoPreguntasUsadas: esGenerica + ? [...prev.bancoPreguntasUsadas, originalIdx] + : prev.bancoPreguntasUsadas, + } + }) + }, 4000) + } + + function responder(indiceOpcion: number | null) { + if (!estado.preguntaActual) return + const esCorrecta = indiceOpcion !== null && indiceOpcion === estado.preguntaActual.correcta + + if (esCorrecta) sounds.correct?.play() + else sounds.incorrect?.play() + + const nuevasCorrectas = estado.correctas + (esCorrecta ? 1 : 0) + const nuevasRespondidas = estado.preguntasRespondidas + 1 + const completado = nuevasRespondidas >= MAX_PREGUNTAS + const aprobado = completado && nuevasCorrectas >= MIN_CORRECTAS + + setEstado((prev) => ({ + ...prev, + correctas: nuevasCorrectas, + preguntasRespondidas: nuevasRespondidas, + mostrarFeedback: true, + feedbackCorrecto: esCorrecta, + completado, + aprobado, + })) + } + + function cerrarFeedback() { + setEstado((prev) => ({ + ...prev, + preguntaActual: null, + categoriaActual: null, + mostrarFeedback: false, + isSpinning: false, + })) + } + + return { estado, categorias, girar, responder, cerrarFeedback, MAX_PREGUNTAS, MIN_CORRECTAS } +} diff --git a/src/hooks/useSCORM.ts b/src/hooks/useSCORM.ts new file mode 100644 index 0000000..a33dc42 --- /dev/null +++ b/src/hooks/useSCORM.ts @@ -0,0 +1,46 @@ +import { useEffect } from 'react' +import { + initSCORM, + finishSCORM, + getScore, + setScore, + getLessonStatus, + setLessonStatus, + getLessonLocation, + setLessonLocation, + getSuspendData, + setSuspendData, + getStudentName, + getScormData, + setScormData, + completeLesson, + isConnected, +} from '../scorm/scorm' + +export function useSCORM() { + useEffect(() => { + initSCORM() + window.addEventListener('beforeunload', finishSCORM) + return () => { + window.removeEventListener('beforeunload', finishSCORM) + finishSCORM() + } + }, []) + + return { + isConnected, + getStudentName, + getScore, + setScore, + getLessonStatus, + setLessonStatus, + getLessonLocation, + setLessonLocation, + getSuspendData, + setSuspendData, + getScormData, + setScormData, + completeLesson, + finishSCORM, + } +} diff --git a/src/hooks/useScale.ts b/src/hooks/useScale.ts new file mode 100644 index 0000000..0b46150 --- /dev/null +++ b/src/hooks/useScale.ts @@ -0,0 +1,34 @@ +import { useEffect, useRef } from 'react' + +const BASE_WIDTH = 1920 +const BASE_HEIGHT = 1080 + +export function useScale() { + const ref = useRef(null) + + useEffect(() => { + function scale() { + const el = ref.current + if (!el) return + + const scaleX = window.innerWidth / BASE_WIDTH + const scaleY = window.innerHeight / BASE_HEIGHT + const s = Math.min(scaleX, scaleY) + + el.style.transform = `scale(${s})` + el.style.transformOrigin = 'top left' + el.style.width = `${BASE_WIDTH}px` + el.style.height = `${BASE_HEIGHT}px` + el.style.position = 'absolute' + el.style.left = `${(window.innerWidth - BASE_WIDTH * s) / 2}px` + el.style.top = `${(window.innerHeight - BASE_HEIGHT * s) / 2}px` + el.style.overflow = 'hidden' + } + + scale() + window.addEventListener('resize', scale) + return () => window.removeEventListener('resize', scale) + }, []) + + return ref +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/src/index.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/src/layouts/MainLayout.tsx b/src/layouts/MainLayout.tsx new file mode 100644 index 0000000..ebda555 --- /dev/null +++ b/src/layouts/MainLayout.tsx @@ -0,0 +1,24 @@ +import type { ReactNode } from 'react' +import { useScale } from '../hooks/useScale' +import Header from '../components/layout/Header' +import Footer from '../components/layout/Footer' + +interface MainLayoutProps { + children: ReactNode +} + +export default function MainLayout({ children }: MainLayoutProps) { + const scaleRef = useScale() + + return ( +
+
+
+
+ {children} +
+
+
+
+ ) +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..572d6ac --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,18 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +// Simulador SCORM solo en desarrollo +if (import.meta.env.DEV) { + const { Scorm12API } = await import('scorm-again') + const api = new Scorm12API({}) + window.API = api + api.lmsInitialize() +} + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/scorm/scorm.ts b/src/scorm/scorm.ts new file mode 100644 index 0000000..4cd9fd5 --- /dev/null +++ b/src/scorm/scorm.ts @@ -0,0 +1,145 @@ +interface SCORM12API { + LMSInitialize: (s: string) => string + LMSGetValue: (key: string) => string + LMSSetValue: (key: string, value: string) => string + LMSCommit: (s: string) => string + LMSFinish: (s: string) => string +} + +declare global { + interface Window { + API?: SCORM12API + } +} + +let sessionStartTime: number | null = null +let scormFinished = false + +// ─── API ────────────────────────────────────────────────────────────────────── + +function getAPI(): SCORM12API | null { + if (window.API) return window.API + if (window.parent?.API) return window.parent.API + return null +} + +function isConnected(): boolean { + return getAPI() !== null +} + +// ─── Get / Set genérico con fallback a sessionStorage ──────────────────────── + +export function getScormData(key: string): string { + const api = getAPI() + if (api) return api.LMSGetValue(key) ?? '' + return sessionStorage.getItem(key) ?? '' +} + +export function setScormData(key: string, value: string): boolean { + const api = getAPI() + if (api) { + const ok = api.LMSSetValue(key, value) + api.LMSCommit('') + return ok === 'true' + } + sessionStorage.setItem(key, value) + return true +} + +// ─── Inicialización ─────────────────────────────────────────────────────────── + +export function initSCORM(): void { + const api = getAPI() + if (api) { + api.LMSInitialize('') + const status = api.LMSGetValue('cmi.core.lesson_status') + if (status === 'not attempted') { + api.LMSSetValue('cmi.core.lesson_status', 'incomplete') + api.LMSCommit('') + } + } + sessionStartTime = Date.now() +} + +// ─── Lesson status ──────────────────────────────────────────────────────────── + +export function getLessonStatus(): string { + return getScormData('cmi.core.lesson_status') +} + +export function setLessonStatus(status: 'passed' | 'failed' | 'completed' | 'incomplete'): boolean { + return setScormData('cmi.core.lesson_status', status) +} + +// ─── Lesson location ────────────────────────────────────────────────────────── + +export function getLessonLocation(): string { + return getScormData('cmi.core.lesson_location') +} + +export function setLessonLocation(location: string): boolean { + return setScormData('cmi.core.lesson_location', location) +} + +// ─── Score ──────────────────────────────────────────────────────────────────── + +export function getScore(): number | null { + const val = getScormData('cmi.core.score.raw') + return val !== '' ? Number(val) : null +} + +export function setScore(score: number, maxScore = 100, minScore = 0): void { + setScormData('cmi.core.score.raw', String(score)) + setScormData('cmi.core.score.max', String(maxScore)) + setScormData('cmi.core.score.min', String(minScore)) +} + +// ─── Suspend data ───────────────────────────────────────────────────────────── + +export function getSuspendData(): T | null { + const val = getScormData('cmi.suspend_data') + if (!val) return null + try { + return JSON.parse(val) as T + } catch { + return null + } +} + +export function setSuspendData(data: unknown): boolean { + return setScormData('cmi.suspend_data', JSON.stringify(data)) +} + +// ─── Student name ───────────────────────────────────────────────────────────── + +export function getStudentName(): string { + return getScormData('cmi.core.student_name') +} + +// ─── Finish con session_time ────────────────────────────────────────────────── + +export function finishSCORM(): void { + if (scormFinished) return + const api = getAPI() + if (!api) return + + if (sessionStartTime) { + const elapsed = Math.floor((Date.now() - sessionStartTime) / 1000) + const hh = String(Math.floor(elapsed / 3600)).padStart(2, '0') + const mm = String(Math.floor((elapsed % 3600) / 60)).padStart(2, '0') + const ss = String(elapsed % 60).padStart(2, '0') + api.LMSSetValue('cmi.core.session_time', `${hh}:${mm}:${ss}`) + } + + api.LMSCommit('') + api.LMSFinish('') + scormFinished = true +} + +// ─── Helper: completar lección ──────────────────────────────────────────────── + +export function completeLesson(): void { + setLessonStatus('completed') +} + +export { isConnected } diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..b196eb5 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,20 @@ +export interface Pregunta { + id: number + pregunta: string + opciones: string[] + correcta: number + retroalimentacion: string +} + +export interface Categoria { + id: number + nombre: string + color: string + emoji: string + preguntas: Pregunta[] +} + +export interface PreguntasData { + categorias: Categoria[] + bancoGenerico: Pregunta[] +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..a6ca08b --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,11 @@ +/// + +declare module '*.png' { + const src: string + export default src +} + +declare module '*.svg' { + const src: string + export default src +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..109f0ac --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..0616e59 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +export default defineConfig({ + plugins: [react(), tailwindcss()], +})

muS`C4|zQU|BZr0z{i=5_3G3Wlj4g()T&6a+F(c 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 Rc=CT5a{poR|My=0-vGf(lpFv6 literal 0 HcmV?d00001 diff --git a/public/audios/feedback-incorrect.mpeg b/public/audios/feedback-incorrect.mpeg new file mode 100644 index 0000000000000000000000000000000000000000..ac22ed3c3cd897bf8033b6173a6881ae419134b4 GIT binary patch literal 15539 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%0AQm_(I`|S71pG$#q{-fNZ8fa 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 literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/indicador.png b/public/img/indicador.png new file mode 100644 index 0000000000000000000000000000000000000000..45298870435dd549fdb2821abec10856bcd788c4 GIT binary patch literal 3228 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 Ef*7E*PXGV_ literal 0 HcmV?d00001 diff --git a/public/img/progress.png b/public/img/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..3fe9a2de788e77a932c21f2b3cba9577f9c98244 GIT binary patch literal 973 zcmV;;12X)HP)P)t-s|7#2X z(6s;n0RP9Q|92h#bsPVgS^u?&|8p7jibVg#qyLy!|D|mIh&%trr2l{}|8Elip=SSh zA^&X-|IM)fnOOgQD*wx^|FC}l$f*CikpIJ<|F3@k%&-55JpZzT|H7UB$EE*l4F9{4 z|8f`qkxc(<3;%K#=;-L<|8Ek;#>UUj&;M->|IM+xySu}~!^fnK+rF*;ek=dQqyL>>|C3Jtjz#~2 zGykY@|DtIBbsPV{oBx?t|HGgEyp#XAj{mla|92q&zL)=pI{&VG|9T|$!=(SSh5xH~ z|A{{Tv4HO2*zUom@x7ho+SJv~%KXx}_Q#1N4MPpuN!erSk@qxJ#iTS6L zO-9}_*F3R*%laR`WF#Wb?v?d=zS#o9+t192;qcB*=<(WRW!N94!0kuo!tbG#(M~Ju zuxD_0{f@bG-8h4=UzYWIPT;)vnz`0HKY^$$8#OO~4j6^5l{RFRO`bwF!)S~e$QicE zhH+|j(~O953L%tDHo$nn$m9@o4Q1C_tyV6@=yXstfU<#nK0in?I(i;LB4lp*4kJ`V z(u7Fla=C1ZQMy6XCt?O`AgKy7rTs54M`J1 zS!gz!{pXC%MHA+PvfggDYlpjxOdmxT6ruQjLVu4@IjSP)I?5_bHPH7Nk$w$)W?5eq zDtd~M(5tXwzlv{EK(=)uA*xV6Kfyb=Xv7Sv6QPUG?5GS9(_^)3PGV znrXjV#+RR%W0zyisu)ydS(Cc_RWgh(%z?3?$%2dO{h9Ch{3}Lb9qA24S&Wmf4g>i4eyPMv(;00000NkvXXu0mjf^5_wC literal 0 HcmV?d00001 diff --git a/public/img/ruleta.png b/public/img/ruleta.png new file mode 100644 index 0000000000000000000000000000000000000000..e03d743baa820b1656d873f92cdc33faff4b99aa GIT binary patch literal 23036 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 P00000NkvXXu0mjfpAE69 literal 0 HcmV?d00001 diff --git a/public/imsmanifest.xml b/public/imsmanifest.xml new file mode 100644 index 0000000..f29ba18 --- /dev/null +++ b/public/imsmanifest.xml @@ -0,0 +1,30 @@ + + + + + ADL SCORM + 1.2 + + + + + Ruleta Interactiva + + Ruleta Interactiva + 80 + + + + + + + + + + + diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..f90339d --- /dev/null +++ b/src/App.css @@ -0,0 +1,184 @@ +.counter { + font-size: 16px; + padding: 5px 10px; + border-radius: 5px; + color: var(--accent); + background: var(--accent-bg); + border: 2px solid transparent; + transition: border-color 0.3s; + margin-bottom: 24px; + + &:hover { + border-color: var(--accent-border); + } + &:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; + } +} + +.hero { + position: relative; + + .base, + .framework, + .vite { + inset-inline: 0; + margin: 0 auto; + } + + .base { + width: 170px; + position: relative; + z-index: 0; + } + + .framework, + .vite { + position: absolute; + } + + .framework { + z-index: 1; + top: 34px; + height: 28px; + transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg) + scale(1.4); + } + + .vite { + z-index: 0; + top: 107px; + height: 26px; + width: auto; + transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg) + scale(0.8); + } +} + +#center { + display: flex; + flex-direction: column; + gap: 25px; + place-content: center; + place-items: center; + flex-grow: 1; + + @media (max-width: 1024px) { + padding: 32px 20px 24px; + gap: 18px; + } +} + +#next-steps { + display: flex; + border-top: 1px solid var(--border); + text-align: left; + + & > div { + flex: 1 1 0; + padding: 32px; + @media (max-width: 1024px) { + padding: 24px 20px; + } + } + + .icon { + margin-bottom: 16px; + width: 22px; + height: 22px; + } + + @media (max-width: 1024px) { + flex-direction: column; + text-align: center; + } +} + +#docs { + border-right: 1px solid var(--border); + + @media (max-width: 1024px) { + border-right: none; + border-bottom: 1px solid var(--border); + } +} + +#next-steps ul { + list-style: none; + padding: 0; + display: flex; + gap: 8px; + margin: 32px 0 0; + + .logo { + height: 18px; + } + + a { + color: var(--text-h); + font-size: 16px; + border-radius: 6px; + background: var(--social-bg); + display: flex; + padding: 6px 12px; + align-items: center; + gap: 8px; + text-decoration: none; + transition: box-shadow 0.3s; + + &:hover { + box-shadow: var(--shadow); + } + .button-icon { + height: 18px; + width: 18px; + } + } + + @media (max-width: 1024px) { + margin-top: 20px; + flex-wrap: wrap; + justify-content: center; + + li { + flex: 1 1 calc(50% - 8px); + } + + a { + width: 100%; + justify-content: center; + box-sizing: border-box; + } + } +} + +#spacer { + height: 88px; + border-top: 1px solid var(--border); + @media (max-width: 1024px) { + height: 48px; + } +} + +.ticks { + position: relative; + width: 100%; + + &::before, + &::after { + content: ''; + position: absolute; + top: -4.5px; + border: 5px solid transparent; + } + + &::before { + left: 0; + border-left-color: var(--border); + } + &::after { + right: 0; + border-right-color: var(--border); + } +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..425a19c --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,51 @@ +import { useState } from 'react' +import MainLayout from './layouts/MainLayout' +import Cover from './components/screens/Cover' +import Game from './components/screens/Game' +import Result from './components/screens/Result' +import { consumirIntento, intentosAgotados } from './hooks/useIntentos' + +type Screen = 'cover' | 'game' | 'result' + +interface ResultState { + aprobado: boolean + sinIntentos: boolean +} + +export default function App() { + const [screen, setScreen] = useState(() => + intentosAgotados() ? 'result' : 'cover' + ) + const [resultState, setResultState] = useState({ + aprobado: false, + sinIntentos: intentosAgotados(), + }) + + function handleStart() { + consumirIntento() + setScreen('game') + } + + function handleGameEnd(aprobado: boolean) { + setResultState({ aprobado, sinIntentos: intentosAgotados() }) + setScreen('result') + } + + function handleReintentar() { + setScreen('cover') + } + + return ( + + {screen === 'cover' && } + {screen === 'game' && } + {screen === 'result' && ( + + )} + + ) +} diff --git a/src/assets/hero.png b/src/assets/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..02251f4b956c55af2d76fd0788124d7eee2b45eb GIT binary patch literal 13057 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 P00000NkvXXu0mjft=yBf literal 0 HcmV?d00001 diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/vite.svg b/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/src/audio/AudioController.ts b/src/audio/AudioController.ts new file mode 100644 index 0000000..d6692cd --- /dev/null +++ b/src/audio/AudioController.ts @@ -0,0 +1,80 @@ +import { Howler } from 'howler' +import { ExtendedHowl, createSound, stopAllSounds } from './ExtendedHowl' +import { AUDIOS } from './audios' + +export class AudioController { + private audioElement: ExtendedHowl | null = null + private isMuted = false + + load(url: string): void { + this.audioElement?.stop() + this.audioElement = createSound(url) + } + + setHowl(howl: ExtendedHowl): void { + this.audioElement?.stop() + this.audioElement = howl + } + + stopAllAndPlay(howl: ExtendedHowl): void { + stopAllSounds() + this.setHowl(howl) + this.play() + } + + play(): void { + this.audioElement?.play() + } + + pause(): void { + this.audioElement?.pause() + } + + stop(): void { + this.audioElement?.stop() + } + + toggle(): void { + if (!this.audioElement) return + this.audioElement.playing() ? this.pause() : this.play() + } + + toggleMute(): void { + this.isMuted = !this.isMuted + Howler.mute(this.isMuted) + } + + isPlaying(): boolean { + return this.audioElement?.playing() ?? false + } + + getMuted(): boolean { + return this.isMuted + } + + getDuration(): number { + return (this.audioElement?.duration() as number) ?? 0 + } + + onTimeUpdate(cb: (currentTime: number) => void): void { + this.audioElement?.onTimeUpdate(cb) + } + + offTimeUpdate(cb: (currentTime: number) => void): void { + this.audioElement?.offTimeUpdate(cb) + } + + on(event: string, cb: () => void): void { + this.audioElement?.on(event, cb) + } +} + +export const audioController = new AudioController() + +// Sonidos precargados listos para usar +export const sounds = { + click: createSound(AUDIOS.click), + wheelSpin: createSound(AUDIOS.wheelSpin), + correct: createSound(AUDIOS.correct), + incorrect: createSound(AUDIOS.incorrect), +} diff --git a/src/audio/ExtendedHowl.ts b/src/audio/ExtendedHowl.ts new file mode 100644 index 0000000..1774ac5 --- /dev/null +++ b/src/audio/ExtendedHowl.ts @@ -0,0 +1,69 @@ +import { Howl, Howler } from 'howler' + +type TimeUpdateCallback = (currentTime: number) => void + +declare module 'howler' { + interface HowlerGlobal { + _howls: Howl[] + } +} + +export class ExtendedHowl extends Howl { + private _timeupdateListeners: TimeUpdateCallback[] = [] + private _interval: ReturnType | null = null + + constructor(options: ConstructorParameters[0]) { + super(options) + this._startTimeUpdate() + } + + private _startTimeUpdate(): void { + this._interval = setInterval(() => { + if (this.playing()) this._emitTimeUpdate(this.seek() as number) + }, 250) + } + + private _emitTimeUpdate(currentTime: number): void { + this._timeupdateListeners.forEach((cb) => cb(currentTime)) + } + + onTimeUpdate(cb: TimeUpdateCallback): void { + this._timeupdateListeners.push(cb) + } + + offTimeUpdate(cb: TimeUpdateCallback): void { + this._timeupdateListeners = this._timeupdateListeners.filter((l) => l !== cb) + } + + play(id?: number): number { + const result = super.play(id as number) + if (!this._interval) this._startTimeUpdate() + return result + } + + pause(id?: number): this { + super.pause(id) + if (this._interval) { + clearInterval(this._interval) + this._interval = null + } + return this + } + + stop(id?: number): this { + super.stop(id) + if (this._interval) { + clearInterval(this._interval) + this._interval = null + } + return this + } +} + +export function createSound(audioUrl?: string): ExtendedHowl | null { + return audioUrl ? new ExtendedHowl({ src: [audioUrl] }) : null +} + +export function stopAllSounds(): void { + Howler._howls?.forEach((sound: Howl) => sound.stop()) +} diff --git a/src/audio/audios.ts b/src/audio/audios.ts new file mode 100644 index 0000000..28cde97 --- /dev/null +++ b/src/audio/audios.ts @@ -0,0 +1,6 @@ +export const AUDIOS = { + click: '/audios/click.mp3', + wheelSpin: '/audios/wheel-spin.mp3', + correct: '/audios/feedback-correct.mpeg', + incorrect: '/audios/feedback-incorrect.mpeg', +} as const diff --git a/src/components/game/QuestionModal.tsx b/src/components/game/QuestionModal.tsx new file mode 100644 index 0000000..1f8a6e4 --- /dev/null +++ b/src/components/game/QuestionModal.tsx @@ -0,0 +1,124 @@ +import { useEffect, useRef, useState } from 'react' +import type { Pregunta, Categoria } from '../../types' + +interface QuestionModalProps { + pregunta: Pregunta + categoria: Categoria + mostrarFeedback: boolean + feedbackCorrecto: boolean + onResponder: (indice: number | null) => void + onCerrar: () => void +} + +const LETRAS = ['A', 'B', 'C', 'D'] +const TIEMPO_LIMITE = 30 + +export default function QuestionModal({ pregunta, categoria, mostrarFeedback, feedbackCorrecto, onResponder, onCerrar }: QuestionModalProps) { + const [tiempo, setTiempo] = useState(TIEMPO_LIMITE) + const intervalRef = useRef | null>(null) + const tiempoAgotadoRef = useRef(false) + + useEffect(() => { + if (mostrarFeedback) { + if (intervalRef.current) clearInterval(intervalRef.current) + return + } + + setTiempo(TIEMPO_LIMITE) + tiempoAgotadoRef.current = false + intervalRef.current = setInterval(() => { + setTiempo((prev) => { + if (prev <= 1) { + clearInterval(intervalRef.current!) + return 0 + } + return prev - 1 + }) + }, 1000) + + return () => { if (intervalRef.current) clearInterval(intervalRef.current) } + }, [pregunta.id, mostrarFeedback]) + + useEffect(() => { + if (tiempo === 0 && !mostrarFeedback && !tiempoAgotadoRef.current) { + tiempoAgotadoRef.current = true + onResponder(null) + } + }, [tiempo, mostrarFeedback]) + + const porcentaje = (tiempo / TIEMPO_LIMITE) * 100 + const colorBarra = porcentaje > 50 ? '#22c55e' : porcentaje > 25 ? '#f97316' : '#ef4444' + + return ( +