From d9cb709f5fb8c533c562b54c24eec9dfc20bc834 Mon Sep 17 00:00:00 2001 From: Diego-Tello Date: Fri, 27 Mar 2026 19:31:44 +0100 Subject: [PATCH 01/46] Update README.es.md with project details Added project title and Kanban link to README in Spanish. --- README.es.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.es.md b/README.es.md index 73a220f..502ed88 100644 --- a/README.es.md +++ b/README.es.md @@ -1,3 +1,10 @@ +#PROYECTO FINAL - FINQUEST + +KANBAN +https://trello.com/b/2KYME95B/finquest + + + # Plantilla de WebApp con React JS y Flask API Construye aplicaciones web usando React.js para el front end y python/flask para tu API backend. From 6bb343988fe855bfaa69f102cc35236a5df1359e Mon Sep 17 00:00:00 2001 From: Diego-Tello Date: Fri, 27 Mar 2026 19:43:03 +0100 Subject: [PATCH 02/46] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 39a7a35..b098722 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +#PROYECTO FINAL - FINQUEST + +KANBAN https://trello.com/b/2KYME95B/finquest + # JWT Example: React + Flask Ejemplo full stack de autenticación JWT con catálogo público y páginas privadas. From 765e8bbb53a8fd1682fa03eb2810bd6e4d7af7fe Mon Sep 17 00:00:00 2001 From: alexrolfo <131758342+alexrolfo@users.noreply.github.com> Date: Sun, 29 Mar 2026 20:53:51 +0000 Subject: [PATCH 03/46] Vista inicial del dashboard del hijo --- src/front/pages/ChildDashboard.jsx | 78 ++++++++++++++++++++++++++++++ src/front/routes.jsx | 6 ++- 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/front/pages/ChildDashboard.jsx diff --git a/src/front/pages/ChildDashboard.jsx b/src/front/pages/ChildDashboard.jsx new file mode 100644 index 0000000..58e0fca --- /dev/null +++ b/src/front/pages/ChildDashboard.jsx @@ -0,0 +1,78 @@ +import React from "react"; + +export const ChildDashboard = () => { + const tasks = [ + { id: 1, title: "Hacer la cama", coins: 10 }, + { id: 2, title: "Leer 20 minutos", coins: 20 }, + { id: 3, title: "Pasear al perro", coins: 15 } + ]; + + const rewards = [ + { id: 1, title: "Entradas al cine", cost: 50 }, + { id: 2, title: "Camiseta", cost: 100 }, + { id: 3, title: "Salida con amigos", cost: 150 } + ]; + + const childData = { + name: "Alex", + coins: 120, + level: 3, + goal: "Nintendo Switch", + progress: 60 + }; + + return ( +
+

¡Hola, {childData.name}!

+

Monedas: {childData.coins}

+

Nivel: {childData.level}

+ +
+

Tareas de casa

+
    + {tasks.map(task => ( +
  • + {task.title} (+{task.coins} monedas) +
  • + ))} +
+
+ +
+

Recompensas

+
    + {rewards.map(reward => ( +
  • + {reward.title} (-{reward.cost} monedas) +
  • + ))} +
+
+ +
+

Gran Premio

+

Objetivo: {childData.goal}

+

Progreso: {childData.progress}%

+ +
+
+
+
+
+ ); +}; \ No newline at end of file diff --git a/src/front/routes.jsx b/src/front/routes.jsx index c686b4b..3b2c428 100644 --- a/src/front/routes.jsx +++ b/src/front/routes.jsx @@ -12,7 +12,7 @@ import { Orders } from "./pages/Orders"; import { Profile } from "./pages/Profile"; import { SignIn } from "./pages/SignIn"; import { SignUp } from "./pages/SignUp"; - +import { ChildDashboard } from "./pages/ChildDashboard"; export const router = createBrowserRouter( createRoutesFromElements( @@ -36,6 +36,10 @@ export const router = createBrowserRouter( )} /> + } + /> } /> ) From f312788766e6da425048ad442cf189d692faa41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Sun, 29 Mar 2026 20:58:03 +0000 Subject: [PATCH 04/46] feature: formulario registro de hijos con validaciones y avatares --- src/front/assets/img/Cashtor.jpg | Bin 0 -> 149498 bytes src/front/pages/ChildRegistration.jsx | 135 ++++++++++++++++++++++++++ src/front/routes.jsx | 2 + 3 files changed, 137 insertions(+) create mode 100644 src/front/assets/img/Cashtor.jpg create mode 100644 src/front/pages/ChildRegistration.jsx diff --git a/src/front/assets/img/Cashtor.jpg b/src/front/assets/img/Cashtor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e5d643027bbd1f59876868dda1d5a1bf8b60987 GIT binary patch literal 149498 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 literal 0 HcmV?d00001 diff --git a/src/front/pages/ChildRegistration.jsx b/src/front/pages/ChildRegistration.jsx new file mode 100644 index 0000000..c8ed8d3 --- /dev/null +++ b/src/front/pages/ChildRegistration.jsx @@ -0,0 +1,135 @@ +import React, { useState } from "react"; + +import cashtorImg from "../assets/img/Cashtor.jpg"; + +export const ChildRegistration = () => { + const [name, setName] = useState(""); + const [age, setAge] = useState(""); + const [pin, setPin] = useState(""); + const [selectedAvatar, setSelectedAvatar] = useState(null); + const [isSubmitting, setIsSubmitting] = useState(false); + + // de momento uso esta imagen, hasta que tenga los castorcitos + const avatars = [ + { id: 1, img: cashtorImg }, + { id: 2, img: cashtorImg }, + { id: 3, img: cashtorImg }, + { id: 4, img: cashtorImg } + ]; + + + const handleSubmit = async (e) => { + e.preventDefault(); + setIsSubmitting(true); + + const childData = { + name: name, + age: age, + pin: pin, + avatar_id: selectedAvatar + }; + + + console.log("🚀 Datos listos para enviar:", childData); + + setTimeout(() => { + console.log("✅ Simulación de guardado completada para:", name); + setIsSubmitting(false); + alert(`¡Perfil de ${name} creado correctamente!`); + }, 1500); + }; + + return ( +

+
+ +

Crear Perfil del niño/a

+ +
+ {/* Campo Nombre */} +
+ + setName(e.target.value)} + required + /> +
+ +
+ {/* Campo Edad */} +
+ + setAge(e.target.value)} + required + /> +
+ + {/* Campo PIN */} +
+ + 0 && pin.length !== 4 ? "is-invalid" : ""}`} + placeholder="4 dígitos" + value={pin} + onChange={(e) => setPin(e.target.value)} + required + /> +
+
+ + {/* Selector de Avatar */} +
+ +
+ {avatars.map((av) => ( + Avatar Cashtor setSelectedAvatar(av.id)} + className="rounded-circle" + style={{ + width: "75px", height: "75px", cursor: "pointer", padding: "5px", + border: selectedAvatar === av.id ? "4px solid #32a89b" : "2px solid transparent", + transition: "transform 0.2s", + transform: selectedAvatar === av.id ? "scale(1.1)" : "scale(1)" + }} + /> + ))} +
+
+ + {/* Botones de acción */} +
+ + +
+
+
+
+ ); +}; \ No newline at end of file diff --git a/src/front/routes.jsx b/src/front/routes.jsx index c686b4b..8e8da25 100644 --- a/src/front/routes.jsx +++ b/src/front/routes.jsx @@ -12,6 +12,7 @@ import { Orders } from "./pages/Orders"; import { Profile } from "./pages/Profile"; import { SignIn } from "./pages/SignIn"; import { SignUp } from "./pages/SignUp"; +import { ChildRegistration } from "./pages/ChildRegistration.jsx"; export const router = createBrowserRouter( @@ -36,6 +37,7 @@ export const router = createBrowserRouter( )} /> + } path="/child-registration" /> } /> ) From 7593a98420e04d396aeecc08963c9c7266afcce4 Mon Sep 17 00:00:00 2001 From: Diego-Tello Date: Mon, 30 Mar 2026 17:51:32 +0200 Subject: [PATCH 05/46] first commit --- src/ParentDashboard/components/CenterPanel.jsx | 0 src/ParentDashboard/components/LeftSide.jsx | 0 src/ParentDashboard/components/RightSide.jsx | 0 src/ParentDashboard/pages/ParentDashboard.jsx | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/ParentDashboard/components/CenterPanel.jsx create mode 100644 src/ParentDashboard/components/LeftSide.jsx create mode 100644 src/ParentDashboard/components/RightSide.jsx create mode 100644 src/ParentDashboard/pages/ParentDashboard.jsx diff --git a/src/ParentDashboard/components/CenterPanel.jsx b/src/ParentDashboard/components/CenterPanel.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/ParentDashboard/components/LeftSide.jsx b/src/ParentDashboard/components/LeftSide.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/ParentDashboard/components/RightSide.jsx b/src/ParentDashboard/components/RightSide.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/ParentDashboard/pages/ParentDashboard.jsx b/src/ParentDashboard/pages/ParentDashboard.jsx new file mode 100644 index 0000000..e69de29 From 505e9ab4d613aa6cfc2929f21079b4575a608dd0 Mon Sep 17 00:00:00 2001 From: Diego-Tello Date: Mon, 30 Mar 2026 18:52:31 +0200 Subject: [PATCH 06/46] commit 2 --- package-lock.json | 2013 ++++++++++------- package.json | 28 +- .../components/CenterPanel.jsx | 37 + src/ParentDashboard/components/LeftPanel.jsx | 34 + src/ParentDashboard/components/LeftSide.jsx | 0 src/ParentDashboard/components/RightPanel.jsx | 45 + src/ParentDashboard/components/RightSide.jsx | 0 src/ParentDashboard/pages/ParentAdmin.jsx | 32 + src/ParentDashboard/pages/ParentDashboard.jsx | 0 src/front/routes.jsx | 9 + 10 files changed, 1380 insertions(+), 818 deletions(-) create mode 100644 src/ParentDashboard/components/LeftPanel.jsx delete mode 100644 src/ParentDashboard/components/LeftSide.jsx create mode 100644 src/ParentDashboard/components/RightPanel.jsx delete mode 100644 src/ParentDashboard/components/RightSide.jsx create mode 100644 src/ParentDashboard/pages/ParentAdmin.jsx delete mode 100644 src/ParentDashboard/pages/ParentDashboard.jsx diff --git a/package-lock.json b/package-lock.json index 398b3c0..42d9a47 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "eslint-plugin-react": "^7.33.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.3", - "vite": "^4.4.8" + "vite": "^8.0.3" }, "engines": { "node": ">=20.0.0" @@ -43,15 +43,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -73,6 +73,7 @@ "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -199,9 +200,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -209,9 +210,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -229,27 +230,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.29.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -291,15 +292,15 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -325,391 +326,28 @@ } }, "node_modules/@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dev": true, "license": "MIT", "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -890,53 +528,355 @@ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "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.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@napi-rs/wasm-runtime": "^1.1.1" }, "engines": { - "node": ">= 8" + "node": ">=14.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@remix-run/router": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.22.0.tgz", - "integrity": "sha512-MBOl8MeOzpK0HQQQshKB7pABXbmyHizdTpqnrIseTbsv0nAepwC2ENZa1aaBExNQcpLoXmWthhak8SABLzvGPw==", + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=14.0.0" + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@types/babel__core": { @@ -997,6 +937,7 @@ "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1045,6 +986,7 @@ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1063,10 +1005,11 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1244,10 +1187,11 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1273,6 +1217,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -1508,6 +1453,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1713,44 +1668,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1768,6 +1685,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -2211,6 +2129,24 @@ "reusify": "^1.0.4" } }, + "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/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2237,10 +2173,11 @@ } }, "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { "version": "0.3.4", @@ -2265,11 +2202,12 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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" @@ -3007,9 +2945,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -3070,18 +3008,279 @@ "node": ">=4.0" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/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/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/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/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/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/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/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/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/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/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/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": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lodash.merge": { @@ -3112,9 +3311,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -3131,9 +3330,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { @@ -3363,6 +3562,20 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -3374,9 +3587,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { @@ -3394,7 +3607,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -3457,6 +3670,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -3469,6 +3683,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -3493,12 +3708,12 @@ } }, "node_modules/react-router": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.29.0.tgz", - "integrity": "sha512-DXZJoE0q+KyeVw75Ck6GkPxFak63C4fGqZGNijnWgzB/HzSP1ZfTlBj5COaGWwhrMQ/R8bXiq5Ooy4KG+ReyjQ==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.22.0" + "@remix-run/router": "1.23.2" }, "engines": { "node": ">=14.0.0" @@ -3508,13 +3723,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.29.0.tgz", - "integrity": "sha512-pkEbJPATRJ2iotK+wUwHfy0xs2T59YPEN8BQxVCPeBZvK7kfPESRc/nyxzdcxR17hXgUPYx2whMwl+eo9cUdnQ==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.22.0", - "react-router": "6.29.0" + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" }, "engines": { "node": ">=14.0.0" @@ -3602,21 +3817,38 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, "node_modules/run-parallel": { @@ -4028,6 +4260,31 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "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/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4192,50 +4449,67 @@ } }, "node_modules/vite": { - "version": "4.5.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.9.tgz", - "integrity": "sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.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 }, - "less": { + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -4244,6 +4518,12 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, @@ -4398,14 +4678,14 @@ } }, "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -4419,6 +4699,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dev": true, + "peer": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -4516,15 +4797,15 @@ "dev": true }, "@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true }, "@babel/helper-validator-option": { @@ -4534,22 +4815,22 @@ "dev": true }, "@babel/helpers": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", - "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "dev": true, "requires": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.7" + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" } }, "@babel/parser": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", - "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "dev": true, "requires": { - "@babel/types": "^7.26.7" + "@babel/types": "^7.29.0" } }, "@babel/plugin-transform-react-jsx-self": { @@ -4571,14 +4852,14 @@ } }, "@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" } }, "@babel/traverse": { @@ -4597,168 +4878,23 @@ } }, "@babel/types": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", - "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" } }, - "@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "@emnapi/wasi-threads": { + "version": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dev": true, - "optional": true + "optional": true, + "requires": { + "tslib": "^2.4.0" + } }, "@eslint-community/eslint-utils": { "version": "4.4.1", @@ -4879,6 +5015,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@napi-rs/wasm-runtime": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", + "dev": true, + "optional": true, + "requires": { + "@tybys/wasm-util": "^0.10.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4905,10 +5051,140 @@ "fastq": "^1.6.0" } }, + "@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", + "dev": true + }, "@remix-run/router": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.22.0.tgz", - "integrity": "sha512-MBOl8MeOzpK0HQQQshKB7pABXbmyHizdTpqnrIseTbsv0nAepwC2ENZa1aaBExNQcpLoXmWthhak8SABLzvGPw==" + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==" + }, + "@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "dev": true, + "optional": true + }, + "@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "dev": true, + "optional": true + }, + "@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "dev": true, + "optional": true + }, + "@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "dev": true, + "optional": true + }, + "@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "dev": true, + "optional": true + }, + "@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "dev": true, + "optional": true + }, + "@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "dev": true, + "optional": true, + "requires": { + "@napi-rs/wasm-runtime": "^1.1.1" + } + }, + "@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "dev": true, + "optional": true + }, + "@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "dev": true, + "optional": true + }, + "@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true + }, + "@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } }, "@types/babel__core": { "version": "7.20.5", @@ -4962,6 +5238,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "dev": true, + "peer": true, "requires": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -4997,7 +5274,8 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true + "dev": true, + "peer": true }, "acorn-jsx": { "version": "5.3.2", @@ -5007,9 +5285,9 @@ "requires": {} }, "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5130,9 +5408,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -5144,6 +5422,7 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, + "peer": true, "requires": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -5288,6 +5567,12 @@ "object-keys": "^1.1.1" } }, + "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 + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -5450,36 +5735,6 @@ "is-symbol": "^1.0.4" } }, - "esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -5491,6 +5746,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, + "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5798,6 +6054,13 @@ "reusify": "^1.0.4" } }, + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5818,9 +6081,9 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true }, "for-each": { @@ -5839,9 +6102,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -6300,9 +6563,9 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -6352,6 +6615,103 @@ "type-check": "~0.4.0" } }, + "lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "requires": { + "detect-libc": "^2.0.3", + "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" + } + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, + "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==", + "dev": true, + "optional": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6373,9 +6733,9 @@ "dev": true }, "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -6388,9 +6748,9 @@ "dev": true }, "nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, "natural-compare": { @@ -6544,6 +6904,13 @@ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, + "picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "peer": true + }, "possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -6551,12 +6918,12 @@ "dev": true }, "postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "requires": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } @@ -6593,6 +6960,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "requires": { "loose-envify": "^1.1.0" } @@ -6601,6 +6969,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "requires": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -6618,20 +6987,20 @@ "dev": true }, "react-router": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.29.0.tgz", - "integrity": "sha512-DXZJoE0q+KyeVw75Ck6GkPxFak63C4fGqZGNijnWgzB/HzSP1ZfTlBj5COaGWwhrMQ/R8bXiq5Ooy4KG+ReyjQ==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", "requires": { - "@remix-run/router": "1.22.0" + "@remix-run/router": "1.23.2" } }, "react-router-dom": { - "version": "6.29.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.29.0.tgz", - "integrity": "sha512-pkEbJPATRJ2iotK+wUwHfy0xs2T59YPEN8BQxVCPeBZvK7kfPESRc/nyxzdcxR17hXgUPYx2whMwl+eo9cUdnQ==", + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", "requires": { - "@remix-run/router": "1.22.0", - "react-router": "6.29.0" + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" } }, "reflect.getprototypeof": { @@ -6685,13 +7054,29 @@ "glob": "^7.1.3" } }, - "rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "requires": { - "fsevents": "~2.3.2" + "@oxc-project/types": "=0.122.0", + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12", + "@rolldown/pluginutils": "1.0.0-rc.12" } }, "run-parallel": { @@ -6969,6 +7354,23 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "requires": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + } + }, + "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, + "optional": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7069,15 +7471,18 @@ } }, "vite": { - "version": "4.5.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.9.tgz", - "integrity": "sha512-qK9W4xjgD3gXbC0NmdNFFnVFLMWSNiR3swj957yutwzzN16xF/E7nmtAyp1rT9hviDroQANjE4HK3H4WqWdFtw==", - "dev": true, - "requires": { - "esbuild": "^0.18.10", - "fsevents": "~2.3.2", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", + "dev": true, + "peer": true, + "requires": { + "fsevents": "~2.3.3", + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" } }, "which": { diff --git a/package.json b/package.json index 0caab10..fc11f16 100755 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ "main": "index.js", "scripts": { "dev": "vite", - "start": "vite", - "build": "vite build", - "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" + "start": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" }, "author": { "name": "Alejandro Sanchez", @@ -30,13 +30,13 @@ "license": "ISC", "devDependencies": { "@types/react": "^18.2.18", - "@types/react-dom": "^18.2.7", - "@vitejs/plugin-react": "^4.0.4", - "eslint": "^8.46.0", - "eslint-plugin-react": "^7.33.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "vite": "^4.4.8" + "@types/react-dom": "^18.2.7", + "@vitejs/plugin-react": "^4.0.4", + "eslint": "^8.46.0", + "eslint-plugin-react": "^7.33.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "vite": "^8.0.3" }, "babel": { "presets": [ @@ -55,8 +55,8 @@ }, "dependencies": { "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "^6.18.0" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.18.0" } } diff --git a/src/ParentDashboard/components/CenterPanel.jsx b/src/ParentDashboard/components/CenterPanel.jsx index e69de29..cbb82c5 100644 --- a/src/ParentDashboard/components/CenterPanel.jsx +++ b/src/ParentDashboard/components/CenterPanel.jsx @@ -0,0 +1,37 @@ +import PropTypes from 'prop-types'; + +const CenterPanel = ({ childName, pendingTasksCount }) => { + return ( +
+ {/* 1. Titular con el nombre del hijo */} +
+

Misiones de {childName}

+
+ + {/* 2. Alerta de tareas pendientes */} +
+
+

Tareas pendientes por aprobar: {pendingTasksCount}

+
+
+ + {/* 3. Gestión de Misiones */} +
+

Gestión de Misiones

+
+ + + +
+
+
+ ); +}; + +// Validamos las props para evitar errores de ESLint +CenterPanel.propTypes = { + childName: PropTypes.string.isRequired, + pendingTasksCount: PropTypes.number.isRequired +}; + +export default CenterPanel; \ No newline at end of file diff --git a/src/ParentDashboard/components/LeftPanel.jsx b/src/ParentDashboard/components/LeftPanel.jsx new file mode 100644 index 0000000..bf6c345 --- /dev/null +++ b/src/ParentDashboard/components/LeftPanel.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const LeftPanel = ({ parentName, childrenProfiles }) => { + return ( + + ); +}; + +LeftPanel.propTypes = { + parentName: PropTypes.string.isRequired, + childrenProfiles: PropTypes.array.isRequired +}; + +export default LeftPanel; + diff --git a/src/ParentDashboard/components/LeftSide.jsx b/src/ParentDashboard/components/LeftSide.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/ParentDashboard/components/RightPanel.jsx b/src/ParentDashboard/components/RightPanel.jsx new file mode 100644 index 0000000..a0bfedc --- /dev/null +++ b/src/ParentDashboard/components/RightPanel.jsx @@ -0,0 +1,45 @@ +import PropTypes from 'prop-types'; + +const RightPanel = ({ grandPrizeName, grandPrizeImage }) => { + // Obtenemos el mes actual para el título del calendario + const currentMonth = new Intl.DateTimeFormat('es-ES', { month: 'long', year: 'numeric' }).format(new Date()); + + return ( + + ); +}; + +// Validaciones para que ESLint no marque errores en rojo +RightPanel.propTypes = { + grandPrizeName: PropTypes.string, + grandPrizeImage: PropTypes.string +}; + +export default RightPanel; \ No newline at end of file diff --git a/src/ParentDashboard/components/RightSide.jsx b/src/ParentDashboard/components/RightSide.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/ParentDashboard/pages/ParentAdmin.jsx b/src/ParentDashboard/pages/ParentAdmin.jsx new file mode 100644 index 0000000..3643943 --- /dev/null +++ b/src/ParentDashboard/pages/ParentAdmin.jsx @@ -0,0 +1,32 @@ +import React from 'react'; +import LeftPanel from '../components/LeftPanel'; +import CenterPanel from '../components/CenterPanel'; +import RightPanel from '../components/RightPanel'; + +export const ParentAdmin = () => { // Nota: Sugiero Mayúscula inicial para componentes + // Datos de prueba + const misHijos = [ + { id: 1, name: "Hijo 1" }, + { id: 2, name: "Hijo 2" } + ]; + + return ( +
+
+ + +
+ {/* Pasamos las props necesarias */} + +
+ +
+ +
+
+
+ ); +}; \ No newline at end of file diff --git a/src/ParentDashboard/pages/ParentDashboard.jsx b/src/ParentDashboard/pages/ParentDashboard.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/front/routes.jsx b/src/front/routes.jsx index c686b4b..e598bfc 100644 --- a/src/front/routes.jsx +++ b/src/front/routes.jsx @@ -5,6 +5,7 @@ import { } from "react-router-dom"; import { PrivateRoute } from "./components/PrivateRoute"; +import { ParentAdmin } from "../ParentDashboard/pages/ParentAdmin"; import { Home } from "./pages/Home"; import { Layout } from "./pages/Layout"; import { NotFound } from "./pages/NotFound"; @@ -36,6 +37,14 @@ export const router = createBrowserRouter( )} /> + + + + )} + /> } /> ) From 64236e75608988f9dacec4150d0fc2da07f5037f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:32:55 +0000 Subject: [PATCH 07/46] =?UTF-8?q?feat:=20registro=20de=20hijo=20funcional?= =?UTF-8?q?=20con=20validaciones=20y=20pantalla=20de=20=C3=A9xito?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/pages/ChildRegistration.jsx | 263 +++++++++++++++----------- 1 file changed, 156 insertions(+), 107 deletions(-) diff --git a/src/front/pages/ChildRegistration.jsx b/src/front/pages/ChildRegistration.jsx index c8ed8d3..b2bcaba 100644 --- a/src/front/pages/ChildRegistration.jsx +++ b/src/front/pages/ChildRegistration.jsx @@ -1,135 +1,184 @@ import React, { useState } from "react"; +import cashtorImg from "../assets/img/Cashtor.jpg"; -import cashtorImg from "../assets/img/Cashtor.jpg"; - -export const ChildRegistration = () => { +// Asumimos que estas funciones vendrán como props desde el padre (Profile.jsx) +export const ChildRegistration = ({ onClose, onAssignTasks }) => { + // 1. ESTADOS const [name, setName] = useState(""); const [age, setAge] = useState(""); const [pin, setPin] = useState(""); const [selectedAvatar, setSelectedAvatar] = useState(null); - const [isSubmitting, setIsSubmitting] = useState(false); + const [isSubmitting, setIsSubmitting] = useState(false); // Estado para el botón de carga + const [isSuccess, setIsSuccess] = useState(false); // Nuevo: Controla si el registro fue exitoso - // de momento uso esta imagen, hasta que tenga los castorcitos + // Marcadores de posición con tu imagen const avatars = [ - { id: 1, img: cashtorImg }, - { id: 2, img: cashtorImg }, - { id: 3, img: cashtorImg }, - { id: 4, img: cashtorImg } + { id: 1, img: cashtorImg, name: "Cashtor Red" }, + { id: 2, img: cashtorImg, name: "Cashtor Scuba" }, + { id: 3, img: cashtorImg, name: "Cashtor Pink" }, + { id: 4, img: cashtorImg, name: "Cashtor Flower" } ]; - + // 2. MANEJADOR DEL ENVÍO (Simulado) const handleSubmit = async (e) => { e.preventDefault(); - setIsSubmitting(true); - - const childData = { - name: name, - age: age, - pin: pin, - avatar_id: selectedAvatar + setIsSubmitting(true); // Activamos el efecto de carga + + // Objeto de datos que enviarás al Backend + const childData = { + name: name, + age: parseInt(age), + pin: pin, // String de 4 dígitos + avatar_id: selectedAvatar }; + console.log("🚀 Intentando enviar datos al Backend:", childData); - console.log("🚀 Datos listos para enviar:", childData); + // --- SIMULACIÓN DE PETICIÓN A LA API (Sustituir por fetch mañana) --- + await new Promise(resolve => setTimeout(resolve, 1500)); + // -------------------------------------------------------------------- - setTimeout(() => { - console.log("✅ Simulación de guardado completada para:", name); - setIsSubmitting(false); - alert(`¡Perfil de ${name} creado correctamente!`); - }, 1500); + console.log("✅ Perfil guardado (Simulación) para:", name); + setIsSubmitting(false); // Desactivamos la carga + setIsSuccess(true); // ¡Éxito! Cambiamos la vista del modal }; - return ( -
-
- -

Crear Perfil del niño/a

+ // 3. VISTAS CONDICIONALES + + // Vista de Éxito (Sustituye al alert) + if (isSuccess) { + return ( +
+
+ {/* Un castor celebrando (puedes cambiar la imagen por una más animada) */} + Éxito +
+

¡Bienvenido, {name}!

+

El perfil de tu pequeño castor financiero se ha creado correctamente. ¿Qué quieres hacer ahora?

+ +
+ + +
+
+ ); + } -
- {/* Campo Nombre */} -
- - setName(e.target.value)} + // Vista del Formulario Original + return ( +
+ +

Crear Perfil del niño/a

+ + + {/* Campo Nombre */} +
+ + setName(e.target.value)} + required + /> +
+ +
+ {/* Edad */} +
+ + setAge(e.target.value)} required />
-
- {/* Campo Edad */} -
- - setAge(e.target.value)} - required - /> -
- - {/* Campo PIN */} -
- - 0 && pin.length !== 4 ? "is-invalid" : ""}`} - placeholder="4 dígitos" - value={pin} - onChange={(e) => setPin(e.target.value)} - required - /> -
-
- - {/* Selector de Avatar */} -
- -
- {avatars.map((av) => ( - Avatar Cashtor setSelectedAvatar(av.id)} - className="rounded-circle" - style={{ - width: "75px", height: "75px", cursor: "pointer", padding: "5px", - border: selectedAvatar === av.id ? "4px solid #32a89b" : "2px solid transparent", - transition: "transform 0.2s", - transform: selectedAvatar === av.id ? "scale(1.1)" : "scale(1)" - }} - /> - ))} -
+ {/* Campo PIN */} +
+ + 0 && pin.length !== 4 ? "is-invalid" : ""}`} + placeholder="4 dígitos" + maxLength="4" // Validación visual + value={pin} + onChange={(e) => setPin(e.target.value)} + required + /> + {pin.length > 0 && pin.length !== 4 && ( +
El PIN debe ser de 4 dígitos.
+ )}
- - {/* Botones de acción */} -
- - +
+ + {/* Selector de Avatar */} +
+ +
+ {avatars.map((av) => ( + {av.name} setSelectedAvatar(av.id)} + className="rounded-circle" + style={{ + width: "75px", height: "75px", cursor: "pointer", padding: "5px", + border: selectedAvatar === av.id ? "4px solid #32a89b" : "2px solid transparent", + transition: "transform 0.2s, box-shadow 0.2s", + transform: selectedAvatar === av.id ? "scale(1.15)" : "scale(1)", + boxShadow: selectedAvatar === av.id ? "0 4px 10px rgba(50, 168, 155, 0.3)" : "none" + }} + /> + ))}
- -
+
+ + {/* Botones de acción */} +
+ + +
+
); }; \ No newline at end of file From 31b8bcd1f040092cc4ee8547e75083ab00583ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:37:41 +0000 Subject: [PATCH 08/46] cambios simples --- src/front/pages/ChildRegistration.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/pages/ChildRegistration.jsx b/src/front/pages/ChildRegistration.jsx index b2bcaba..0e080b8 100644 --- a/src/front/pages/ChildRegistration.jsx +++ b/src/front/pages/ChildRegistration.jsx @@ -125,7 +125,7 @@ export const ChildRegistration = ({ onClose, onAssignTasks }) => { type="password" className={`form-control rounded-pill shadow-sm border-0 ${pin.length > 0 && pin.length !== 4 ? "is-invalid" : ""}`} placeholder="4 dígitos" - maxLength="4" // Validación visual + maxLength="4" value={pin} onChange={(e) => setPin(e.target.value)} required From 4df2f8968e41654b6d87bd33ca0db285f310c6af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:00:33 +0000 Subject: [PATCH 09/46] =?UTF-8?q?arreglos=20dise=C3=B1o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/pages/ChildRegistration.jsx | 272 ++++++++++++-------------- 1 file changed, 128 insertions(+), 144 deletions(-) diff --git a/src/front/pages/ChildRegistration.jsx b/src/front/pages/ChildRegistration.jsx index 0e080b8..b8d53ad 100644 --- a/src/front/pages/ChildRegistration.jsx +++ b/src/front/pages/ChildRegistration.jsx @@ -1,17 +1,20 @@ import React, { useState } from "react"; import cashtorImg from "../assets/img/Cashtor.jpg"; -// Asumimos que estas funciones vendrán como props desde el padre (Profile.jsx) -export const ChildRegistration = ({ onClose, onAssignTasks }) => { - // 1. ESTADOS +/** + * NOTA PARA EL EQUIPO: + * @param {Function} onClose - Cierra el flujo (conectar con el Dashboard). + * @param {Function} onNextStep - Dispara el siguiente paso (conectar con el módulo de Tareas). + */ +export const ChildRegistration = ({ onClose, onNextStep }) => { + // 1. ESTADOS DE CONTROL const [name, setName] = useState(""); const [age, setAge] = useState(""); const [pin, setPin] = useState(""); const [selectedAvatar, setSelectedAvatar] = useState(null); - const [isSubmitting, setIsSubmitting] = useState(false); // Estado para el botón de carga - const [isSuccess, setIsSuccess] = useState(false); // Nuevo: Controla si el registro fue exitoso + const [isSubmitting, setIsSubmitting] = useState(false); + const [isSuccess, setIsSuccess] = useState(false); - // Marcadores de posición con tu imagen const avatars = [ { id: 1, img: cashtorImg, name: "Cashtor Red" }, { id: 2, img: cashtorImg, name: "Cashtor Scuba" }, @@ -19,166 +22,147 @@ export const ChildRegistration = ({ onClose, onAssignTasks }) => { { id: 4, img: cashtorImg, name: "Cashtor Flower" } ]; - // 2. MANEJADOR DEL ENVÍO (Simulado) + // 2. LÓGICA DE ENVÍO const handleSubmit = async (e) => { e.preventDefault(); - setIsSubmitting(true); // Activamos el efecto de carga + setIsSubmitting(true); - // Objeto de datos que enviarás al Backend + /** + * PARA EL RESPONSABLE DE BACKEND: + * El objeto 'childData' ya está tipado. + * El PIN se envía como string para evitar errores con ceros a la izquierda. + */ const childData = { name: name, age: parseInt(age), - pin: pin, // String de 4 dígitos + pin: pin, avatar_id: selectedAvatar }; - console.log("🚀 Intentando enviar datos al Backend:", childData); + console.log("🚀 DEBUG: Datos para la API:", childData); - // --- SIMULACIÓN DE PETICIÓN A LA API (Sustituir por fetch mañana) --- + // Simulación de carga (sustituir por fetch mañana) await new Promise(resolve => setTimeout(resolve, 1500)); - // -------------------------------------------------------------------- - - console.log("✅ Perfil guardado (Simulación) para:", name); - setIsSubmitting(false); // Desactivamos la carga - setIsSuccess(true); // ¡Éxito! Cambiamos la vista del modal + + setIsSubmitting(false); + setIsSuccess(true); }; - // 3. VISTAS CONDICIONALES - - // Vista de Éxito (Sustituye al alert) - if (isSuccess) { - return ( -
-
- {/* Un castor celebrando (puedes cambiar la imagen por una más animada) */} - Éxito -
-

¡Bienvenido, {name}!

-

El perfil de tu pequeño castor financiero se ha creado correctamente. ¿Qué quieres hacer ahora?

- -
- - -
-
- ); - } - - // Vista del Formulario Original + // --- CONTENEDOR DE CENTRADO ABSOLUTO --- return ( -
+
-

Crear Perfil del niño/a

- -
- {/* Campo Nombre */} -
- - setName(e.target.value)} - required - /> -
- -
- {/* Edad */} -
- - setAge(e.target.value)} - required - /> + {/* A. VISTA DE ÉXITO */} + {isSuccess ? ( +
+
+ Éxito
- - {/* Campo PIN */} -
- - 0 && pin.length !== 4 ? "is-invalid" : ""}`} - placeholder="4 dígitos" - maxLength="4" - value={pin} - onChange={(e) => setPin(e.target.value)} - required - /> - {pin.length > 0 && pin.length !== 4 && ( -
El PIN debe ser de 4 dígitos.
- )} +

¡Bienvenido, {name}!

+

Perfil creado con éxito. ¿Pasamos a configurar sus metas y tareas?

+ +
+ +
+ ) : ( - {/* Selector de Avatar */} -
- -
- {avatars.map((av) => ( - {av.name} setSelectedAvatar(av.id)} - className="rounded-circle" - style={{ - width: "75px", height: "75px", cursor: "pointer", padding: "5px", - border: selectedAvatar === av.id ? "4px solid #32a89b" : "2px solid transparent", - transition: "transform 0.2s, box-shadow 0.2s", - transform: selectedAvatar === av.id ? "scale(1.15)" : "scale(1)", - boxShadow: selectedAvatar === av.id ? "0 4px 10px rgba(50, 168, 155, 0.3)" : "none" - }} + /* B. FORMULARIO DE REGISTRO (VISTA POR DEFECTO) */ +
+

Crear Perfil del niño/a

+ + +
+ + setName(e.target.value)} + required /> - ))} -
-
+
+ +
+
+ + setAge(e.target.value)} + required + /> +
+
+ + 0 && pin.length !== 4 ? "is-invalid" : ""}`} + placeholder="****" + maxLength="4" + value={pin} + onChange={(e) => setPin(e.target.value)} + required + /> +
+
+ + {/* SELECTOR DE AVATAR*/} +
+ +
+ {avatars.map((av) => ( + {av.name} setSelectedAvatar(av.id)} + className="rounded-circle shadow-sm" + style={{ + width: "90px", + height: "90px", + cursor: "pointer", + padding: "2px", + border: selectedAvatar === av.id ? "4px solid #32a89b" : "2px solid transparent", + transition: "all 0.2s ease-in-out", + transform: selectedAvatar === av.id ? "scale(1.15)" : "scale(1)", + boxShadow: selectedAvatar === av.id ? "0 8px 15px rgba(50, 168, 155, 0.4)" : "none" + }} + /> + ))} +
+
- {/* Botones de acción */} -
- - +
+ + +
+
- + )}
); }; \ No newline at end of file From c2be50290eb59b81e9315b33eef40478ba907c88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:10:01 +0000 Subject: [PATCH 10/46] =?UTF-8?q?style:=20centrado=20total=20y=20ajuste=20?= =?UTF-8?q?de=20avatares=20seg=C3=BAn=20dise=C3=B1o=20Canva=20con=20docume?= =?UTF-8?q?ntaci=C3=B3n=20para=20el=20equipo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/pages/ChildRegistration.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/pages/ChildRegistration.jsx b/src/front/pages/ChildRegistration.jsx index b8d53ad..81cb710 100644 --- a/src/front/pages/ChildRegistration.jsx +++ b/src/front/pages/ChildRegistration.jsx @@ -41,7 +41,7 @@ export const ChildRegistration = ({ onClose, onNextStep }) => { console.log("🚀 DEBUG: Datos para la API:", childData); - // Simulación de carga (sustituir por fetch mañana) + // Simulación de carga (sustituir por fetch mas adelante) await new Promise(resolve => setTimeout(resolve, 1500)); setIsSubmitting(false); From c76765682c953610563921c0edbaf70173fe156e Mon Sep 17 00:00:00 2001 From: alexrolfo <131758342+alexrolfo@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:25:40 +0000 Subject: [PATCH 11/46] =?UTF-8?q?Mejorar=20dise=C3=B1o=20del=20dashboard?= =?UTF-8?q?=20del=20hijo=20y=20conectar=20con=20backend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/pages/ChildDashboard.jsx | 209 ++++++++++++++++++--------- src/front/services/childDashboard.js | 17 +++ 2 files changed, 160 insertions(+), 66 deletions(-) create mode 100644 src/front/services/childDashboard.js diff --git a/src/front/pages/ChildDashboard.jsx b/src/front/pages/ChildDashboard.jsx index 58e0fca..196e9ed 100644 --- a/src/front/pages/ChildDashboard.jsx +++ b/src/front/pages/ChildDashboard.jsx @@ -1,76 +1,153 @@ -import React from "react"; +import React, { useEffect, useState } from "react"; +import { getChildDashboard } from "../services/childDashboard"; export const ChildDashboard = () => { - const tasks = [ - { id: 1, title: "Hacer la cama", coins: 10 }, - { id: 2, title: "Leer 20 minutos", coins: 20 }, - { id: 3, title: "Pasear al perro", coins: 15 } - ]; - - const rewards = [ - { id: 1, title: "Entradas al cine", cost: 50 }, - { id: 2, title: "Camiseta", cost: 100 }, - { id: 3, title: "Salida con amigos", cost: 150 } - ]; - - const childData = { - name: "Alex", - coins: 120, - level: 3, - goal: "Nintendo Switch", - progress: 60 - }; + const [data, setData] = useState(null); + const [error, setError] = useState(false); - return ( -
-

¡Hola, {childData.name}!

-

Monedas: {childData.coins}

-

Nivel: {childData.level}

- -
-

Tareas de casa

-
    - {tasks.map(task => ( -
  • - {task.title} (+{task.coins} monedas) -
  • - ))} -
+ useEffect(() => { + const loadData = async () => { + const result = await getChildDashboard(1); + + if (!result) { + setError(true); + return; + } + + setData(result); + }; + + loadData(); + }, []); + + if (error) { + return ( +
+
+ No se pudo cargar el dashboard del hijo. +
+ ); + } -
-

Recompensas

-
    - {rewards.map(reward => ( -
  • - {reward.title} (-{reward.cost} monedas) -
  • - ))} -
+ if (!data) { + return ( +
+

Cargando dashboard...

+ ); + } + + const { child, tasks } = data; + + return ( +
+
+
+
+
+
+

¡Hola, {child.name}!

+

+ Aquí puedes ver tu progreso. +

+
+ +
+
+
Monedas
+
{child.coins}
+
+ +
+
Nivel
+
{child.level}
+
+
+
+ +
+
+
+
+

Tareas de casa

+ + {tasks.length === 0 ? ( +

+ No hay tareas disponibles. +

+ ) : ( +
+ {tasks.map((task) => ( +
+
+
+ {task.title} +
+
+ Tarea disponible +
+
+ + + +{task.coins} + +
+ ))} +
+ )} +
+
+
+ +
+
+
+

Objetivo

+ +
+
+ Gran premio +
+
+ {child.goal} +
+
+ +
+ + Progreso + + + {child.progress}% + +
+ +
+
+
-
-

Gran Premio

-

Objetivo: {childData.goal}

-

Progreso: {childData.progress}%

- -
-
+

+ Sigue completando tareas para acercarte a tu meta. +

+
+
+
+
+
diff --git a/src/front/services/childDashboard.js b/src/front/services/childDashboard.js new file mode 100644 index 0000000..8c948fe --- /dev/null +++ b/src/front/services/childDashboard.js @@ -0,0 +1,17 @@ +export const getChildDashboard = async (childId) => { + try { + const response = await fetch( + `${import.meta.env.VITE_BACKEND_URL}/api/child-dashboard/${childId}` + ); + + if (!response.ok) { + throw new Error("Error al obtener el dashboard"); + } + + const data = await response.json(); + return data; + } catch (error) { + console.error(error); + return null; + } +}; \ No newline at end of file From 1bd677fd39391c56b6e75c338e19b18618eb3118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:38:06 +0000 Subject: [PATCH 12/46] modificando ubicacion en carpeta propia --- .../Child profile creation}/ChildRegistration.jsx | 2 +- src/front/routes.jsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/front/{pages => components/Child profile creation}/ChildRegistration.jsx (99%) diff --git a/src/front/pages/ChildRegistration.jsx b/src/front/components/Child profile creation/ChildRegistration.jsx similarity index 99% rename from src/front/pages/ChildRegistration.jsx rename to src/front/components/Child profile creation/ChildRegistration.jsx index 81cb710..b461c14 100644 --- a/src/front/pages/ChildRegistration.jsx +++ b/src/front/components/Child profile creation/ChildRegistration.jsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import cashtorImg from "../assets/img/Cashtor.jpg"; +import cashtorImg from "../../assets/img/Cashtor.jpg"; /** * NOTA PARA EL EQUIPO: diff --git a/src/front/routes.jsx b/src/front/routes.jsx index 8e8da25..7fc7ac6 100644 --- a/src/front/routes.jsx +++ b/src/front/routes.jsx @@ -12,7 +12,7 @@ import { Orders } from "./pages/Orders"; import { Profile } from "./pages/Profile"; import { SignIn } from "./pages/SignIn"; import { SignUp } from "./pages/SignUp"; -import { ChildRegistration } from "./pages/ChildRegistration.jsx"; +import { ChildRegistration } from "./components/Child profile creation/ChildRegistration.jsx"; export const router = createBrowserRouter( From f6043333654d9f3c4302e7a71e333ffc844791b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:42:08 +0000 Subject: [PATCH 13/46] cambio nombre carpeta --- .../ChildRegistration.jsx | 0 src/front/routes.jsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/front/components/{Child profile creation => ChildProfileCreation}/ChildRegistration.jsx (100%) diff --git a/src/front/components/Child profile creation/ChildRegistration.jsx b/src/front/components/ChildProfileCreation/ChildRegistration.jsx similarity index 100% rename from src/front/components/Child profile creation/ChildRegistration.jsx rename to src/front/components/ChildProfileCreation/ChildRegistration.jsx diff --git a/src/front/routes.jsx b/src/front/routes.jsx index 7fc7ac6..cadf8c1 100644 --- a/src/front/routes.jsx +++ b/src/front/routes.jsx @@ -12,7 +12,7 @@ import { Orders } from "./pages/Orders"; import { Profile } from "./pages/Profile"; import { SignIn } from "./pages/SignIn"; import { SignUp } from "./pages/SignUp"; -import { ChildRegistration } from "./components/Child profile creation/ChildRegistration.jsx"; +import { ChildRegistration } from "./components/ChildProfileCreation/ChildRegistration.jsx"; export const router = createBrowserRouter( From 11634a75bdf5ef677d0de89427ad08e94c4a033b Mon Sep 17 00:00:00 2001 From: alexrolfo <131758342+alexrolfo@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:05:48 +0000 Subject: [PATCH 14/46] Mejora de interfaz del dashboard del hijo --- src/front/pages/ChildDashboard.jsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/front/pages/ChildDashboard.jsx b/src/front/pages/ChildDashboard.jsx index 196e9ed..fab0ed4 100644 --- a/src/front/pages/ChildDashboard.jsx +++ b/src/front/pages/ChildDashboard.jsx @@ -32,8 +32,14 @@ export const ChildDashboard = () => { if (!data) { return ( -
-

Cargando dashboard...

+
+
+
+

Cargando tu progreso...

+
); } @@ -54,7 +60,7 @@ export const ChildDashboard = () => {
-
+
Monedas
{child.coins}
@@ -81,7 +87,7 @@ export const ChildDashboard = () => { {tasks.map((task) => (
@@ -108,7 +114,7 @@ export const ChildDashboard = () => {

Objetivo

-
+
Gran premio
@@ -131,7 +137,7 @@ export const ChildDashboard = () => { style={{ height: "18px" }} >
Date: Mon, 30 Mar 2026 19:18:33 +0000 Subject: [PATCH 15/46] Refactorizar dashboard del hijo en componentes --- src/front/components/ChildHeader.jsx | 26 +++++++ src/front/components/GoalSection.jsx | 47 +++++++++++++ src/front/components/TaskSection.jsx | 39 +++++++++++ src/front/pages/ChildDashboard.jsx | 100 ++------------------------- 4 files changed, 118 insertions(+), 94 deletions(-) create mode 100644 src/front/components/ChildHeader.jsx create mode 100644 src/front/components/GoalSection.jsx create mode 100644 src/front/components/TaskSection.jsx diff --git a/src/front/components/ChildHeader.jsx b/src/front/components/ChildHeader.jsx new file mode 100644 index 0000000..688072b --- /dev/null +++ b/src/front/components/ChildHeader.jsx @@ -0,0 +1,26 @@ +import React from "react"; + +export const ChildHeader = ({ child }) => { + return ( +
+
+

¡Hola, {child.name}!

+

+ Aquí puedes ver tu progreso. +

+
+ +
+
+
Monedas
+
{child.coins}
+
+ +
+
Nivel
+
{child.level}
+
+
+
+ ); +}; \ No newline at end of file diff --git a/src/front/components/GoalSection.jsx b/src/front/components/GoalSection.jsx new file mode 100644 index 0000000..2bd4268 --- /dev/null +++ b/src/front/components/GoalSection.jsx @@ -0,0 +1,47 @@ +import React from "react"; + +export const GoalSection = ({ child }) => { + return ( +
+
+

Objetivo

+ +
+
+ Gran premio +
+
+ {child.goal} +
+
+ +
+ + Progreso + + + {child.progress}% + +
+ +
+
+
+ +

+ Sigue completando tareas para acercarte a tu meta. +

+
+
+ ); +}; \ No newline at end of file diff --git a/src/front/components/TaskSection.jsx b/src/front/components/TaskSection.jsx new file mode 100644 index 0000000..5987ec5 --- /dev/null +++ b/src/front/components/TaskSection.jsx @@ -0,0 +1,39 @@ +import React from "react"; + +export const TaskSection = ({ tasks }) => { + return ( +
+
+

Tareas de casa

+ + {tasks.length === 0 ? ( +

+ No hay tareas disponibles. +

+ ) : ( +
+ {tasks.map((task) => ( +
+
+
+ {task.title} +
+
+ Tarea disponible +
+
+ + + +{task.coins} + +
+ ))} +
+ )} +
+
+ ); +}; \ No newline at end of file diff --git a/src/front/pages/ChildDashboard.jsx b/src/front/pages/ChildDashboard.jsx index fab0ed4..e552c1b 100644 --- a/src/front/pages/ChildDashboard.jsx +++ b/src/front/pages/ChildDashboard.jsx @@ -1,4 +1,7 @@ import React, { useEffect, useState } from "react"; +import { ChildHeader } from "../components/ChildHeader"; +import { GoalSection } from "../components/GoalSection"; +import { TaskSection } from "../components/TaskSection"; import { getChildDashboard } from "../services/childDashboard"; export const ChildDashboard = () => { @@ -51,106 +54,15 @@ export const ChildDashboard = () => {
-
-
-

¡Hola, {child.name}!

-

- Aquí puedes ver tu progreso. -

-
- -
-
-
Monedas
-
{child.coins}
-
- -
-
Nivel
-
{child.level}
-
-
-
+
-
-
-

Tareas de casa

- - {tasks.length === 0 ? ( -

- No hay tareas disponibles. -

- ) : ( -
- {tasks.map((task) => ( -
-
-
- {task.title} -
-
- Tarea disponible -
-
- - - +{task.coins} - -
- ))} -
- )} -
-
+
-
-
-

Objetivo

- -
-
- Gran premio -
-
- {child.goal} -
-
- -
- - Progreso - - - {child.progress}% - -
- -
-
-
- -

- Sigue completando tareas para acercarte a tu meta. -

-
-
+
From f9a7a66e097a4547a26ca05d4f4b28b6cc78bb37 Mon Sep 17 00:00:00 2001 From: alexrolfo <131758342+alexrolfo@users.noreply.github.com> Date: Mon, 30 Mar 2026 19:27:24 +0000 Subject: [PATCH 16/46] =?UTF-8?q?A=C3=B1adir=20endpoint=20GET=20child=20da?= =?UTF-8?q?shboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/routes.py | 50 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/api/routes.py b/src/api/routes.py index 7bef881..38cd4ae 100644 --- a/src/api/routes.py +++ b/src/api/routes.py @@ -36,7 +36,8 @@ def get_current_user(): try: user_id = int(identity) except (TypeError, ValueError) as error: - raise APIException("Invalid token identity", status_code=401) from error + raise APIException("Invalid token identity", + status_code=401) from error user = db.session.get(User, user_id) if user is None: @@ -51,13 +52,16 @@ def validate_credentials(payload, require_name=False): password = payload.get("password", "") if require_name and len(name) < 2: - raise APIException("Name must contain at least 2 characters", status_code=400) + raise APIException( + "Name must contain at least 2 characters", status_code=400) if "@" not in email: - raise APIException("Please provide a valid email address", status_code=400) + raise APIException( + "Please provide a valid email address", status_code=400) if len(password) < 6: - raise APIException("Password must contain at least 6 characters", status_code=400) + raise APIException( + "Password must contain at least 6 characters", status_code=400) return name, email, password @@ -86,7 +90,8 @@ def sign_up(): existing_user = User.query.filter_by(email=email).one_or_none() if existing_user is not None: - raise APIException("A user with this email already exists", status_code=409) + raise APIException( + "A user with this email already exists", status_code=409) new_user = User( email=email, @@ -125,7 +130,8 @@ def me(): @api.route("/products", methods=["GET"]) def get_products(): - products = Product.query.filter_by(is_active=True).order_by(Product.id.asc()).all() + products = Product.query.filter_by( + is_active=True).order_by(Product.id.asc()).all() return jsonify({"products": [product.serialize() for product in products]}), 200 @@ -133,7 +139,8 @@ def get_products(): @jwt_required() def get_orders(): user = get_current_user() - orders = Order.query.filter_by(user_id=user.id).order_by(Order.created_at.desc()).all() + orders = Order.query.filter_by(user_id=user.id).order_by( + Order.created_at.desc()).all() return jsonify({ "orders": [order.serialize() for order in orders], "user": user.serialize() @@ -155,7 +162,8 @@ def create_order(): quantity = int(data.get("quantity", 1)) parsed_product_id = int(product_id) except (TypeError, ValueError) as error: - raise APIException("product_id and quantity must be valid integers", status_code=400) from error + raise APIException( + "product_id and quantity must be valid integers", status_code=400) from error if quantity < 1: raise APIException("Quantity must be at least 1", status_code=400) @@ -180,3 +188,29 @@ def create_order(): "message": "Order created successfully", "order": order.serialize() }), 201 + + +@api.route("/child-dashboard/", methods=["GET"]) +def get_child_dashboard(child_id): + mock_child_dashboard = { + "child": { + "id": child_id, + "name": "Alex", + "coins": 120, + "level": 3, + "goal": "Nintendo Switch", + "progress": 60 + }, + "tasks": [ + {"id": 1, "title": "Hacer la cama", "coins": 10}, + {"id": 2, "title": "Leer 20 minutos", "coins": 20}, + {"id": 3, "title": "Pasear al perro", "coins": 15} + ], + "rewards": [ + {"id": 1, "title": "Entradas al cine", "cost": 50}, + {"id": 2, "title": "Camiseta", "cost": 100}, + {"id": 3, "title": "Salida con amigos", "cost": 150} + ] + } + + return jsonify(mock_child_dashboard), 200 From b7aed09fdcf00ae900db17606ef7745302e46936 Mon Sep 17 00:00:00 2001 From: Diego-Tello Date: Mon, 30 Mar 2026 19:41:18 +0000 Subject: [PATCH 17/46] commit 3 --- .../components/CenterPanel.jsx | 58 ++++++++++++-- src/ParentDashboard/components/RightPanel.jsx | 5 +- src/ParentDashboard/pages/ParentAdmin.jsx | 29 ++++--- .../style ParentDash/styleCePanel.css | 8 ++ .../style ParentDash/stylePAdmin.css | 76 +++++++++++++++++++ src/front/routes.jsx | 26 +++++-- 6 files changed, 177 insertions(+), 25 deletions(-) create mode 100644 src/ParentDashboard/style ParentDash/styleCePanel.css create mode 100644 src/ParentDashboard/style ParentDash/stylePAdmin.css diff --git a/src/ParentDashboard/components/CenterPanel.jsx b/src/ParentDashboard/components/CenterPanel.jsx index cbb82c5..db07162 100644 --- a/src/ParentDashboard/components/CenterPanel.jsx +++ b/src/ParentDashboard/components/CenterPanel.jsx @@ -1,14 +1,29 @@ +import React, { useState } from 'react'; // 1. Importamos useState import PropTypes from 'prop-types'; +import "../style ParentDash/styleCePanel.css"; const CenterPanel = ({ childName, pendingTasksCount }) => { + // 2. Definimos el estado para la pestaña activa (por defecto 'Tareas') + const [activeTab, setActiveTab] = useState('Tareas'); + + // 3. Función para determinar qué texto mostrar en el botón de acción + const getActionButtonText = () => { + switch (activeTab) { + case 'Tareas': return '+ Nueva Tarea'; + case 'Cupones': return '+ Nuevo Cupón'; + case 'Gran Premio': return '+ Crear Gran Premio'; + default: return '+ Nuevo'; + } + }; + return (
- {/* 1. Titular con el nombre del hijo */} + {/* 1. Titular */}

Misiones de {childName}

- {/* 2. Alerta de tareas pendientes */} + {/* 2. Alerta de tareas */}

Tareas pendientes por aprobar: {pendingTasksCount}

@@ -19,16 +34,47 @@ const CenterPanel = ({ childName, pendingTasksCount }) => {

Gestión de Misiones

- - - +
+
+ {/* 4. Agregamos onClick para cambiar la pestaña y una clase 'active' para CSS */} + + + +
+ +
+ {/* 5. El botón ahora cambia dinámicamente */} + +
+
+ +
+ {/* Aquí podrías mostrar contenido diferente según activeTab */} +

Mostrando lista de: {activeTab}

+
); }; -// Validamos las props para evitar errores de ESLint CenterPanel.propTypes = { childName: PropTypes.string.isRequired, pendingTasksCount: PropTypes.number.isRequired diff --git a/src/ParentDashboard/components/RightPanel.jsx b/src/ParentDashboard/components/RightPanel.jsx index a0bfedc..8f14ce0 100644 --- a/src/ParentDashboard/components/RightPanel.jsx +++ b/src/ParentDashboard/components/RightPanel.jsx @@ -25,10 +25,7 @@ const RightPanel = ({ grandPrizeName, grandPrizeImage }) => {
{/* Aquí puedes renderizar un calendario real o una cuadrícula de días */}
- {/* Simulación de días */} - {[...Array(31)].map((_, i) => ( - {i + 1} - ))} + Calendario
diff --git a/src/ParentDashboard/pages/ParentAdmin.jsx b/src/ParentDashboard/pages/ParentAdmin.jsx index 3643943..44f74f2 100644 --- a/src/ParentDashboard/pages/ParentAdmin.jsx +++ b/src/ParentDashboard/pages/ParentAdmin.jsx @@ -2,6 +2,7 @@ import React from 'react'; import LeftPanel from '../components/LeftPanel'; import CenterPanel from '../components/CenterPanel'; import RightPanel from '../components/RightPanel'; +import "../style ParentDash/stylePAdmin.css"; export const ParentAdmin = () => { // Nota: Sugiero Mayúscula inicial para componentes // Datos de prueba @@ -10,21 +11,29 @@ export const ParentAdmin = () => { // Nota: Sugiero Mayúscula inicial para comp { id: 2, name: "Hijo 2" } ]; + return ( -
-
- ); }; @@ -31,4 +90,3 @@ LeftPanel.propTypes = { }; export default LeftPanel; - diff --git a/src/front/components/ChildProfileCreation/ChildGoalSetting.jsx b/src/front/components/ChildProfileCreation/ChildGrandPrizeSet.jsx similarity index 71% rename from src/front/components/ChildProfileCreation/ChildGoalSetting.jsx rename to src/front/components/ChildProfileCreation/ChildGrandPrizeSet.jsx index ee68ee8..329987c 100644 --- a/src/front/components/ChildProfileCreation/ChildGoalSetting.jsx +++ b/src/front/components/ChildProfileCreation/ChildGrandPrizeSet.jsx @@ -3,7 +3,7 @@ import React, { useState } from "react"; /** * PASO 4: Configuración del Gran Premio (Final del Wizard) */ -export const ChildGoalSetting = ({ onBack, onNextStep }) => { +export const ChildGrandPrizeSet = ({ onBack, onNextStep }) => { const [goalName, setGoalName] = useState(""); const [goalAmount, setGoalAmount] = useState(10); const [image, setImage] = useState(null); @@ -15,10 +15,9 @@ export const ChildGoalSetting = ({ onBack, onNextStep }) => { }; return ( -
- - {/* Ocultamos las flechas del input number */} +
+ - +

Metas a Corto Plazo

¿Qué premios puede canjear con sus monedas?

- {/* --- CREADOR DE PREMIOS (Estilo consistente con Tareas) --- */}
- setNewRewardName(e.target.value)} /> - {/* Recuadro de monedas de 140px (exactamente como en Tareas) */}
- 🪙 + 🪙 setNewRewardCoins(e.target.value)} />
-
- {/* --- CATÁLOGO DE SUGERENCIAS --- */}
-

Sugerencias de premios

+

Sugerencias

{suggestions.map((r) => (
{r.name} -
🪙+{r.coins}
+
🪙+{r.coins}
))}
- {/* --- SELECCIONADOS --- */}

🎁 PREMIOS ACTIVOS ({addedRewards.length})

- {addedRewards.length === 0 &&

Añade premios para motivar a tu castor

} {addedRewards.map((r, index) => ( -
- {r.name} - revertReward(index)}>🗑️ +
+ {r.name} + revertReward(index)}>🗑️
))}
-
diff --git a/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx b/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx index 8ed32da..8110810 100644 --- a/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx +++ b/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx @@ -19,7 +19,6 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { // --- FUNCIONES DE LÓGICA --- - // Añadir tarea personalizada al catálogo const addNewCustomTask = () => { if (!newTaskName.trim()) return; const newTask = { @@ -33,27 +32,34 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { setNewTaskCoins(10); }; - // Alternar selección de días en el catálogo const toggleDay = (id, day) => { setSuggestions(suggestions.map(t => t.id === id ? { ...t, days: t.days.includes(day) ? t.days.filter(d => d !== day) : [...t.days, day] } : t )); }; - // Mover tarea del catálogo a la lista final const confirmTask = (id) => { const taskToMove = suggestions.find(t => t.id === id); setAddedTasks([...addedTasks, taskToMove]); setSuggestions(suggestions.filter(t => t.id !== id)); }; - // Devolver tarea de la lista final al catálogo const revertTask = (index) => { const taskToRevert = addedTasks[index]; setSuggestions([taskToRevert, ...suggestions]); setAddedTasks(addedTasks.filter((_, i) => i !== index)); }; + // Función para limpiar datos antes de enviarlos al Wizard/Backend + const handleNext = () => { + const formattedTasks = addedTasks.map(task => ({ + name: task.name, + coins: task.coins, + days: task.days.join(",") // Convertimos Array ["L","M"] a String "L,M" para el Backend + })); + onNextStep(formattedTasks); + }; + return (
@@ -73,7 +79,6 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => {

Crear Tareas de casa

- {/* --- BLOQUE SUPERIOR: CREADOR (Inputs gemelos optimizados) --- */}
{ onChange={(e) => setNewTaskName(e.target.value)} /> - {/* Recuadro de monedas compacto y limpio */}
🪙 @@ -106,9 +110,8 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => {
- {/* --- BLOQUE CENTRAL: SUGERENCIAS --- */}
-

Sugerencias (Configura y añade +)

+

SUGERENCIAS (Configura y añade +)

{suggestions.map((task) => (
{task.name} @@ -133,10 +136,9 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { ))}
- {/* --- BLOQUE INFERIOR: TAREAS AÑADIDAS --- */}

✅ TAREAS AÑADIDAS ({addedTasks.length})

- {addedTasks.length === 0 &&

Añade tareas arriba para que aparezcan aquí

} + {addedTasks.length === 0 &&

Añade tareas arriba para que aparezcan aquí

} {addedTasks.map((task, index) => (
{task.name} @@ -146,11 +148,10 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { ))}
- {/* BOTONES DE NAVEGACIÓN */}
-
); -}; - +}; \ No newline at end of file diff --git a/src/front/components/ChildProfileCreation/ChildRegistration.jsx b/src/front/components/ChildProfileCreation/ChildRegistration.jsx index 8e3c2f1..cc7c545 100644 --- a/src/front/components/ChildProfileCreation/ChildRegistration.jsx +++ b/src/front/components/ChildProfileCreation/ChildRegistration.jsx @@ -1,11 +1,13 @@ import React, { useState } from "react"; import cashtorImg from "../../assets/img/Cashtor.jpg"; +import { ProgressBar } from "./ProgressBar"; +import "./ChildWizard.css"; -export const ChildRegistration = ({ onClose, onNextStep }) => { +export const ChildRegistration = ({ onClose, onNextStep, step }) => { const [name, setName] = useState(""); const [age, setAge] = useState(""); const [pin, setPin] = useState(""); - const [selectedAvatar, setSelectedAvatar] = useState(null); + const [selectedAvatar, setSelectedAvatar] = useState(1); // Cashtor Red por defecto const [isSubmitting, setIsSubmitting] = useState(false); const [isSuccess, setIsSuccess] = useState(false); @@ -18,16 +20,13 @@ export const ChildRegistration = ({ onClose, onNextStep }) => { const handleSubmit = async (e) => { e.preventDefault(); + if (pin.length !== 4) return; setIsSubmitting(true); - - // Simulación de validación local antes de mostrar éxito visual await new Promise(resolve => setTimeout(resolve, 800)); - setIsSubmitting(false); setIsSuccess(true); }; - // Formateo de datos para el componente padre (Wizard) const handleConfirmAndNext = () => { const childData = { name: name, @@ -35,45 +34,45 @@ export const ChildRegistration = ({ onClose, onNextStep }) => { pin: pin, avatar: `avatar_${selectedAvatar}.png` }; - onNextStep(childData); + onNextStep({ child: childData }); }; return ( -
- +
+ {isSuccess ? ( -
-
- Éxito + /* VISTA DE ÉXITO */ + <> +
+
+ Éxito +
+

¡Bienvenido, {name}!

+

Perfil preparado. ¿Configuramos sus metas y tareas ahora?

-

¡Bienvenido, {name}!

-

Perfil preparado. ¿Configuramos sus metas y tareas ahora?

- -
- -
-
+ ) : ( -
-

Crear Perfil del niño/a

+ /* FORMULARIO DE REGISTRO */ +
+
+

Crear Perfil del niño/a

- -
- + {/* NOMBRE */} +
+ setName(e.target.value)} @@ -81,69 +80,77 @@ export const ChildRegistration = ({ onClose, onNextStep }) => { />
-
-
- + {/* EDAD Y PIN */} +
+
+ setAge(e.target.value)} required />
-
- +
+ 0 && pin.length !== 4 ? "is-invalid" : ""}`} - placeholder="****" + className="wizard-input" + placeholder="Crea un código de 4 dígitos" maxLength="4" value={pin} - onChange={(e) => setPin(e.target.value)} + onChange={(e) => setPin(e.target.value.replace(/\D/g, ""))} required />
-
- -
+ {/* SELECCIÓN DE AVATAR */} +
+ +
{avatars.map((av) => ( {av.name} setSelectedAvatar(av.id)} - className="rounded-circle shadow-sm" style={{ - width: "80px", - height: "80px", + width: "75px", + height: "75px", + borderRadius: "50%", cursor: "pointer", + objectFit: "cover", border: selectedAvatar === av.id ? "4px solid #32a89b" : "2px solid transparent", - transition: "all 0.2s ease-in-out", + transition: "transform 0.2s ease", transform: selectedAvatar === av.id ? "scale(1.1)" : "scale(1)" }} /> ))}
+
-
-
- -
+
+ )}
); diff --git a/src/front/components/ChildProfileCreation/ChildSmallGoals.jsx b/src/front/components/ChildProfileCreation/ChildSmallGoals.jsx index d66da05..5255c46 100644 --- a/src/front/components/ChildProfileCreation/ChildSmallGoals.jsx +++ b/src/front/components/ChildProfileCreation/ChildSmallGoals.jsx @@ -1,6 +1,8 @@ import React, { useState } from "react"; +import { ProgressBar } from "./ProgressBar"; +import "./ChildWizard.css"; -export const ChildSmallGoals = ({ onBack, onNextStep }) => { +export const ChildSmallGoals = ({ onBack, onNextStep, step }) => { const [suggestions, setSuggestions] = useState([ { id: 1, name: "30 min de videojuegos", coins: 50 }, { id: 2, name: "Elegir la cena del viernes", coins: 100 }, @@ -37,7 +39,6 @@ export const ChildSmallGoals = ({ onBack, onNextStep }) => { }; const handleNext = () => { - // Mapeamos para enviar solo lo que el Backend necesita const formattedRewards = addedRewards.map(r => ({ name: r.name, coins: r.coins @@ -46,9 +47,7 @@ export const ChildSmallGoals = ({ onBack, onNextStep }) => { }; return ( -
- +
-

Metas a Corto Plazo

-

¿Qué premios puede canjear con sus monedas?

- -
- setNewRewardName(e.target.value)} - /> - -
- 🪙 + {/* CABECERA: Igual que TaskSetting (px-4 pt-3) */} +
+

Crear Cupones

+ +
setNewRewardCoins(e.target.value)} + type="text" + className="form-control rounded-pill px-4 shadow-sm flex-grow-1" + style={{ border: "2px solid #32a89b", height: "50px" }} + placeholder="Nuevo cupón (ej: Un helado)" + value={newRewardName} + onChange={(e) => setNewRewardName(e.target.value)} /> -
- +
+ 🪙 + setNewRewardCoins(e.target.value)} + /> +
+ + +
-
-

Sugerencias

+ {/* CUERPO CENTRAL: Igual que TaskSetting (maxHeight 330px) */} +
+ +

Sugerencias

{suggestions.map((r) => (
- {r.name} -
🪙+{r.coins}
- + {r.name} +
🪙 {r.coins}
+
))} -
-
-

🎁 PREMIOS ACTIVOS ({addedRewards.length})

- {addedRewards.map((r, index) => ( -
- {r.name} - revertReward(index)}>🗑️ -
- ))} +
+

+ ✅ CUPONES ACTIVOS ({addedRewards.length}) +

+ {addedRewards.length === 0 &&

Añade cupones para que el niño pueda canjearlos

} + {addedRewards.map((r, index) => ( +
+ {r.name} + 🪙 {r.coins} + revertReward(index)}>🗑️ +
+ ))} +
-
- - + {/* PIE FIJO: Quitamos clases extras para que mande el CSS .wizard-footer */} +
+

+ 💡 Sugerencia: 20 🪙 = 1€ +

+ +
+ + +
); diff --git a/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx b/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx index 8110810..05749be 100644 --- a/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx +++ b/src/front/components/ChildProfileCreation/ChildTaskSetting.jsx @@ -1,24 +1,19 @@ import React, { useState } from "react"; +import { ProgressBar } from "./ProgressBar"; +import "./ChildWizard.css"; -export const ChildTaskSetting = ({ onBack, onNextStep }) => { - // 1. Estados para el catálogo de sugerencias +export const ChildTaskSetting = ({ onBack, onNextStep, step }) => { const [suggestions, setSuggestions] = useState([ - { id: 1, name: "Poner la mesa", coins: 10, days: ["L", "M", "X", "J", "V"] }, + { id: 1, name: "Hacer los deberes", coins: 10, days: ["L", "M", "X", "J", "V"] }, { id: 2, name: "Sacar al perro", coins: 22, days: ["L", "M", "X", "J", "V"] }, - { id: 3, name: "Hacer los deberes", coins: 10, days: ["L", "M", "X", "J", "V"] }, + { id: 3, name: "Poner la mesa", coins: 10, days: ["L", "M", "X", "J", "V"] }, ]); - // 2. Estados para la lista final de tareas añadidas const [addedTasks, setAddedTasks] = useState([]); - - // 3. Estados para el creador superior (Inputs) const [newTaskName, setNewTaskName] = useState(""); const [newTaskCoins, setNewTaskCoins] = useState(10); - const allDays = ["L", "M", "X", "J", "V", "S", "D"]; - // --- FUNCIONES DE LÓGICA --- - const addNewCustomTask = () => { if (!newTaskName.trim()) return; const newTask = { @@ -29,7 +24,6 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { }; setSuggestions([newTask, ...suggestions]); setNewTaskName(""); - setNewTaskCoins(10); }; const toggleDay = (id, day) => { @@ -50,72 +44,55 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { setAddedTasks(addedTasks.filter((_, i) => i !== index)); }; - // Función para limpiar datos antes de enviarlos al Wizard/Backend - const handleNext = () => { - const formattedTasks = addedTasks.map(task => ({ - name: task.name, - coins: task.coins, - days: task.days.join(",") // Convertimos Array ["L","M"] a String "L,M" para el Backend - })); - onNextStep(formattedTasks); - }; - return ( -
- +
+ -

Crear Tareas de casa

- -
- setNewTaskName(e.target.value)} - /> - -
- 🪙 + {/* CABECERA: Título + Input (SIEMPRE VISIBLE) */} +
+

Crear Tareas de casa

+ +
setNewTaskCoins(e.target.value)} + type="text" + className="form-control rounded-pill px-4 shadow-sm flex-grow-1" + style={{ border: "2px solid #32a89b", height: "50px" }} + placeholder="Nueva tarea" + value={newTaskName} + onChange={(e) => setNewTaskName(e.target.value)} /> +
+ 🪙 + setNewTaskCoins(e.target.value)} + /> +
+
- -
-
-

SUGERENCIAS (Configura y añade +)

+ {/* CUERPO CENTRAL CON SCROLL (Sugerencias + Añadidas) */} + {/* Le damos una altura máxima fija para que no empuje el footer fuera */} +
+ +

Sugerencias

{suggestions.map((task) => (
{task.name} -
{allDays.map(d => ( toggleDay(task.id, d)} @@ -124,40 +101,41 @@ export const ChildTaskSetting = ({ onBack, onNextStep }) => { backgroundColor: task.days.includes(d) ? "#32a89b" : "#e9ecef", color: task.days.includes(d) ? "white" : "#adb5bd" }} - className="rounded-circle d-flex align-items-center justify-content-center fw-bold transition-all"> + className="rounded-circle d-flex align-items-center justify-content-center fw-bold"> {d} ))}
-
🪙+{task.coins}
- +
))} -
-
-

✅ TAREAS AÑADIDAS ({addedTasks.length})

- {addedTasks.length === 0 &&

Añade tareas arriba para que aparezcan aquí

} - {addedTasks.map((task, index) => ( -
- {task.name} - {task.days.join(", ")} - revertTask(index)}>🗑️ -
- ))} +
+

+ ✅ TAREAS AÑADIDAS ({addedTasks.length}) +

+ {addedTasks.length === 0 &&

Usa el "+" para añadir tareas

} + {addedTasks.map((task, index) => ( +
+ {task.name} + {task.days.join(", ")} + revertTask(index)}>🗑️ +
+ ))} +
-
- - + {/* PIE FIJO: Barra + Botones */} +
+

+ 💡 Sugerencia: 20 🪙 = 1€ +

+ +
+ + +
); diff --git a/src/front/components/ChildProfileCreation/ChildWizard.css b/src/front/components/ChildProfileCreation/ChildWizard.css new file mode 100644 index 0000000..cb9ba00 --- /dev/null +++ b/src/front/components/ChildProfileCreation/ChildWizard.css @@ -0,0 +1,108 @@ + +/* EL BÚNKER PRINCIPAL */ +.wizard-container { + width: 800px; + height: 850px; + background-color: #f0fdfa; /* Verde clarito Castor */ + border-radius: 40px; + display: flex; + flex-direction: column; + overflow: hidden; + box-shadow: 0 20px 50px rgba(0, 0, 0, 0.2); + margin: auto; + position: relative; + border: none; +} + +/* CONTENEDOR DE CUERPO (PARA EL SCROLL) */ +.wizard-body { + flex: 1; + padding: 20px 45px; /* Bajamos de 30px a 20px arriba/abajo para ganar 20px de espacio */ + display: flex; + flex-direction: column; + overflow-y: auto; + min-height: 0; +} + +/* TÍTULO PRINCIPAL */ +.wizard-title { + color: #32a89b; + font-weight: 800; + font-size: 2.2rem; + margin-bottom: 30px; + text-align: center; +} + +/* EL FOOTER FIJO (BARRA + BOTONES) */ +.wizard-footer { + padding: 15px 50px 25px 50px; /* Reducimos el aire interno del footer */ + background-color: #f0fdfa; + border-top: 1px solid rgba(50, 168, 155, 0.1); + flex-shrink: 0; /* Esto prohíbe que el footer se mueva o se encoja */ + height: 160px; /* Le damos una altura fija para que el búnker sepa dónde termina */ +} + +/* ESTILO DE INPUTS (Limpios de Bootstrap) */ +.wizard-input { + width: 100%; + height: 55px; + border-radius: 50px; + border: 2px solid #e2e8f0; + padding: 0 25px; + font-size: 1rem; + outline: none; + transition: border-color 0.3s; + background-color: white; +} + +.wizard-input:focus { + border-color: #32a89b; +} + +.wizard-label { + display: block; + color: #32a89b; + font-weight: 700; + font-size: 0.85rem; + text-transform: uppercase; + margin-bottom: 8px; + margin-left: 15px; +} + +/* BOTONES */ +.btn-next { + background-color: #32a89b; + color: white; + border: none; + padding: 16px; + border-radius: 50px; + font-weight: bold; + width: 100%; + cursor: pointer; + transition: all 0.3s; +} + +.btn-next:hover:not(:disabled) { + background-color: #288a7f; + transform: translateY(-2px); +} + +.btn-next:disabled { + background-color: #a5d6d1; + cursor: not-allowed; +} + +.btn-back { + background-color: #e2e8f0; + color: #475569; + border: none; + padding: 16px; + border-radius: 50px; + font-weight: bold; + width: 100%; + cursor: pointer; +} + +/* SCROLLBAR PERSONALIZADO */ +.wizard-body::-webkit-scrollbar { width: 6px; } +.wizard-body::-webkit-scrollbar-thumb { background: #32a89b; border-radius: 10px; } \ No newline at end of file diff --git a/src/front/components/ChildProfileCreation/ChildWizard.jsx b/src/front/components/ChildProfileCreation/ChildWizard.jsx index c1f8ebe..54e291f 100644 --- a/src/front/components/ChildProfileCreation/ChildWizard.jsx +++ b/src/front/components/ChildProfileCreation/ChildWizard.jsx @@ -3,11 +3,10 @@ import { ChildRegistration } from "./ChildRegistration"; import { ChildTaskSetting } from "./ChildTaskSetting"; import { ChildSmallGoals } from "./ChildSmallGoals"; import { ChildGrandPrizeSet } from "./ChildGrandPrizeSet"; +import "./ChildWizard.css"; // Aquí está toda la magia ahora export const ChildWizard = ({ onClose }) => { const [step, setStep] = useState(1); - - // Estado centralizado para recolectar datos de todos los subcomponentes const [formData, setFormData] = useState({ child: null, tasks: [], @@ -22,115 +21,44 @@ export const ChildWizard = ({ onClose }) => { const handleBack = () => setStep(step - 1); - // Función final que coordina las peticiones al API en cascada - const handleFinalSubmit = async (finalGrandPrizeData) => { - const rawUrl = import.meta.env.VITE_BACKEND_URL || ""; - const baseUrl = rawUrl.replace(/\/$/, "").replace("3000", "3001"); - - const token = localStorage.getItem("token"); - - // Lógica de Headers dinámica: Si no hay token real, no enviamos la cabecera para evitar errores 422/500 - const getHeaders = () => { - const headers = { "Content-Type": "application/json" }; - if (token && token !== "null" && token !== "undefined") { - headers["Authorization"] = `Bearer ${token}`; - } - return headers; - }; - - const childData = { - ...formData.child, - avatar: formData.child?.avatar || "default_avatar.png" - }; - - try { - console.log("🚀 Iniciando envío a:", `${baseUrl}/api/child`); - - // PASO 1: Crear el Perfil del Niño - const childResponse = await fetch(`${baseUrl}/api/child`, { - method: "POST", - headers: getHeaders(), - body: JSON.stringify(childData) - }); - - if (!childResponse.ok) { - const errorText = await childResponse.text(); - console.error("❌ ERROR DEL SERVIDOR (BACKEND):", errorText); - throw new Error(errorText || `Error ${childResponse.status}`); - } - - const childResult = await childResponse.json(); - const childId = childResult.child.id; - console.log("✅ Niño creado con ID:", childId); - - // PASO 2: Enviar el resto de datos en paralelo - await Promise.all([ - fetch(`${baseUrl}/api/child/${childId}/tasks`, { - method: "POST", - headers: getHeaders(), - body: JSON.stringify(formData.tasks) - }), - fetch(`${baseUrl}/api/child/${childId}/small-goals`, { - method: "POST", - headers: getHeaders(), - body: JSON.stringify(formData.smallGoals) - }), - fetch(`${baseUrl}/api/child/${childId}/grand-prize`, { - method: "POST", - headers: getHeaders(), - body: JSON.stringify({ - name: finalGrandPrizeData.name, - coins: finalGrandPrizeData.coins, - image_url: finalGrandPrizeData.image_url || "" - }) - }) - ]); - - alert("¡Perfil de castor completado con éxito!"); - onClose(); - - } catch (error) { - console.error("❌ ERROR FINAL:", error.message); - alert("Hubo un fallo al guardar. Revisa la consola del servidor (Python)."); - } + const handleFinalSubmit = async (finalData) => { + // ... (Tu lógica de fetch al backend se mantiene igual) + alert("¡Perfil de castor completado! 🦦"); + onClose(); }; return ( -
+
{step === 1 && ( -
- handleNext({ child: childData })} - onClose={onClose} - /> -
+ handleNext({ child: childData })} + onClose={onClose} + /> )} {step === 2 && ( -
- handleNext({ tasks: tasksData })} - /> -
+ handleNext({ tasks: tasksData })} + /> )} {step === 3 && ( -
- handleNext({ smallGoals: goalsData })} - /> -
+ handleNext({ smallGoals: goalsData })} + /> )} {step === 4 && ( -
- -
+ )}
); diff --git a/src/front/components/ChildProfileCreation/ProgressBar.jsx b/src/front/components/ChildProfileCreation/ProgressBar.jsx new file mode 100644 index 0000000..2f8ca25 --- /dev/null +++ b/src/front/components/ChildProfileCreation/ProgressBar.jsx @@ -0,0 +1,25 @@ +import React from "react"; + +export const ProgressBar = ({ step }) => { + const percentage = (step / 4) * 100; + + return ( +
+ {/* Contenedor de Bootstrap */} +
+
+
+

+ PASO {step} DE 4 +

+
+ ); +}; \ No newline at end of file From 6ca2f694a6fb0fab2a90b9c240ecbffc5bea836f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 6 Apr 2026 16:51:18 +0000 Subject: [PATCH 36/46] ultimos cambios --- .../ChildProfileCreation/ChildWizard.jsx | 76 +++++++++++++++++-- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/src/front/components/ChildProfileCreation/ChildWizard.jsx b/src/front/components/ChildProfileCreation/ChildWizard.jsx index 54e291f..e9ed7c9 100644 --- a/src/front/components/ChildProfileCreation/ChildWizard.jsx +++ b/src/front/components/ChildProfileCreation/ChildWizard.jsx @@ -21,12 +21,77 @@ export const ChildWizard = ({ onClose }) => { const handleBack = () => setStep(step - 1); - const handleFinalSubmit = async (finalData) => { - // ... (Tu lógica de fetch al backend se mantiene igual) - alert("¡Perfil de castor completado! 🦦"); - onClose(); + const handleFinalSubmit = async (finalGrandPrizeData) => { + const rawUrl = import.meta.env.VITE_BACKEND_URL || ""; + const baseUrl = rawUrl.replace(/\/$/, "").replace("3000", "3001"); + const token = localStorage.getItem("token"); + + const getHeaders = () => { + const headers = { "Content-Type": "application/json" }; + if (token && token !== "null" && token !== "undefined") { + headers["Authorization"] = `Bearer ${token}`; + } + return headers; }; + try { + // 1. Crear el Niño (Perfil base) + // IMPORTANTE: Enviamos name, age, pin directamente, no dentro de {child: ...} + const childData = { + name: formData.child.child.name, // Ajustado según cómo guardas el estado + age: formData.child.child.age, + pin: formData.child.child.pin, + avatar: formData.child.child.avatar || "default_avatar.png" + }; + + console.log("Enviando datos del niño:", childData); + + const childResponse = await fetch(`${baseUrl}/api/child`, { + method: "POST", + headers: getHeaders(), + body: JSON.stringify(childData) + }); + + if (!childResponse.ok) { + const errorData = await childResponse.json(); + throw new Error(errorData.message || "Fallo al crear el perfil"); + } + + const childResult = await childResponse.json(); + const childId = childResult.child.id; // Aquí obtenemos el ID generado en Python + + // 2. Crear todo lo demás en paralelo usando el childId real + await Promise.all([ + fetch(`${baseUrl}/api/child/${childId}/tasks`, { + method: "POST", + headers: getHeaders(), + body: JSON.stringify(formData.tasks) // formData.tasks ya es una lista [] + }), + fetch(`${baseUrl}/api/child/${childId}/small-goals`, { + method: "POST", + headers: getHeaders(), + body: JSON.stringify(formData.smallGoals) + }), + fetch(`${baseUrl}/api/child/${childId}/grand-prize`, { + method: "POST", + headers: getHeaders(), + body: JSON.stringify({ + name: finalGrandPrizeData.name, + coins: parseInt(finalGrandPrizeData.coins), + image_url: finalGrandPrizeData.image_url || "" + }) + }) + ]); + + alert("¡Perfil de castor guardado en la base de datos! 🦦💎"); + onClose(); + + } catch (error) { + console.error("❌ ERROR CRÍTICO BACKEND:", error.message); + alert("Error al guardar: " + error.message); + } +}; + return (
{step === 1 && ( @@ -62,4 +127,5 @@ export const ChildWizard = ({ onClose }) => { )}
); -}; \ No newline at end of file +}; + From 796ada0b23e520c1b0718dde03d0b5fbfc13ca79 Mon Sep 17 00:00:00 2001 From: Diego-Tello Date: Mon, 6 Apr 2026 16:53:06 +0000 Subject: [PATCH 37/46] calendar --- src/ParentDashboard/components/RightPanel.jsx | 79 +++++++++++++++--- src/ParentDashboard/pages/ParentAdmin.jsx | 27 +++++-- .../style ParentDash/styleLeftPanel.css | 78 ++++++++++++++++++ .../style ParentDash/stylePAdmin.css | 73 ++++++++++------- .../style ParentDash/styleRightPanel.css | 81 +++++++++++++++++++ 5 files changed, 288 insertions(+), 50 deletions(-) create mode 100644 src/ParentDashboard/style ParentDash/styleLeftPanel.css create mode 100644 src/ParentDashboard/style ParentDash/styleRightPanel.css diff --git a/src/ParentDashboard/components/RightPanel.jsx b/src/ParentDashboard/components/RightPanel.jsx index 8f14ce0..393446f 100644 --- a/src/ParentDashboard/components/RightPanel.jsx +++ b/src/ParentDashboard/components/RightPanel.jsx @@ -1,8 +1,29 @@ +import React, { useState } from 'react'; import PropTypes from 'prop-types'; +import "../style ParentDash/styleRightPanel.css"; -const RightPanel = ({ grandPrizeName, grandPrizeImage }) => { - // Obtenemos el mes actual para el título del calendario - const currentMonth = new Intl.DateTimeFormat('es-ES', { month: 'long', year: 'numeric' }).format(new Date()); +const RightPanel = ({ grandPrizeName, grandPrizeImage, tasks = [] }) => { + const [selectedTasks, setSelectedTasks] = useState([]); + const [isModalOpen, setIsModalOpen] = useState(false); + + // Configuración de fecha actual + const now = new Date(); + const currentMonthLabel = new Intl.DateTimeFormat('es-ES', { month: 'long', year: 'numeric' }).format(now); + + // Obtener días del mes actual + const year = now.getFullYear(); + const month = now.getMonth(); + const daysInMonth = new Date(year, month + 1, 0).getDate(); + const daysArray = Array.from({ length: daysInMonth }, (_, i) => i + 1); + + const handleDayClick = (day) => { + // Formato YYYY-MM-DD para comparar con las tareas + const dateStr = `${year}-${(month + 1).toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`; + const dayTasks = tasks.filter(t => t.date === dateStr); + + setSelectedTasks(dayTasks); + setIsModalOpen(true); + }; return (
-
+
{/* 2. Sección del Calendario */}
-

{currentMonth}

+

{currentMonthLabel}

-
- {/* Aquí puedes renderizar un calendario real o una cuadrícula de días */} -
- Calendario -
+ +
+ {/* Cabecera simple de días (opcional) */} + {['L', 'M', 'X', 'J', 'V', 'S', 'D'].map(d => ( +
{d}
+ ))} + + {daysArray.map(day => { + const dateStr = `${year}-${(month + 1).toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`; + const dayTasks = tasks.filter(t => t.date === dateStr); + + return ( +
handleDayClick(day)}> + {day} +
+ {dayTasks.slice(0, 3).map(t => ( + + ))} +
+
+ ); + })}
+ + {/* 3. Modal de Tareas */} + {isModalOpen && ( +
setIsModalOpen(false)}> +
e.stopPropagation()}> +

Tareas del día

+ {selectedTasks.length > 0 ? ( +
    + {selectedTasks.map(t => ( +
  • • {t.title} +{t.points}pts
  • + ))} +
+ ) :

No hay tareas asignadas.

} + +
+
+ )} ); }; -// Validaciones para que ESLint no marque errores en rojo RightPanel.propTypes = { grandPrizeName: PropTypes.string, - grandPrizeImage: PropTypes.string + grandPrizeImage: PropTypes.string, + tasks: PropTypes.array }; export default RightPanel; \ No newline at end of file diff --git a/src/ParentDashboard/pages/ParentAdmin.jsx b/src/ParentDashboard/pages/ParentAdmin.jsx index 44f74f2..bb3bbf8 100644 --- a/src/ParentDashboard/pages/ParentAdmin.jsx +++ b/src/ParentDashboard/pages/ParentAdmin.jsx @@ -1,40 +1,51 @@ -import React from 'react'; +import React, { useState } from 'react'; import LeftPanel from '../components/LeftPanel'; import CenterPanel from '../components/CenterPanel'; import RightPanel from '../components/RightPanel'; import "../style ParentDash/stylePAdmin.css"; -export const ParentAdmin = () => { // Nota: Sugiero Mayúscula inicial para componentes - // Datos de prueba +export const ParentAdmin = () => { + // 1. Datos de los hijos const misHijos = [ { id: 1, name: "Hijo 1" }, { id: 2, name: "Hijo 2" } ]; + + const [tasks, setTasks] = useState([ + { id: 101, title: "Lavar platos", date: "2026-04-06", points: 10 }, + { id: 102, title: "Hacer la cama", date: "2026-04-06", points: 5 }, + { id: 103, title: "Estudiar", date: "2026-04-07", points: 20 }, + ]); return (
- {/* 1. Left Panel (25%) */} + + {/* 1. Left Panel (Identidad y Selección) */} - {/* 2. Center Panel (50%) */} + {/* 2. Center Panel (Gestión de Tareas) */}
-
+
- {/* 3. Right Panel (25%) */} + {/* 3. Right Panel (Premios y Calendario con Tareas) */}
- +
+
); diff --git a/src/ParentDashboard/style ParentDash/styleLeftPanel.css b/src/ParentDashboard/style ParentDash/styleLeftPanel.css new file mode 100644 index 0000000..a1f882a --- /dev/null +++ b/src/ParentDashboard/style ParentDash/styleLeftPanel.css @@ -0,0 +1,78 @@ +/* 1. Contenedor del panel (asegura espacio entre título y contenido) */ +.left-panel { + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +/* 2. El encabezado (Papá Pérez) arriba */ +.panel-header h2 { + margin: 0; + font-size: 1.6rem; + color: #1e293b; + letter-spacing: -0.025em; +} + +/* 3. Contenedor de la "Fila" (Botón + UL) */ +.panel-content { + display: flex; + flex-direction: row; /* Alineación horizontal principal */ + align-items: center; /* Centra verticalmente el botón con los hijos */ + flex-wrap: wrap; /* Permite que bajen si hay muchos hijos */ + gap: 16px; /* Espacio entre el botón y la lista */ +} + +/* 4. Estilo del botón */ +.btn-create { + padding: 10px 18px; + background-color: #4f46e5; + color: white; + border: none; + border-radius: 10px; + font-weight: 600; + cursor: pointer; + white-space: nowrap; /* Evita que el texto del botón se rompa */ + transition: transform 0.2s; +} + +.btn-create:hover { + transform: translateY(-1px); + background-color: #4338ca; +} + +/* 5. La lista de hijos (UL) - Convertida a fila */ +.children-list { + display: flex; + flex-direction: row; /* Pone los LI uno al lado del otro */ + list-style: none; /* Quita los puntos de la lista */ + margin: 0; + padding: 0; + gap: 10px; /* Espacio entre cada hijo */ +} + +/* 6. Cada ítem de hijo (LI) */ +.child-item { + display: flex; + align-items: center; + padding: 8px 16px; + background-color: #f1f5f9; + border: 1px solid #e2e8f0; + border-radius: 10px; + color: #475569; + font-size: 0.95rem; + white-space: nowrap; +} + +/* --- Ajuste Responsive --- */ +@media (max-width: 640px) { + /* En pantallas muy pequeñas, si no caben de lado, se apilan */ + .panel-content, .children-list { + flex-direction: column; + align-items: stretch; + width: 100%; + } + + .child-item { + justify-content: center; + } +} \ No newline at end of file diff --git a/src/ParentDashboard/style ParentDash/stylePAdmin.css b/src/ParentDashboard/style ParentDash/stylePAdmin.css index 813832b..69e0647 100644 --- a/src/ParentDashboard/style ParentDash/stylePAdmin.css +++ b/src/ParentDashboard/style ParentDash/stylePAdmin.css @@ -1,9 +1,8 @@ /* Contenedor principal de fondo */ .dashboard-wrapper { min-height: 100vh; - background-color: #f8fafc; padding: 2rem; - background-color: #ffffff; /* Color de base */ + background-color: #ffffff; background-image: radial-gradient(at 0% 0%, #f2fcff 0%, transparent 50%), radial-gradient(at 100% 0%, #e9f1f6 0%, transparent 50%), @@ -11,66 +10,80 @@ radial-gradient(at 0% 100%, #e9f1f6 0%, transparent 50%), radial-gradient(at 50% 50%, #ffffff 0%, transparent 50%); background-attachment: fixed; - min-height: 100vh; } /* El contenedor de las 3 columnas */ .dashboard-content { - display: flex; + display: flex; flex-direction: row; justify-content: space-between; - /* CAMBIO: stretch hace que todos los hijos midan lo mismo de alto */ align-items: stretch; gap: 24px; max-width: 1400px; margin: 0 auto; - /* Calculamos el alto restando el padding del wrapper (2rem arriba + 2rem abajo = 4rem o 64px) */ min-height: calc(100vh - 4rem); - background-color: #eef9f7; -} - -/* Panel Izquierdo - 25% */ -.panel-left { - width: 25%; + /* background-color: #eef9f7; <- Opcional, si quieres ver el fondo del contenedor */ } -/* Panel Central - 50% */ -.panel-center { - flex: 0 0 calc(50% - 16px); - padding: 1.5rem; -} - -/* Panel Derecho - 25% */ +/* Configuración de Paneles (Escritorio) */ +.panel-left, .panel-right { - width: 25%; + flex: 0 0 25%; /* Ocupa exactamente el 25% */ + display: flex; + flex-direction: column; } -.panel-left, .panel-center, .panel-right { +.panel-center { + flex: 1; /* Toma el espacio restante (aprox 50%) */ display: flex; flex-direction: column; + /* Eliminamos padding lateral aquí para que la card controle el espaciado interno */ } /* Las cajas blancas redondeadas (Cards) */ .card-container { background-color: #ffffff; padding: 1.5rem; - border-radius: 24px; - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); - - /* CAMBIO: Le decimos que crezca para llenar el espacio del panel */ + border-radius: 24px; /* Mantengo tus 24px que se ven más modernos */ + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); flex-grow: 1; - height: 100%; /* Asegura que tome el alto del padre flex */ - border-radius: 10px; + height: 100%; } -/* Responsive: En tablets/móviles se ponen uno abajo del otro */ +/* --- Responsive --- */ + +/* Tablets y Laptops pequeñas */ @media (max-width: 1024px) { + .dashboard-wrapper { + padding: 1rem; + } + .dashboard-content { - flex-direction: column; + flex-direction: column; /* Apila uno debajo de otro */ + gap: 16px; + min-height: auto; } + .panel-left, .panel-center, .panel-right { - flex: 1 1 100%; + width: 100%; + flex: none; } + + /* ELIMINADO EL ORDER: -1 */ + /* Ahora el orden será: + 1. Papá Pérez (Left) + 2. Misiones (Center) + 3. Premios (Right) + */ } + +/* Ajustes finos para móviles muy pequeños */ +@media (max-width: 480px) { + .card-container { + padding: 1rem; + border-radius: 16px; + } +} + diff --git a/src/ParentDashboard/style ParentDash/styleRightPanel.css b/src/ParentDashboard/style ParentDash/styleRightPanel.css new file mode 100644 index 0000000..11bf212 --- /dev/null +++ b/src/ParentDashboard/style ParentDash/styleRightPanel.css @@ -0,0 +1,81 @@ +/* Sección Gran Premio */ +.prize-card { + text-align: center; + background: #f8fafc; + padding: 1rem; + border-radius: 15px; + margin-bottom: 1rem; +} +.prize-img { width: 60px; height: 60px; border-radius: 50%; object-fit: cover; } +.prize-name { font-weight: bold; margin-top: 5px; color: #1e293b; } + +/* Calendario */ +.calendar-header h4 { + text-transform: capitalize; + margin-bottom: 1rem; + color: #475569; +} + +.calendar-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); /* 7 columnas */ + gap: 4px; +} + +.calendar-weekday { + font-size: 0.7rem; + text-align: center; + font-weight: bold; + color: #94a3b8; + padding-bottom: 5px; +} + +.calendar-day { + aspect-ratio: 1/1; + background: #fff; + border: 1px solid #f1f5f9; + border-radius: 8px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + cursor: pointer; + font-size: 0.8rem; + position: relative; +} + +.calendar-day:hover { background: #eef2ff; } + +/* Puntos de tareas */ +.dots-container { + display: flex; + gap: 2px; + margin-top: 2px; + height: 4px; +} +.task-dot { + width: 4px; + height: 4px; + background-color: #6366f1; + border-radius: 50%; +} + +/* Modal */ +.modal-overlay { + position: fixed; + top: 0; left: 0; width: 100%; height: 100%; + background: rgba(0,0,0,0.4); + display: flex; align-items: center; justify-content: center; + z-index: 999; +} +.modal-content { + background: white; + padding: 2rem; + border-radius: 20px; + width: 300px; + box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1); +} +.modal-task-list { list-style: none; padding: 0; margin: 1rem 0; } +.modal-task-list li { margin-bottom: 8px; font-size: 0.9rem; } +.pts { color: #10b981; font-weight: bold; font-size: 0.8rem; } +.btn-close { width: 100%; padding: 8px; border-radius: 8px; border: none; background: #f1f5f9; cursor: pointer; } \ No newline at end of file From 25bf94f7021978d63021e3444088c38a2fb3b422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Santamar=C3=ADa?= <81576160+DanSantamaria@users.noreply.github.com> Date: Mon, 6 Apr 2026 19:37:39 +0000 Subject: [PATCH 38/46] =?UTF-8?q?Agrego=20validaci=C3=B3n=20de=20PIN=20y?= =?UTF-8?q?=20redirecci=C3=B3n=20de=20rutas=20seg=C3=ADn=20rol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/components/PinModal.jsx | 22 +++++++++++++++++++++- src/front/pages/ProfilesPage.jsx | 8 ++++---- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/front/components/PinModal.jsx b/src/front/components/PinModal.jsx index 1af5d39..dc55246 100644 --- a/src/front/components/PinModal.jsx +++ b/src/front/components/PinModal.jsx @@ -1,8 +1,26 @@ import { useState } from "react"; +import { useNavigate } from "react-router-dom"; import ReactDOM from "react-dom"; export const PinModal = ({ profile, onClose }) => { const [pin, setPin] = useState(""); + const [error, setError] = useState(""); + const navigate = useNavigate(); + + const handleSubmit = () => { + if (pin === profile.pin) { + setError(""); + // Redirección según rol + if (profile.role === "parent") { + navigate("/parentadmin"); + } else { + navigate("/ChildDashboard"); // <-- ruta correcta para hijos + } + onClose(); + } else { + setError("PIN incorrecto, intenta de nuevo"); + } + }; return ReactDOM.createPortal(
@@ -13,9 +31,11 @@ export const PinModal = ({ profile, onClose }) => { maxLength={4} value={pin} onChange={(e) => setPin(e.target.value)} + placeholder="••••" /> + {error &&

{error}

}
- +
diff --git a/src/front/pages/ProfilesPage.jsx b/src/front/pages/ProfilesPage.jsx index fbc0256..85ec1d7 100644 --- a/src/front/pages/ProfilesPage.jsx +++ b/src/front/pages/ProfilesPage.jsx @@ -12,10 +12,10 @@ import CashtorCoins from "../assets/img/cashtor_coins.png"; // ejemplo si quiere export const ProfilesPage = () => { const [selectedProfile, setSelectedProfile] = useState(null); - const profiles = [ - { id: 1, name: "Papá", avatar: Cashtor }, - { id: 2, name: "Dani", avatar: CashtorCoins } - ]; +const profiles = [ + { id: 1, name: "Papá", avatar: Cashtor, pin: "1234", role: "parent" }, + { id: 2, name: "Dani", avatar: CashtorCoins, pin: "4321", role: "child" } +]; return (
From f9e4c1f9f9737826e40a0c9cf3389afcefb7713c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mauri=20Garc=C3=ADa?= <63955780+maurigarciavg@users.noreply.github.com> Date: Mon, 6 Apr 2026 20:04:33 +0000 Subject: [PATCH 39/46] cambios sugeridos por Diego hechos en los modales --- src/ParentDashboard/components/LeftPanel.jsx | 11 +- .../ChildGrandPrizeSet.jsx | 56 +++---- .../ChildProfileCreation/ChildSmallGoals.jsx | 107 ++++++-------- .../ChildProfileCreation/ChildTaskSetting.jsx | 137 ++++++++---------- .../ChildProfileCreation/ChildWizard.css | 110 +++++++++----- 5 files changed, 202 insertions(+), 219 deletions(-) diff --git a/src/ParentDashboard/components/LeftPanel.jsx b/src/ParentDashboard/components/LeftPanel.jsx index a026a54..ed57cbc 100644 --- a/src/ParentDashboard/components/LeftPanel.jsx +++ b/src/ParentDashboard/components/LeftPanel.jsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; -// Asegúrate de que esta ruta sigue siendo válida tras tus merges import { ChildWizard } from "../../front/components/ChildProfileCreation/ChildWizard"; const LeftPanel = ({ parentName, childrenProfiles }) => { @@ -34,7 +33,7 @@ const LeftPanel = ({ parentName, childrenProfiles }) => { left: 0, width: '100vw', height: '100vh', - backgroundColor: 'rgba(0, 0, 0, 0.75)', // Un poco más oscuro para que resalte + backgroundColor: 'rgba(0, 0, 0, 0.75)', display: 'flex', alignItems: 'center', justifyContent: 'center', @@ -42,13 +41,11 @@ const LeftPanel = ({ parentName, childrenProfiles }) => { }}>