commit 1fb92868220b401a67b189fdf5f21f3641422d57 Author: NataliaCancinoV Date: Sat May 25 16:18:39 2024 -0600 Front diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..3e212e1 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react/jsx-no-target-blank': 'off', + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 0000000..f768e33 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh diff --git a/index.html b/index.html new file mode 100644 index 0000000..90fc160 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Rapi cakeFactory + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f72e08d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5069 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/material": "^5.15.18", + "axios": "^1.7.2", + "emailjs-com": "^3.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.1.0", + "react-router-dom": "^6.23.0", + "react-star-ratings": "^2.3.0", + "sweetalert": "^2.1.2", + "sweetalert2": "^11.6.13" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "vite": "^5.2.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.18", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.18.tgz", + "integrity": "sha512-/9pVk+Al8qxAjwFUADv4BRZgMpZM4m5E+2Q/20qhVPuIJWqKp4Ie4tGExac6zu93rgPTYVQGgu+1vjiT0E+cEw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/material": { + "version": "5.15.18", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.18.tgz", + "integrity": "sha512-n+/dsiqux74fFfcRUJjok+ieNQ7+BEk6/OwX9cLcLvriZrZb+/7Y8+Fd2HlUUbn5N0CDurgAHm0VH1DqyJ9HAw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.18", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", + "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", + "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", + "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", + "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", + "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", + "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", + "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", + "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", + "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", + "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", + "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", + "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", + "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", + "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", + "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", + "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.2.79", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", + "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", + "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001610", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", + "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.738", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.738.tgz", + "integrity": "sha512-lwKft2CLFztD+vEIpesrOtCrko/TFnEJlHFdRhazU7Y/jx5qc4cqsocfVrBg4So4gGe9lvxnbLIoev47WMpg+A==", + "dev": true + }, + "node_modules/emailjs-com": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emailjs-com/-/emailjs-com-3.2.0.tgz", + "integrity": "sha512-Prbz3E1usiAwGjMNYRv6EsJ5c373cX7/AGnZQwOfrpNJrygQJ15+E9OOq4pU8yC977Z5xMetRfc3WmDX6RcjAA==", + "deprecated": "The SDK name changed to @emailjs/browser", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", + "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "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", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha512-g0LWaH0gFsxovsU7R5LrrhHhWAWiHRnh1GPrhXnPgYsDkIqjRYUYSZEsej/wtleDrz5xVSIDbeKfidztp2XHFQ==" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-icons": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.1.0.tgz", + "integrity": "sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", + "dependencies": { + "@remix-run/router": "1.16.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", + "dependencies": { + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-star-ratings": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-star-ratings/-/react-star-ratings-2.3.0.tgz", + "integrity": "sha512-34Z/oFNDRRn4ZcX7F3t9ccnpo7SQ32gD/vsusQOBc6B6vlqaGR6tke1/Yx3jTDjemKRSmXqhKgpPTR7/JAXq6A==", + "dependencies": { + "classnames": "^2.2.1", + "prop-types": "^15.6.0", + "react": "^16.1.0" + } + }, + "node_modules/react-star-ratings/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", + "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.3", + "@rollup/rollup-android-arm64": "4.14.3", + "@rollup/rollup-darwin-arm64": "4.14.3", + "@rollup/rollup-darwin-x64": "4.14.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", + "@rollup/rollup-linux-arm-musleabihf": "4.14.3", + "@rollup/rollup-linux-arm64-gnu": "4.14.3", + "@rollup/rollup-linux-arm64-musl": "4.14.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", + "@rollup/rollup-linux-riscv64-gnu": "4.14.3", + "@rollup/rollup-linux-s390x-gnu": "4.14.3", + "@rollup/rollup-linux-x64-gnu": "4.14.3", + "@rollup/rollup-linux-x64-musl": "4.14.3", + "@rollup/rollup-win32-arm64-msvc": "4.14.3", + "@rollup/rollup-win32-ia32-msvc": "4.14.3", + "@rollup/rollup-win32-x64-msvc": "4.14.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sweetalert": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/sweetalert/-/sweetalert-2.1.2.tgz", + "integrity": "sha512-iWx7X4anRBNDa/a+AdTmvAzQtkN1+s4j/JJRWlHpYE8Qimkohs8/XnFcWeYHH2lMA8LRCa5tj2d244If3S/hzA==", + "dependencies": { + "es6-object-assign": "^1.1.0", + "promise-polyfill": "^6.0.2" + } + }, + "node_modules/sweetalert2": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.11.0.tgz", + "integrity": "sha512-wKCTtoE6lQVDKaJ5FFq+znk/YykJmJlD8RnLZps8C7DyivctCoRlVeeOwnKfgwKS+QJYon7s++3dmNi3/am1tw==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/limonte" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", + "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..94090f9 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/material": "^5.15.18", + "axios": "^1.7.2", + "emailjs-com": "^3.2.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^5.1.0", + "react-router-dom": "^6.23.0", + "react-star-ratings": "^2.3.0", + "sweetalert": "^2.1.2", + "sweetalert2": "^11.6.13" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "vite": "^5.2.0" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..40d10df --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/AdminPackages/AdminVista.css b/src/AdminPackages/AdminVista.css new file mode 100644 index 0000000..72cf5bd --- /dev/null +++ b/src/AdminPackages/AdminVista.css @@ -0,0 +1,1333 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); + +:root { + --primary-color: #8B374A; + --background-color: #f9f5f0; + --dark-color: #151515; +} + +html { + font-size: 62.5%; + font-family: 'Poppins', sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +/* ********************************** */ +/* UTILIDADES */ +/* ********************************** */ +.container { + max-width: 120rem; + margin: 0 auto; +} + +.heading-1 { + text-align: center; + font-weight: 700; + font-size: 3rem; +} + +.heading-2{ + text-align: left; + font-weight: 700; + font-size: 3rem; + color: #000000; +} + +/* ********************************** */ +/* HEADER */ +/* ********************************** */ +.container-hero { + background-color: var(--background-color); +} + +.hero { + display: flex; + justify-content: space-between; + align-items: center; + padding: 2rem 0; +} + +.customer-support { + display: flex; + align-items: center; + gap: 2rem; +} + +.customer-support i { + font-size: 3.3rem; +} + +.content-customer-support { + display: flex; + flex-direction: column; +} + +.container-logo { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.container-logo i { + font-size: 3rem; +} + +.container-logo h1 a { + text-decoration: none; + color: #000; + font-size: 3rem; + text-transform: uppercase; + letter-spacing: -1px; +} + +.container-user { + display: flex; + gap: 1rem; + cursor: pointer; +} + +.container-user .fa-user { + font-size: 3rem; + color: var(--primary-color); + padding-right: 2.5rem; + border-right: 1px solid #e2e2e2; +} + +.container-user .fa-basket-shopping { + font-size: 3rem; + color: var(--primary-color); + padding-left: 1rem; +} + +.content-shopping-cart { + display: flex; + flex-direction: column; +} + +/* ************* NAVBAR ************* */ +.container-navbar { + background-color: var(--primary-color); +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; + color: white; +} + +.navbar .fa-bars { + display: none; +} + +.menu { + display: flex; + gap: 2rem; + +} + +.menu li { + list-style: none; +} + +.menu a { + text-decoration: none; + font-size: 1.3rem; + color: var(--dark-color); + font-weight: 600; + text-transform: uppercase; + position: relative; + color: white; +} + +.menu a::after { + content: ''; + width: 1.5rem; + height: 1px; + background-color: #fff; + position: absolute; + bottom: -3px; + left: 50%; + transform: translate(-50%, 50%); + opacity: 0; + transition: all 0.3s ease; +} + +.menu a:hover::after { + opacity: 1; +} + +.menu a:hover { + color: #fff; +} + +.search-form { + position: relative; + display: flex; + align-items: center; + + border-radius: 2rem; + + height: 4.4rem; + overflow: hidden; +} + +.search-form input { + outline: none; + font-family: inherit; + border: none; + width: 25rem; + font-size: 1.4rem; + padding: 0 2rem; + color: #777; + cursor: pointer; +} + +.search-form input::-webkit-search-cancel-button { + appearance: none; +} + +.search-form .btn-search { + border: none; + background-color: var(--primary-color); + display: flex; + align-items: center; + justify-content: center; + height: 100%; + padding: 1rem; +} + +.btn-search i { + font-size: 2rem; + color: var(--primary-color); +} + +/* ********************************** */ +/* BANNER */ +/* ********************************** */ + + +.content-banner { + max-width: 90rem; + margin: 0 auto; + padding: 25rem 0; +} + +.content-banner p { + color: var(--primary-color); + font-size: 1.2rem; + margin-bottom: 1rem; + font-weight: 500; +} + +.content-banner h2 { + color: #fff; + font-size: 3.5rem; + font-weight: 500; + line-height: 1.2; +} + +.content-banner a { + margin-top: 2rem; + text-decoration: none; + color: #fff; + background-color: var(--primary-color); + display: inline-block; + padding: 1rem 3rem; + text-transform: uppercase; + border-radius: 3rem; +} + +/* ********************************** */ +/* MAIN CONTENT */ +/* ********************************** */ +.main-content { + background-color: var(--background-color); +} + +/* ********************************** */ +/* FEATURES */ +/* ********************************** */ +.container-features { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 3rem; + padding: 3rem 0; +} + +.card-feature { + display: flex; + align-items: center; + justify-content: center; + gap: 1.5rem; + + background-color: #fff; + border-radius: 1rem; + padding: 1.5rem 0; +} + +.card-feature i { + font-size: 2.7rem; + color: var(--primary-color); +} + +.feature-content { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.feature-content span { + font-weight: 700; + font-size: 1.2rem; + color: var(--dark-color); +} + +.feature-content p { + color: #777; + font-weight: 500; +} + +/* ********************************** */ +/* CATEGORIES */ +/* ********************************** */ + +.top-categories { + display: flex; + flex-direction: column; + gap: 2rem; + margin-bottom: 3rem; +} + +.container-categories { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 3rem; +} + +.card-category { + height: 20rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-radius: 2rem; + gap: 2rem; +} + + +.card-category p { + font-size: 2.5rem; + color: #fff; + text-transform: capitalize; + position: relative; +} + +.card-category p::after { + content: ''; + width: 2.5rem; + height: 2px; + background-color: #fff; + position: absolute; + bottom: -1rem; + left: 50%; + transform: translate(-50%, 50%); +} + +.card-category span { + font-size: 1.6rem; + color: #fff; + cursor: pointer; +} + +.card-category span:hover { + color: var(--primary-color); +} + +/* ********************************** */ +/* TOP PRODUCTS */ +/* ********************************** */ +.top-products { + display: flex; + flex-direction: column; + gap: 2rem; + margin-bottom: 3rem; +} + +.container-options { + display: flex; + justify-content: center; + gap: 2rem; + margin-bottom: 1rem; +} + +.container-options span { + color: #777; + background-color: #fff; + padding: 0.7rem 3rem; + font-size: 1.4rem; + text-transform: capitalize; + border-radius: 2rem; + cursor: pointer; +} + +.container-options span:hover { + background-color: var(--primary-color); + color: #fff; +} + +.container-options span.active { + background-color: var(--primary-color); + color: #fff; +} + +/* Products */ +.container-products { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(22rem, 1fr)); + gap: 5rem; + margin-bottom: 30px; +} + +.card-product { + background-color: #fff; + padding: 2rem 3rem; + border-radius: 0.5rem; + cursor: pointer; + box-shadow: 0 0 60px rgba(0, 0, 0, 0.1); + border-radius: 30px; + margin-top: 10px; +} + +.card-product1 { + background-color: #fff; + padding: 2rem 3rem; + border-radius: 0.5rem; + cursor: pointer; + box-shadow: 0 0 60px rgba(0, 0, 0, 0.1); + border-radius: 30px; + margin-top: 10px; +} + +.container-img { + position: relative; +} + +.container-img img { + width: 100%; +} + +.container-img .discount { + position: absolute; + left: 0; + background-color: var(--primary-color); + color: #ffffff; + padding: 2px 1.2rem; + border-radius: 1rem; + font-size: 1.2rem; +} + +.card-product:hover .discount { + background-color: #000; +} + +.button-group { + display: flex; + flex-direction: column; + gap: 1rem; + + position: absolute; + top: 0; + right: -3rem; + z-index: -1; + transition: all 0.4s ease; +} + +.button-group span { + border: 1px solid var(--primary-color); + padding: 0.8rem; + + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + cursor: pointer; + transition: all 0.4s ease; +} + +.button-group span:hover { + background-color: var(--primary-color); +} + +.button-group span i { + font-size: 1.5rem; + color: var(--primary-color); +} + +.button-group span:hover i { + color: #fff; +} + +.card-product:hover .button-group { + z-index: 0; + right: -1rem; +} + +.content-card-product { + display: grid; + justify-items: center; + grid-template-columns: 1fr 1fr; + grid-template-rows: repeat(4, min-content); + row-gap: 1rem; +} + +.stars { + grid-row: 1/2; + grid-column: 1/-1; +} + +.stars i { + font-size: 1.3rem; + color: var(--primary-color); +} + +.content-card-product h3 { + grid-row: 2/3; + grid-column: 1/-1; + text-align: center; + font-weight: 400; + font-size: 1.6rem; + margin-bottom: 1rem; + cursor: pointer; +} + +.content-card-product h3:hover { + color: var(--primary-color); +} + +.add-cart { + justify-self: start; + border: 2px solid var(--primary-color); + padding: 1rem; + border-radius: 50%; + cursor: pointer; + transition: all 0.4s ease; + + display: flex; + align-items: center; + justify-content: center; +} + +.add-cart:hover { + background-color: var(--primary-color); +} + +.add-cart i { + font-size: 1.5rem; + color: var(--primary-color); +} + +.add-cart:hover i { + color: #fff; +} + +.content-card-product .price { + justify-self: end; + align-self: center; + + font-size: 1.7rem; + font-weight: 600; +} + +.content-card-product .price span { + font-size: 1.5rem; + font-weight: 400; + text-decoration: line-through; + color: #777; + margin-left: 0.5rem; +} + +.heading-3{ + +} + +/* ********************************** */ +/* GALLERY */ +/* ********************************** */ +.gallery { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 30rem); + gap: 1.5rem; + margin-bottom: 3rem; +} + +.gallery img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.gallery-img-3 { + grid-column: 2/4; + grid-row: 1/3; +} + +/* ********************************** */ +/* SPECIALS */ +/* ********************************** */ +.specials { + display: flex; + flex-direction: column; + gap: 2rem; + margin-bottom: 3rem; +} + +/* ********************************** */ +/* BLOGS */ +/* ********************************** */ +.blogs { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.container-blogs { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 3rem; +} + +.card-blog { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.card-blog .container-img { + border-radius: 2rem; + cursor: pointer; + position: relative; + overflow: hidden; +} + +.button-group-blog { + position: absolute; + bottom: 1.5rem; + right: -2.5rem; + + display: flex; + gap: 0.7rem; + z-index: -1; + transition: all 0.3s ease; +} + +.card-blog:hover .button-group-blog { + z-index: 0; + right: 1.5rem; +} + +.button-group-blog span { + background-color: #fff; + padding: 1rem; + border-radius: 50%; + transition: all 0.4s ease; + + display: flex; + align-items: center; + justify-content: center; +} + +.button-group-blog span i { + font-size: 1.3rem; +} + +.button-group-blog span:hover { + background-color: var(--primary-color); +} + +.button-group-blog span:hover i { + color: #fff; +} + +.content-blog h3 { + font-size: 1.8rem; + margin-bottom: 1.7rem; + color: var(--dark-color); + font-weight: 800; +} + +.content-blog h3:hover { + color: var(--primary-color); + cursor: pointer; +} + +.content-blog p { + margin-top: 1rem; + font-size: 1.4rem; + color: #777; + text-align: justify; +} + +.content-blog span { + color: var(--primary-color); + font-size: 1.3rem; +} + +.btn-read-more { + padding: 1rem 3rem; + background-color: var(--primary-color); + color: #fff; + text-transform: uppercase; + font-size: 1.4rem; + border-radius: 30px; + margin: 3rem 0 5rem; + display: inline-block; + cursor: pointer; +} + +.btn-read-more:hover { + background-color: var(--dark-color); +} + +/* ********************************** */ +/* FOOTER */ +/* ********************************** */ + +.footer { + background-color: var(--primary-color); +} + +.container-footer { + display: flex; + flex-direction: column; + gap: 4rem; + padding: 3rem; +} + +.menu-footer { + display: grid; + grid-template-columns: repeat(3, 1fr) 30rem; + gap: 3rem; + justify-items: center; +} + +.title-footer { + font-weight: 600; + font-size: 1.6rem; + text-transform: uppercase; +} + +.contact-info, +.information, +.my-account, +.newsletter { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.contact-info ul, +.information ul, +.my-account ul { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.contact-info ul li, +.information ul li, +.my-account ul li { + list-style: none; + color: #fff; + font-size: 1.4rem; + font-weight: 300; +} + +.information ul li a, +.my-account ul li a { + text-decoration: none; + color: #fff; + font-weight: 300; +} + +.information ul li a:hover, +.my-account ul li a:hover { + color: var(--dark-color); +} + +.social-icons { + display: flex; + gap: 1.5rem; +} + +.social-icons span { + border-radius: 50%; + width: 3rem; + height: 3rem; + + display: flex; + align-items: center; + justify-content: center; +} + +.social-icons span i { + color: #fff; + font-size: 1.2rem; +} + +.facebook { + background-color: #3b5998; +} + +.twitter { + background-color: #00acee; +} + +.youtube { + background-color: #c4302b; +} + +.pinterest { + background-color: #c8232c; +} + +.instagram { + background: linear-gradient( + #405de6, + #833ab4, + #c13584, + #e1306c, + #fd1d1d, + #f56040, + #fcaf45 + ); +} + +.content p { + font-size: 1.4rem; + color: #fff; + font-weight: 300; +} + +.content input { + outline: none; + background: none; + border: none; + border-bottom: 2px solid #d2b495; + cursor: pointer; + padding: 0.5rem 0 1.2rem; + color: var(--dark-color); + display: block; + margin-bottom: 3rem; + margin-top: 2rem; + width: 100%; + font-family: inherit; +} + +.content input::-webkit-input-placeholder { + color: #eee; +} + +.content button { + border: none; + background-color: #000; + color: #fff; + text-transform: uppercase; + padding: 1rem 3rem; + border-radius: 2rem; + font-size: 1.4rem; + font-family: inherit; + cursor: pointer; + font-weight: 600; +} + +.content button:hover { + background-color: var(--background-color); + color: var(--primary-color); +} + +.copyright { + display: flex; + justify-content: space-between; + padding-top: 2rem; + + border-top: 1px solid #d2b495; +} + +.copyright p { + font-weight: 400; + font-size: 1.6rem; +} + +/* ********************************** */ +/* MEDIA QUERIES -- 768px */ +/* ********************************** */ +@media (max-width: 768px) { + html { + font-size: 55%; + } + + .hero { + padding: 2rem; + } + + .customer-support { + display: none; + } + + .content-shopping-cart { + display: none; + } + + .navbar { + padding: 1rem 2rem; + + } + + .navbar .fa-bars { + display: block; + color: #fff; + font-size: 3rem; + } + + .menu { + display: none; + } + + .content-banner { + max-width: 50rem; + margin: 0 auto; + padding: 25rem 0; + } + + .container-features { + grid-template-columns: repeat(2, 1fr); + padding: 3rem 2rem; + } + + .card-feature { + padding: 2rem; + } + + .heading-1 { + font-size: 2.4rem; + } + + .card-category { + height: 12rem; + } + + .card-category p { + font-size: 2rem; + text-align: center; + line-height: 1; + } + + .card-category span { + font-size: 1.4rem; + } + + .container-options { + align-items: center; + } + + .container-options span { + text-align: center; + padding: 1rem 2rem; + } + + .container-products { + grid-template-columns: repeat(auto-fit, minmax(28rem, 1fr)); + } + + .gallery { + grid-template-rows: repeat(2, 15rem); + } + + .container-blogs { + overflow: hidden; + grid-template-columns: 1fr 1fr; + + height: 52rem; + } + + .menu-footer { + grid-template-columns: repeat(2, 1fr); + } + + .copyright { + flex-direction: column; + justify-content: center; + align-items: center; + gap: 1.5rem; + } +} + +/* ********************************** */ +/* MEDIA QUERIES -- 468px */ +/* ********************************** */ +@media (max-width: 468px) { + html { + font-size: 42.5%; + } + + .content-banner { + max-width: 50rem; + padding: 22rem 0; + } + + .heading-1 { + font-size: 2.8rem; + } + + .card-feature { + flex-direction: column; + border-radius: 2rem; + } + + .feature-content { + align-items: center; + } + + .feature-content p { + font-size: 1.4rem; + text-align: center; + } + + .feature-content span { + font-size: 1.6rem; + text-align: center; + } + + .container-options span { + font-size: 1.8rem; + padding: 1rem 1.5rem; + font-weight: 500; + } + + .container-products { + grid-template-columns: repeat(auto-fit, minmax(25rem, 1fr)); + gap: 1rem; + } + + .container-img .discount { + font-size: 2rem; + } + + .content-card-product h3 { + font-size: 2.2rem; + } + + .gallery { + grid-template-rows: repeat(2, 20rem); + } + + .blogs { + padding: 2rem; + } + + .container-blogs { + grid-template-columns: 1fr; + height: 75rem; + } + + .content-blog h3 { + font-size: 2.4rem; + } + + .content-blog span { + font-size: 1.8rem; + } + + .content-blog p { + font-size: 2.2rem; + } + + .btn-read-more{ + font-size: 1.8rem; + } + + .contact-info ul, + .information ul, + .my-account ul{ + display: none; + } + + .contact-info { + align-items: center; + } + + .menu-footer{ + grid-template-columns: 1fr; + } + + .content p{ + font-size: 1.6rem; + } +} + +.icono-cliente { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-User { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) + +} +.icono-basket { + font-size: 4.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) + +} + +.icono-lupa{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color: white; +} + +.icono-basket-card{ + font-size: 2.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-heart{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} +.icono-eye{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + + +.enlace a { + font-weight: 500; + color: var(--texto-claro); + transition: 0.3s; + } + + .enlace a:hover { + color: var(--color-primario); + } + +.enlaceNombre{ + margin-left: 500px; +} + + + +.content-card-product h3:hover { + color: var(--primary-color); +} + +.add-cart { + justify-self: start; + border: 2px solid var(--primary-color); + padding: 1rem; + border-radius: 50%; + cursor: pointer; + transition: all 0.4s ease; + + display: flex; + align-items: center; + justify-content: center; +} + +.add-cart:hover { + background-color: var(--primary-color); +} + +.add-cart i { + font-size: 1.5rem; + color: var(--primary-color); +} + +.add-cart:hover i { + color: #fff; +} + +.content-card-product .price { + justify-self: end; + align-self: center; + + font-size: 1.7rem; + font-weight: 600; +} + +.content-card-product .price span { + font-size: 1.5rem; + font-weight: 400; + text-decoration: line-through; + color: #777; + margin-left: 0.5rem; +} + + +/* ************* ICONOS ************* */ + + +.icono-cliente { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-User { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) + +} +.icono-basket { + font-size: 4.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-lupa{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color: white; +} + +.icono-basket-card{ + font-size: 2.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +/* Estilos del contenedor principal de reservaciones */ +#contenedor_reservaciones { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + padding-top: 10px; +} + +/* Estilos de cada tarjeta de reservación */ +.reservacion { + display: flex; /* Añadir esta propiedad para usar flexbox */ + width: 700px; + gap: 1.5rem; + height: 230px; + margin: 20px; + padding: 15px; + border: 1px solid #ccc; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + background-color: #fff; +} + +/* Estilos para la imagen */ +.imagenPastel { + width: 300px; + height: 100%; /* Ajustar al 100% del contenedor padre */ + object-fit: cover; + background-repeat: no-repeat; + background-size: 100% auto; + border-radius: 8px; /* Añadir bordes redondeados solo a la izquierda */ +} + +/* Estilos para el texto */ +.reservaData { + width: 50%; + padding: 0 15px; /* Agregar relleno solo a los lados */ +} + +.reservacion h3 { + margin-top: 10px; + font-size: 18px; +} + +.reservacion p { + margin: 8px 0; +} + +/* Estilos del botón Eliminar Reservación */ +.eliminar-btn { + background-color: #8B374A; + color: #fff; + border: none; + padding: 8px 16px; + border-radius: 5px; + cursor: pointer; +} + +.eliminar-btn:hover { + background-color: #ff4646; +} + + +.eliminar-btn:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .modificar-btn { + margin-left: 2rem; + background-color: #8B374A; + color: #fff; + border: none; + padding: 8px 16px; + border-radius: 5px; + cursor: pointer; +} + +.modificar-btn:hover { + background-color: #ff4646; +} + + +.modificar-btn:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + +.IniSesReserva{ + padding-top: 2rem; + padding-bottom: 10px; + border-bottom: 1px solid #e4e4e4; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 24px; + font-weight: 300; +} + +.ReservaNull{ + padding-top: 2rem; + padding-bottom: 10px; + border-bottom: 1px solid #e4e4e4; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 24px; + font-weight: 300; +} \ No newline at end of file diff --git a/src/AdminPackages/AdminVista.jsx b/src/AdminPackages/AdminVista.jsx new file mode 100644 index 0000000..88521f5 --- /dev/null +++ b/src/AdminPackages/AdminVista.jsx @@ -0,0 +1,426 @@ +import { useState, useEffect } from 'react'; + +import './AdminVista.css'; + +import viteLogo from '/vite.svg' +import Edicion1 from '/src/assets/Edicion21.jpg'; +import Edicion12 from '/src/assets/Edicion12.jpg'; +import Edicion13 from '/src/assets/Edicion13.jpg'; +import Edicion14 from '/src/assets/Edicion14.jpg'; +import Edicion15 from '/src/assets/Edicion15.jpg'; +import Edicion16 from '/src/assets/Edicion16.jpg'; +import otra_imagen from '/src/assets/Edicion2.jpg'; +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import axios from "axios"; +//imagenes de pastel de fresas +import pastel_fresa_original from "/src/assets/Pastel-fresa-original.png"; +import pastel_fresa_arcoiris from "/src/assets/Pastel-fresas-arcoiris.png"; +import pastel_fresa_oreo from "/src/assets/Pastel-fresas-oreo.png"; +import pastel_fresa_vainilla from "/src/assets/Pastel-fresas-vainilla.png"; + +import pastelZarza from "/src/assets/pastel-zarza.jpg"; + +import Swal from 'sweetalert2'; + + +function AdminVista() { + const [count, setCount] = useState(0); + const navigate = useNavigate(); + +const [pedidosDePasteles, setPedidosDePasteles] = useState([]); + +const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' +}); + + +const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + console.log("hola"+ datosFormulario.nombre); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerPedidosDePasteles(); + console.log("obtuvo los pedidos"); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + const mostrarAlertaPedidoFallidaLogin=()=>{ + Swal.fire({ + title: "Pedido Fallida", + text: "Inicia Sesion para poder hacer un pedido.", + icon: "error", + button: "Aceptar" + + }); + }; + + + + const obtenerPedidosDePasteles = async () => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerPedidosDePastelesAdmin'); + console.log("Pedidos de pasteles obtenidos:", response.data.pedidos_de_pasteles); + // Almacena los pedidos de pasteles en el estado + setPedidosDePasteles(response.data.pedidos_de_pasteles); + } catch (error) { + console.error("Error al obtener pedidos de pasteles:", error); + } + }; + + const mostrarAlertaEliminarPedido = (idPedido, nombPastel) => { + Swal.fire({ + title: "Eliminar Pedido", + text: `¿Seguro que quieres eliminar tu pedido del ${nombPastel}?`, + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Pedido eliminado correctamente.", + icon: "success", + }); + eliminarPedido(idPedido); + } + }); + }; + + + const eliminarPedido = async (idPedido) => { + console.log(idPedido); + try { + if (idPedido) { + const response = await axios.post('http://localhost:4567/frontend/eliminarPedido', { datosId: { idPedido } }); + console.log(response.data); + // Lógica adicional si es necesario + obtenerPedidosDePasteles(); // Asumiendo que tienes una función para obtener pedidos, similar a obtenerReservaciones + } else { + console.log("El ID del pedido es obligatorio para eliminar."); + // Lógica adicional si es necesario + } + } catch (error) { + throw error; + } + }; + + const mostrarAlertaActualizarEstatusPedido = (idPedido, nombPastel) => { + Swal.fire({ + title: "Actualizar Estado del Pedido", + text: `¿Seguro que quieres marcar el pedido del ${nombPastel} como listo para entregar?`, + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Estado del pedido actualizado a listo para entregar.", + icon: "success", + }); + actualizarEstatusPedido(idPedido, "listo para entregar"); + } + }); + }; + + + const actualizarEstatusPedido = async (idPedido, nuevoEstatus) => { + console.log(idPedido, nuevoEstatus); + try { + if (idPedido) { + const response = await axios.post('http://localhost:4567/frontend/actualizarEstatusPedido', { datosId: { idPedido, nuevoEstatus } }); + console.log(response.data); + // Lógica adicional si es necesario + obtenerPedidosDePasteles(); // Asumiendo que tienes una función para obtener pedidos + } else { + console.log("El ID del pedido es obligatorio para actualizar."); + // Lógica adicional si es necesario + } + } catch (error) { + throw error; + } + }; + + + + + + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + + const [pedidos, setPedidos] = useState([]); + + const generarPedidos = () => { + if (nombreUsuario == null) { + return ( +

Inicia Sesión para poder ver tus pedidos de pasteles.

+ ); + } else { + if (pedidosDePasteles.length === 0) { + return ( +

No tienes pedidos de pasteles en este momento.

+ ); + } else { + return ( +
+ {pedidosDePasteles.map(pedido => ( +
+ + +
+ {pedido.nombre_pastel === 'Pastel de Fresas' ? ( + pedido.relleno === 'Original' ? : + pedido.relleno === 'Arcoiris' ? : + pedido.relleno === 'Oreo' ? : + pedido.relleno === 'Vainilla' ? : + // Si el relleno no coincide con ninguno de los anteriores + ) : pedido.nombre_pastel === 'Pastel Chocolate Blanco' ? ( + + + ) : pedido.nombre_pastel === 'Pastel Cajeta' ? ( + + + ): pedido.nombre_pastel === 'Pastel de Chocolate' ? ( + + + ): pedido.nombre_pastel === 'Pastel Frambuesa' ? ( + + + ) : pedido.nombre_pastel === 'Pastel de Moka' ? ( + + + ) : pedido.nombre_pastel === 'Pastel de Zanahoria' ? ( + + + ):( + // Si el pastel no es de fresas ni de chocolate blanco + )} +
+ + +
+

{pedido.nombre_pastel}

+

Precio del pastel: ${pedido.precio}

+

Tamaño: {pedido.tamaño}

+

Estatus: {pedido.estatus}

+

Inscripción: {pedido.inscripcion}

+

Relleno: {pedido.relleno}

+ + +
+
+ ))} +
+ ); + } + } + }; + + return ( + <> + +
+
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ +
+ +
+
+ + +
+
+ {generarPedidos()} +
+
+ + + + + + + ) + } + + export default AdminVista \ No newline at end of file diff --git a/src/AppInicio.css b/src/AppInicio.css new file mode 100644 index 0000000..c17d1b3 --- /dev/null +++ b/src/AppInicio.css @@ -0,0 +1,1170 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); + +:root { + --primary-color: #8B374A; + --background-color: #f9f5f0; + --dark-color: #151515; +} + +html { + font-size: 62.5%; + font-family: 'Poppins', sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +/* ********************************** */ +/* UTILIDADES */ +/* ********************************** */ +.container { + max-width: 120rem; + margin: 0 auto; +} + +.heading-1 { + text-align: center; + font-weight: 700; + font-size: 3rem; +} + +.heading-2{ + text-align: left; + font-weight: 700; + font-size: 3rem; + color: #000000; +} + +/* ********************************** */ +/* HEADER */ +/* ********************************** */ +.container-hero { + background-color: var(--background-color); +} + +.hero { + display: flex; + justify-content: space-between; + align-items: center; + padding: 2rem 0; +} + +.customer-support { + display: flex; + align-items: center; + gap: 2rem; +} + +.customer-support i { + font-size: 3.3rem; +} + +.content-customer-support { + display: flex; + flex-direction: column; +} + +.container-logo { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.container-logo i { + font-size: 3rem; +} + +.container-logo h1 a { + text-decoration: none; + color: #000; + font-size: 3rem; + text-transform: uppercase; + letter-spacing: -1px; +} + +.container-user { + display: flex; + gap: 1rem; + cursor: pointer; +} + +.container-user .fa-user { + font-size: 3rem; + color: var(--primary-color); + padding-right: 2.5rem; + border-right: 1px solid #e2e2e2; +} + +.container-user .fa-basket-shopping { + font-size: 3rem; + color: var(--primary-color); + padding-left: 1rem; +} + +.content-shopping-cart { + display: flex; + flex-direction: column; +} + +/* ************* NAVBAR ************* */ +.container-navbar { + background-color: var(--primary-color); +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; + color: white; +} + +.navbar .fa-bars { + display: none; +} + +.menu { + display: flex; + gap: 2rem; + +} + +.menu li { + list-style: none; +} + +.menu a { + text-decoration: none; + font-size: 1.3rem; + color: var(--dark-color); + font-weight: 600; + text-transform: uppercase; + position: relative; + color: white; +} + +.menu a::after { + content: ''; + width: 1.5rem; + height: 1px; + background-color: #fff; + position: absolute; + bottom: -3px; + left: 50%; + transform: translate(-50%, 50%); + opacity: 0; + transition: all 0.3s ease; +} + +.menu a:hover::after { + opacity: 1; +} + +.menu a:hover { + color: #fff; +} + +.search-form { + position: relative; + display: flex; + align-items: center; + + border-radius: 2rem; + + height: 4.4rem; + overflow: hidden; +} + +.search-form input { + outline: none; + font-family: inherit; + border: none; + width: 25rem; + font-size: 1.4rem; + padding: 0 2rem; + color: #777; + cursor: pointer; +} + +.search-form input::-webkit-search-cancel-button { + appearance: none; +} + +.search-form .btn-search { + border: none; + background-color: var(--primary-color); + display: flex; + align-items: center; + justify-content: center; + height: 100%; + padding: 1rem; +} + +.btn-search i { + font-size: 2rem; + color: var(--primary-color); +} + +/* ********************************** */ +/* BANNER */ +/* ********************************** */ +.banner { + background-image: linear-gradient(100deg, #000000, #00000020), + url('assets/pastel-fondo.jpg'); + height: 60rem; + background-size: cover; + background-position: center; +} + +.content-banner { + max-width: 90rem; + margin: 0 auto; + padding: 25rem 0; +} + +.content-banner p { + color: var(--primary-color); + font-size: 1.2rem; + margin-bottom: 1rem; + font-weight: 500; +} + +.content-banner h2 { + color: #fff; + font-size: 3.5rem; + font-weight: 500; + line-height: 1.2; +} + +.content-banner a { + margin-top: 2rem; + text-decoration: none; + color: #fff; + background-color: var(--primary-color); + display: inline-block; + padding: 1rem 3rem; + text-transform: uppercase; + border-radius: 3rem; +} + +/* ********************************** */ +/* MAIN CONTENT */ +/* ********************************** */ +.main-content { + background-color: var(--background-color); +} + +/* ********************************** */ +/* FEATURES */ +/* ********************************** */ +.container-features { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 3rem; + padding: 3rem 0; +} + +.card-feature { + display: flex; + align-items: center; + justify-content: center; + gap: 1.5rem; + + background-color: #fff; + border-radius: 1rem; + padding: 1.5rem 0; +} + +.card-feature i { + font-size: 2.7rem; + color: var(--primary-color); +} + +.feature-content { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.feature-content span { + font-weight: 700; + font-size: 1.2rem; + color: var(--dark-color); +} + +.feature-content p { + color: #777; + font-weight: 500; +} + +/* ********************************** */ +/* CATEGORIES */ +/* ********************************** */ + +.top-categories { + display: flex; + flex-direction: column; + gap: 2rem; + margin-bottom: 3rem; +} + +.container-categories { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 3rem; +} + +.card-category { + height: 20rem; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + border-radius: 2rem; + gap: 2rem; +} + +.category-moca { + background-image: linear-gradient(#00000080, #00000080), + url('assets/pastel-4-leches.jpg'); + background-size: cover; + background-position: bottom; + background-repeat: no-repeat; +} + +.category-capuchino { + background-image: linear-gradient(#00000080, #00000080), + url('assets/pastel-zarza.jpg'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.category-expreso { + background-image: linear-gradient(#00000080, #00000080), + url('assets/pastel-moka.jpg'); + background-size: cover; + background-position: center; + background-repeat: no-repeat; +} + +.card-category p { + font-size: 2.5rem; + color: #fff; + text-transform: capitalize; + position: relative; +} + +.card-category p::after { + content: ''; + width: 2.5rem; + height: 2px; + background-color: #fff; + position: absolute; + bottom: -1rem; + left: 50%; + transform: translate(-50%, 50%); +} + +.card-category span { + font-size: 1.6rem; + color: #fff; + cursor: pointer; +} + +.card-category span:hover { + color: var(--primary-color); +} + +/* ********************************** */ +/* TOP PRODUCTS */ +/* ********************************** */ +.top-products { + display: flex; + flex-direction: column; + gap: 2rem; + margin-bottom: 3rem; +} + +.container-options { + display: flex; + justify-content: center; + gap: 2rem; + margin-bottom: 1rem; +} + +.container-options span { + color: #777; + background-color: #fff; + padding: 0.7rem 3rem; + font-size: 1.4rem; + text-transform: capitalize; + border-radius: 2rem; + cursor: pointer; +} + +.container-options span:hover { + background-color: var(--primary-color); + color: #fff; +} + +.container-options span.active { + background-color: var(--primary-color); + color: #fff; +} + +/* Products */ +.container-products { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(22rem, 1fr)); + gap: 5rem; + margin-bottom: 30px; +} + +.card-product { + background-color: #fff; + padding: 2rem 3rem; + border-radius: 0.5rem; + cursor: pointer; + box-shadow: 0 0 60px rgba(0, 0, 0, 0.1); + border-radius: 30px; + margin-top: 10px; +} + +.card-product1 { + background-color: #fff; + padding: 2rem 3rem; + border-radius: 0.5rem; + cursor: pointer; + box-shadow: 0 0 60px rgba(0, 0, 0, 0.1); + border-radius: 30px; + margin-top: 10px; +} + +.container-img { + position: relative; +} + +.container-img img { + width: 100%; +} + +.container-img .discount { + position: absolute; + left: 0; + background-color: var(--primary-color); + color: #ffffff; + padding: 2px 1.2rem; + border-radius: 1rem; + font-size: 1.2rem; +} + +.card-product:hover .discount { + background-color: #000; +} + +.button-group { + display: flex; + flex-direction: column; + gap: 1rem; + + position: absolute; + top: 0; + right: -3rem; + z-index: -1; + transition: all 0.4s ease; +} + +.button-group span { + border: 1px solid var(--primary-color); + padding: 0.8rem; + + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + cursor: pointer; + transition: all 0.4s ease; +} + +.button-group span:hover { + background-color: var(--primary-color); +} + +.button-group span i { + font-size: 1.5rem; + color: var(--primary-color); +} + +.button-group span:hover i { + color: #fff; +} + +.card-product:hover .button-group { + z-index: 0; + right: -1rem; +} + +.content-card-product { + display: grid; + justify-items: center; + grid-template-columns: 1fr 1fr; + grid-template-rows: repeat(4, min-content); + row-gap: 1rem; +} + +.stars { + grid-row: 1/2; + grid-column: 1/-1; +} + +.stars i { + font-size: 1.3rem; + color: var(--primary-color); +} + +.content-card-product h3 { + grid-row: 2/3; + grid-column: 1/-1; + text-align: center; + font-weight: 400; + font-size: 1.6rem; + margin-bottom: 1rem; + cursor: pointer; +} + +.content-card-product h3:hover { + color: var(--primary-color); +} + +.add-cart { + justify-self: start; + border: 2px solid var(--primary-color); + padding: 1rem; + border-radius: 50%; + cursor: pointer; + transition: all 0.4s ease; + + display: flex; + align-items: center; + justify-content: center; +} + +.add-cart:hover { + background-color: var(--primary-color); +} + +.add-cart i { + font-size: 1.5rem; + color: var(--primary-color); +} + +.add-cart:hover i { + color: #fff; +} + +.content-card-product .price { + justify-self: end; + align-self: center; + + font-size: 1.7rem; + font-weight: 600; +} + +.content-card-product .price span { + font-size: 1.5rem; + font-weight: 400; + text-decoration: line-through; + color: #777; + margin-left: 0.5rem; +} + +.heading-3{ + +} + +/* ********************************** */ +/* GALLERY */ +/* ********************************** */ +.gallery { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 30rem); + gap: 1.5rem; + margin-bottom: 3rem; +} + +.gallery img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.gallery-img-3 { + grid-column: 2/4; + grid-row: 1/3; +} + +/* ********************************** */ +/* SPECIALS */ +/* ********************************** */ +.specials { + display: flex; + flex-direction: column; + gap: 2rem; + margin-bottom: 3rem; +} + +/* ********************************** */ +/* BLOGS */ +/* ********************************** */ +.blogs { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.container-blogs { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 3rem; +} + +.card-blog { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.card-blog .container-img { + border-radius: 2rem; + cursor: pointer; + position: relative; + overflow: hidden; +} + +.button-group-blog { + position: absolute; + bottom: 1.5rem; + right: -2.5rem; + + display: flex; + gap: 0.7rem; + z-index: -1; + transition: all 0.3s ease; +} + +.card-blog:hover .button-group-blog { + z-index: 0; + right: 1.5rem; +} + +.button-group-blog span { + background-color: #fff; + padding: 1rem; + border-radius: 50%; + transition: all 0.4s ease; + + display: flex; + align-items: center; + justify-content: center; +} + +.button-group-blog span i { + font-size: 1.3rem; +} + +.button-group-blog span:hover { + background-color: var(--primary-color); +} + +.button-group-blog span:hover i { + color: #fff; +} + +.content-blog h3 { + font-size: 1.8rem; + margin-bottom: 1.7rem; + color: var(--dark-color); + font-weight: 800; +} + +.content-blog h3:hover { + color: var(--primary-color); + cursor: pointer; +} + +.content-blog p { + margin-top: 1rem; + font-size: 1.4rem; + color: #777; + text-align: justify; +} + +.content-blog span { + color: var(--primary-color); + font-size: 1.3rem; +} + +.btn-read-more { + padding: 1rem 3rem; + background-color: var(--primary-color); + color: #fff; + text-transform: uppercase; + font-size: 1.4rem; + border-radius: 30px; + margin: 3rem 0 5rem; + display: inline-block; + cursor: pointer; +} + +.btn-read-more:hover { + background-color: var(--dark-color); +} + +/* ********************************** */ +/* FOOTER */ +/* ********************************** */ + +.footer { + background-color: var(--primary-color); +} + +.container-footer { + display: flex; + flex-direction: column; + gap: 4rem; + padding: 3rem; +} + +.menu-footer { + display: grid; + grid-template-columns: repeat(3, 1fr) 30rem; + gap: 3rem; + justify-items: center; +} + +.title-footer { + font-weight: 600; + font-size: 1.6rem; + text-transform: uppercase; +} + +.contact-info, +.information, +.my-account, +.newsletter { + display: flex; + flex-direction: column; + gap: 2rem; +} + +.contact-info ul, +.information ul, +.my-account ul { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.contact-info ul li, +.information ul li, +.my-account ul li { + list-style: none; + color: #fff; + font-size: 1.4rem; + font-weight: 300; +} + +.information ul li a, +.my-account ul li a { + text-decoration: none; + color: #fff; + font-weight: 300; +} + +.information ul li a:hover, +.my-account ul li a:hover { + color: var(--dark-color); +} + +.social-icons { + display: flex; + gap: 1.5rem; +} + +.social-icons span { + border-radius: 50%; + width: 3rem; + height: 3rem; + + display: flex; + align-items: center; + justify-content: center; +} + +.social-icons span i { + color: #fff; + font-size: 1.2rem; +} + +.facebook { + background-color: #3b5998; +} + +.twitter { + background-color: #00acee; +} + +.youtube { + background-color: #c4302b; +} + +.pinterest { + background-color: #c8232c; +} + +.instagram { + background: linear-gradient( + #405de6, + #833ab4, + #c13584, + #e1306c, + #fd1d1d, + #f56040, + #fcaf45 + ); +} + +.content p { + font-size: 1.4rem; + color: #fff; + font-weight: 300; +} + +.content input { + outline: none; + background: none; + border: none; + border-bottom: 2px solid #d2b495; + cursor: pointer; + padding: 0.5rem 0 1.2rem; + color: var(--dark-color); + display: block; + margin-bottom: 3rem; + margin-top: 2rem; + width: 100%; + font-family: inherit; +} + +.content input::-webkit-input-placeholder { + color: #eee; +} + +.content button { + border: none; + background-color: #000; + color: #fff; + text-transform: uppercase; + padding: 1rem 3rem; + border-radius: 2rem; + font-size: 1.4rem; + font-family: inherit; + cursor: pointer; + font-weight: 600; +} + +.content button:hover { + background-color: var(--background-color); + color: var(--primary-color); +} + +.copyright { + display: flex; + justify-content: space-between; + padding-top: 2rem; + + border-top: 1px solid #d2b495; +} + +.copyright p { + font-weight: 400; + font-size: 1.6rem; +} + +/* ********************************** */ +/* MEDIA QUERIES -- 768px */ +/* ********************************** */ +@media (max-width: 768px) { + html { + font-size: 55%; + } + + .hero { + padding: 2rem; + } + + .customer-support { + display: none; + } + + .content-shopping-cart { + display: none; + } + + .navbar { + padding: 1rem 2rem; + + } + + .navbar .fa-bars { + display: block; + color: #fff; + font-size: 3rem; + } + + .menu { + display: none; + } + + .content-banner { + max-width: 50rem; + margin: 0 auto; + padding: 25rem 0; + } + + .container-features { + grid-template-columns: repeat(2, 1fr); + padding: 3rem 2rem; + } + + .card-feature { + padding: 2rem; + } + + .heading-1 { + font-size: 2.4rem; + } + + .card-category { + height: 12rem; + } + + .card-category p { + font-size: 2rem; + text-align: center; + line-height: 1; + } + + .card-category span { + font-size: 1.4rem; + } + + .container-options { + align-items: center; + } + + .container-options span { + text-align: center; + padding: 1rem 2rem; + } + + .container-products { + grid-template-columns: repeat(auto-fit, minmax(28rem, 1fr)); + } + + .gallery { + grid-template-rows: repeat(2, 15rem); + } + + .container-blogs { + overflow: hidden; + grid-template-columns: 1fr 1fr; + + height: 52rem; + } + + .menu-footer { + grid-template-columns: repeat(2, 1fr); + } + + .copyright { + flex-direction: column; + justify-content: center; + align-items: center; + gap: 1.5rem; + } +} + +/* ********************************** */ +/* MEDIA QUERIES -- 468px */ +/* ********************************** */ +@media (max-width: 468px) { + html { + font-size: 42.5%; + } + + .content-banner { + max-width: 50rem; + padding: 22rem 0; + } + + .heading-1 { + font-size: 2.8rem; + } + + .card-feature { + flex-direction: column; + border-radius: 2rem; + } + + .feature-content { + align-items: center; + } + + .feature-content p { + font-size: 1.4rem; + text-align: center; + } + + .feature-content span { + font-size: 1.6rem; + text-align: center; + } + + .container-options span { + font-size: 1.8rem; + padding: 1rem 1.5rem; + font-weight: 500; + } + + .container-products { + grid-template-columns: repeat(auto-fit, minmax(25rem, 1fr)); + gap: 1rem; + } + + .container-img .discount { + font-size: 2rem; + } + + .content-card-product h3 { + font-size: 2.2rem; + } + + .gallery { + grid-template-rows: repeat(2, 20rem); + } + + .blogs { + padding: 2rem; + } + + .container-blogs { + grid-template-columns: 1fr; + height: 75rem; + } + + .content-blog h3 { + font-size: 2.4rem; + } + + .content-blog span { + font-size: 1.8rem; + } + + .content-blog p { + font-size: 2.2rem; + } + + .btn-read-more{ + font-size: 1.8rem; + } + + .contact-info ul, + .information ul, + .my-account ul{ + display: none; + } + + .contact-info { + align-items: center; + } + + .menu-footer{ + grid-template-columns: 1fr; + } + + .content p{ + font-size: 1.6rem; + } +} + +.icono-cliente { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-User { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) + +} +.icono-basket { + font-size: 4.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) + +} + +.icono-lupa{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color: white; +} + +.icono-basket-card{ + font-size: 2.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-heart{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} +.icono-eye{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + + +.enlace a { + font-weight: 500; + color: var(--texto-claro); + transition: 0.3s; + } + + .enlace a:hover { + color: var(--color-primario); + } + +.enlaceNombre{ + margin-left: 500px; +} + + + \ No newline at end of file diff --git a/src/AppInicio.jsx b/src/AppInicio.jsx new file mode 100644 index 0000000..59ce1cf --- /dev/null +++ b/src/AppInicio.jsx @@ -0,0 +1,498 @@ +import React, {useEffect, useState} from "react"; +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './AppInicio.css' +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import axios from 'axios'; +import PastelEditado1 from "./assets/Edicion1.jpg"; +import PastelEditado2 from "./assets/Edicion2.jpg"; +import PastelEditado3 from "./assets/Edicion3.jpg"; +import PastelEditado4 from "./assets/Edicion4.jpg"; +import PastelEditado5 from "./assets/Edicion5.jpg"; +import PastelEditado6 from "./assets/Edicion6.jpg"; +import PastelZanahoria from "./assets/Pastel-Zanahoria.jpg"; +import MejoresPasteles from "./assets/MejoresPasteles.jpg"; +import PastelTematico from "./assets/pastel-tematico.jpg"; +import Swal from 'sweetalert2'; +//import PopupV from "/src/Popups/PopupLoginValido.jsx"; +//import PopupIv from "/src/Popups/PopupLoginInvalido.jsx"; + +function App() { + const [count, setCount] = useState(0); + const navigate = useNavigate(); + + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' +}); + + const redirectPersonalizarPastelArcoiris = () => { + + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + const redirectToLogin = () => { + + navigate("/Login"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + + navigate("/"); + }; + + const redirectToChocolate = ()=>{ + navigate("/Pasteles/ChocolateBlanco") + }; + + const redirectToMoka = ()=>{ + navigate("/Pasteles/PastelMoka") + }; + + const redirectToChocolate2 = ()=>{ + navigate("/Pasteles/PastelChocolate") + }; + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + console.log("hola"+ datosFormulario.nombre); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + + + return ( + <> + +
+
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ +
+ +
+
+ +
+
+

Pastel Delicioso

+

100% Hecho
Por Nosotros

+ Comprar ahora +
+
+ +
+
+ +
+ +
+

Mejores Categorías

+
+
+

Pasteles Personalizados

+ Ver más +
+
+

Pasteles en linea

+ Ver más +
+ +
+
+ +
+

Mejores Productos

+ +
+ Destacados + +
+ +
+ +
+
+ Cafe Irish + -10% +
+ + +
+
+
+
+ + + + + +
+

Pastel Chocolate Blanco

+ + + +

$603$670

+
+
+ +
+
+ Cafe incafe-ingles.jpg + -30% +
+ + +
+
+
+
+ + + + + +
+

Pastel de Moka

+ + + + +

$560 $800

+
+
+ +
+
+ Cafe Australiano + +
+ + +
+
+
+
+ + + + + +
+

Pastel de Chocolate

+ + + +

$350

+
+
+ +
+
+ Moka +
+ + +
+
+
+
+ + + + + +
+

Pastel de Zanahoria

+ + + +

$450

+
+
+
+ + + + +
+ + + +
+

+ +
+ +
+
+ +
+

Últimos Blogs

+ +
+
+
+ Imagen Blog 1 +
+ + + + + + +
+
+
+

Los 5 Mejores Pasteles que Debes Probar

+ 27 de abril de 2024 +

+ En este blog, quiero compartir contigo los cinco pasteles que considero absolutamente deliciosos y que definitivamente deberías probar al menos una vez en la vida. Estos pasteles son mis favoritos por diferentes razones, desde su sabor hasta su textura y presentación. ¡Espero que te animes a probarlos y que también se conviertan en tus favoritos! +

+
Leer más
+
+
+
+
+ Imagen Blog 2 +
+ + + + + + +
+
+
+

Receta: Pastel de Zanahoria

+ 23 de abril de 2024 +

+ El pastel de zanahoria es una verdadera joya en el mundo de la repostería. Su combinación de sabores dulces y especiados, junto con la textura húmeda y esponjosa, lo convierten en un postre irresistible para cualquier ocasión. En este artículo, te compartiré mi receta favorita de pastel + de zanahoria para que puedas disfrutar de esta delicia en cada bocado. +

+
Leer más
+
+
+
+
+ Imagen Blog 3 +
+ + + + + + +
+
+
+

5 Caracteristicas de un patel tematico

+ 20 de abril de 2024 +

+ Lorem ipsum dolor sit amet consectetur adipisicing + elit. Iste, molestiae! Ratione et, dolore ipsum + quaerat iure illum reprehenderit non maxime amet dolor + voluptas facilis corporis, consequatur eius est sunt + suscipit? +

+
Leer más
+
+
+
+
+
+ + + + + + + + ) +} + +export default App \ No newline at end of file diff --git a/src/Pasteles.css b/src/Pasteles.css new file mode 100644 index 0000000..e69de29 diff --git a/src/Pasteles.jsx b/src/Pasteles.jsx new file mode 100644 index 0000000..106d898 --- /dev/null +++ b/src/Pasteles.jsx @@ -0,0 +1,477 @@ +import React, {useEffect, useState} from "react"; + +import viteLogo from '/vite.svg' +import './Pasteles.css' +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; + +import PastelEditado1 from "./assets/Edicion1.jpg"; +import PastelEditado2 from "./assets/Edicion2.jpg"; +import PastelEditado3 from "./assets/Edicion3.jpg"; +import PastelEditado4 from "./assets/Edicion4.jpg"; +import PastelEditado5 from "./assets/Edicion5.jpg"; +import PastelEditado6 from "./assets/Edicion6.jpg"; +import PastelZanahoria from "./assets/Pastel-Zanahoria.jpg"; +import MejoresPasteles from "./assets/MejoresPasteles.jpg"; +import PastelTematico from "./assets/pastel-tematico.jpg"; +import Swal from 'sweetalert2' +import axios from 'axios'; + +function AppPasteles() { + const [count, setCount] = useState(0); + const navigate = useNavigate(); + + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + + navigate("/"); + }; + + const redirectToChocolate = ()=>{ + navigate("/Pasteles/ChocolateBlanco") + }; + + const redirectToMoka = ()=>{ + navigate("/Pasteles/PastelMoka") + }; + + const redirectToChocolate2 = ()=>{ + navigate("/Pasteles/PastelChocolate") + }; + + const redirectToPastelZanahoria = ()=>{ + navigate("/Pasteles/PastelZanahoria") + }; + + const redirectToPastelFrambuesa = ()=>{ + navigate("/Pasteles/PastelFrambuesa") + }; + + const redirectToPastelCajeta = ()=>{ + navigate("/Pasteles/PastelCajeta") + }; + + + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + return ( + <> + +
+
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+

Productos en linea:

+ +
+ +
+ +
+ +
+
+ Pastel Chocolate Blanco + -10% +
+ + +
+
+
+
+ + + + + +
+

Pastel Chocolate Blanco

+ + + + +

$603$670

+
+
+ +
+
+ Cafe incafe-ingles.jpg + -30% +
+ +
+
+
+
+ + + + + +
+

Pastel de Moka

+ + + +

$560 $800

+
+
+ +
+
+ Cafe Australiano +
+ +
+
+
+
+ + + + + +
+

Pastel de Chocolate

+ + + +

$350

+
+
+ +
+
+ Moka +
+ + + +
+
+
+
+ + + + + +
+

Pastel de Zanahoria

+ + + +

$450

+
+
+ +
+
+ Cafe Irish + -13% +
+ + + +
+
+
+
+ + + + + +
+

Pastel Frambuesa

+ + + +

$300

+
+
+ +
+
+ Cafe incafe-ingles.jpg + -22% +
+ + + +
+
+
+
+ + + + + +
+

Pastel de Cajeta

+ + + +

$390 $500

+
+
+
+ +
+ +
+ + +
+ +
+ + + +
+

+ +
+ +
+
+ +
+ +
+ +
+ + + + + + + ) + } + + export default AppPasteles \ No newline at end of file diff --git a/src/Pasteles/ChocolateBlanco.css b/src/Pasteles/ChocolateBlanco.css new file mode 100644 index 0000000..8f5317a --- /dev/null +++ b/src/Pasteles/ChocolateBlanco.css @@ -0,0 +1,584 @@ +@import url('https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;500;700&display=swap'); + + + + +.main-pers-pastel { + display: flex; + gap: 30px; + margin-bottom: 80px; + font-family: 'Ubuntu'; + max-width: 1200px; + margin: 0 auto; + margin-top: 20px; + + +} + +.titulo-Pastel{ + font-size: 25px; +} + +/* ********************************** */ +/* HEADER */ +/* ********************************** */ +.container-hero { + background-color: var(--background-color); +} + +.hero { + display: flex; + justify-content: space-between; + align-items: center; + padding: 2rem 0; +} + +.customer-support { + display: flex; + align-items: center; + gap: 2rem; +} + +.customer-support i { + font-size: 3.3rem; +} + +.content-customer-support { + display: flex; + flex-direction: column; +} + +.container-logo { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.container-logo i { + font-size: 3rem; +} + +.container-logo h1 a { + text-decoration: none; + color: #000; + font-size: 3rem; + text-transform: uppercase; + letter-spacing: -1px; +} + +.container-user { + display: flex; + gap: 1rem; + cursor: pointer; +} + +.container-user .fa-user { + font-size: 3rem; + color: var(--primary-color); + padding-right: 2.5rem; + border-right: 1px solid #e2e2e2; +} + +.container-user .fa-basket-shopping { + font-size: 3rem; + color: var(--primary-color); + padding-left: 1rem; +} + +.content-shopping-cart { + display: flex; + flex-direction: column; +} + +/* ************* NAVBAR ************* */ +.container-navbar { + background-color: var(--primary-color); +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; + color: white; +} + +.navbar .fa-bars { + display: none; +} + +.menu { + display: flex; + gap: 2rem; + +} + +.menu li { + list-style: none; +} + +.menu a { + text-decoration: none; + font-size: 1.3rem; + color: var(--dark-color); + font-weight: 600; + text-transform: uppercase; + position: relative; + color: white; +} + +.menu a::after { + content: ''; + width: 1.5rem; + height: 1px; + background-color: #fff; + position: absolute; + bottom: -3px; + left: 50%; + transform: translate(-50%, 50%); + opacity: 0; + transition: all 0.3s ease; +} + +.menu a:hover::after { + opacity: 1; +} + +.menu a:hover { + color: #fff; +} + +.search-form { + position: relative; + display: flex; + align-items: center; + border: 2px solid #fff; + border-radius: 2rem; + background-color: #fff; + height: 4.4rem; + overflow: hidden; + +} + +.search-form input { + outline: none; + font-family: inherit; + border: none; + width: 25rem; + font-size: 1.4rem; + padding: 0 2rem; + color: #777; + cursor: pointer; + display: none; +} + +.search-form input::-webkit-search-cancel-button { + appearance: none; + +} + +.search-form .btn-search { + border: none; + background-color: var(--primary-color); + display: flex; + align-items: center; + justify-content: center; + height: 100%; + padding: 1rem; + display: none; +} + +.btn-search i { + font-size: 2rem; + color: #fff; +} + + +.container-title { + padding: 30px; + background-color: #eee; + margin-bottom: 50px; + color: #222; +} + + + + + + +.chocolate-blanco { + background-color: #f7f7f9; + background-image: url('/assets/pastel-zarza.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} + +.container-info-product { + flex: 1; + display: flex; + flex-direction: column; +} + +.container-price { + padding-bottom: 20px; + border-bottom: 1px solid #e4e4e4; + display: flex; + align-items: center; + justify-content: space-between; +} + +.container-price span { + font-size: 24px; + font-weight: 300; +} + +.container-details-product { + padding: 30px 0; + padding-bottom: 0px; +} + +.opcionesPers{ + +} + +.textPersPastel{ + font-size: 18px; + font-weight: 900; + margin-bottom: 10px; +} + +.pastel-Type{ + font-size: 18px; + font-weight: 900; + font-weight: lighter; + margin-bottom: 10px; +} + +.pastel-Type1{ + font-size: 18px; + font-weight: lighter; + margin-bottom: 10px; + color: #8B374A; +} + +.botones-pastel{ + display: flex; + gap: 4; + margin-bottom: 20px; + +} + +.boton-1{ + margin-right: 10px; + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-1:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-1:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .boton-2{ + margin-right: 10px; + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-2:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-2:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .boton-3{ + margin-right: 10px; + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-3:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-3:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .boton-4{ + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-4:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-4:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + +.label-text-pers{ + margin-top: 10px; + font-size: 16px; + font-weight: lighter; + margin-bottom: 10px; + +} + +.input-text-pers{ + margin-top: 10px; + font-size: 16px; + margin-bottom: 10px; + text-indent: 5px; + width: 100%; + height: 50px; + +} + +.form-group { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 15px; +} + +.form-group label { + width: 100px; + color: #222; + font-weight: 700; +} + +.form-group select { + width: 300px; + border: none; + padding: 12px 15px; + background-color: #f7f7f7; + outline: none; + color: #666; +} + +.btn-clean { + border: none; + background: none; + color: #666; + margin-left: 120px; + cursor: pointer; +} + +.btn-clean:hover { + color: #1bbeb4; +} + +.container-add-cart { + display: flex; + gap: 20px; + padding-bottom: 30px; + border-bottom: 1px solid #e4e4e4; +} + +.container-quantity { + position: relative; +} + +.input-quantity { + background-color: #f7f7f7; + border: none; + padding: 10px; + width: 60px; + height: 100%; + color: #666; + font-weight: 500; + line-height: 0; +} + +.input-quantity:focus { + outline: none; +} + +.input-quantity::-webkit-inner-spin-button, +.input-quantity::-webkit-outer-spin-button { + -webkit-appearance: none; + appearance: none; +} + + +.fa-chevron-down:hover { + color: #1bbeb4; +} + +.fa-chevron-up:hover { + color: #1bbeb4; +} + +.btn-add-to-cart{ + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.btn-add-to-cart:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .btn-add-to-cart:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + +.hidden { + display: none; +} + +.container-description, +.container-additional-information, +.container-reviews { + display: flex; + flex-direction: column; + border-bottom: 1px solid #e4e4e4; + padding: 10px 0; +} + +.title-description, +.title-additional-information, +.title-reviews { + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; +} + +.title-description h4, +.title-additional-information h4, +.title-reviews h4 { + font-weight: 300; + color: #666; + font-size: 14px; +} + +.text-description, +.text-additional-information, +.text-reviews { + font-size: 13px; + color: #252525; + line-height: 22px; + margin-top: 25px; +} + +.container-social { + display: flex; + justify-content: space-between; + padding: 10px 0; + align-items: center; + border-bottom: 1px solid #e4e4e4; +} + +.container-social span { + font-weight: 300; + color: #252525; +} + +.container-buttons-social { + display: flex; + gap: 15px; + align-items: center; +} + +.container-buttons-social a:link, +.container-buttons-social a:visited { + color: #666; + font-size: 15px; +} + +.container-buttons-social a:hover { + color: #1bbeb4; +} + +.container-related-products h2 { + text-align: center; + margin-bottom: 30px; +} + +.card-list-products { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 25px; +} + +.card { + cursor: pointer; +} + +.card-img { + background: transparent; + margin-bottom: 15px; +} + +.card-img img { + height: 400px; + object-fit: cover; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2); +} + +.info-card { + display: flex; + justify-content: space-between; +} + +.text-product { + color: #252525; + font-weight: 300; + line-height: 1.4; +} + +.text-product h3{ + color: inherit; + font-weight: inherit; + font-size: 15px; +} + +.text-product h3:hover{ + color: #1bbeb4; +} + +.text-product p{ + color: #666; + font-size: 13px; +} + +.text-product p:hover{ + color: #1bbeb4; +} + +footer { + padding: 30px; + background-color: #eee; + margin-top: 50px; + color: #222; +} \ No newline at end of file diff --git a/src/Pasteles/ChocolateBlanco.jsx b/src/Pasteles/ChocolateBlanco.jsx new file mode 100644 index 0000000..71dae24 --- /dev/null +++ b/src/Pasteles/ChocolateBlanco.jsx @@ -0,0 +1,533 @@ +import React, {useEffect, useState} from "react"; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import './ChocolateBlanco.css'; +import Swal from 'sweetalert2' +import axios from 'axios'; + + +import StarRatings from 'react-star-ratings'; + + + +function ChocolateBlanco() { + const navigate = useNavigate(); + + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "No se encuentra disponible.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitosa", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + const hacerPedidoPastel1 = async () => { + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: "", + textoCantidad: "8", + textoRelleno: "Confetti cake", + textoTipo: "Pastel Chocolate Blanco", + textoPrecio:"603", + idPastel: "2" + }); + + mostrarAlertaReservaExitosa(); + + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("2"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "2", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "2", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
+ {} +
+
+
+ +

Pastel De Chocolate

+ +
+ +
+
+
+

Precio:

$603

+ +

Tamaño:

Grande

+ +

Relleno:

Confetti cake

+ +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Este es un delicioso pastel de globo terráqueo de chocolate con glaseado de vainilla. El pastel es de un color marrón intenso y tiene una textura húmeda y densa. El glaseado de vainilla es cremoso y dulce, y la decoración del globo terráqueo con glaseado azul y verde añade un toque de creatividad y diversión. +

+
+
+ +
+
+

Información adicional

+ +
+
+

-----------

+
+
+ +
+
+

Reseñas

+ +
+
+

-----------

+
+
+ +
+ Compartir +
+ + + + + +
+
+
+
+ + + +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + + + + + + ); +} + +export default ChocolateBlanco; \ No newline at end of file diff --git a/src/Pasteles/PastelCajeta.jsx b/src/Pasteles/PastelCajeta.jsx new file mode 100644 index 0000000..738274e --- /dev/null +++ b/src/Pasteles/PastelCajeta.jsx @@ -0,0 +1,514 @@ +import React, {useEffect, useState} from "react"; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import './ChocolateBlanco.css'; +import Swal from 'sweetalert2' +import axios from 'axios'; +import StarRatings from 'react-star-ratings'; + +function PastelCajeta() { + const navigate = useNavigate(); + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + + + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "No se encuentra disponible.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitosa", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + const hacerPedidoPastel1 = async () => { + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: "", + textoCantidad: "8", + textoRelleno: "Chocolate Fudge Cake", + textoTipo: "Pastel Cajeta", + textoPrecio:"390", + idPastel: "3" + }); + + mostrarAlertaReservaExitosa(); + + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("3"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "3", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "3", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
+ {} +
+
+
+ +

Pastel De Cajeta

+ +
+ +
+
+
+

Precio:

$390

+ +

Tamaño:

Mediano

+ +

Relleno:

Chocolate Fudge Cake

+ +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Este es un delicioso pastel de chocolate con ganache de chocolate y frambuesas. El pastel es de un color marrón intenso y tiene una textura húmeda y densa. El ganache de chocolate es cremoso y dulce, y las frambuesas frescas añaden un toque de acidez y color. +

+
+
+ +
+
+

Información adicional

+ +
+
+

-----------

+
+
+ +
+
+

Reseñas

+ +
+
+

-----------

+
+
+ + +
+
+ +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + ); +} + +export default PastelCajeta; \ No newline at end of file diff --git a/src/Pasteles/PastelChocolate.jsx b/src/Pasteles/PastelChocolate.jsx new file mode 100644 index 0000000..b24e85f --- /dev/null +++ b/src/Pasteles/PastelChocolate.jsx @@ -0,0 +1,520 @@ +import React, {useEffect, useState} from "react"; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import './ChocolateBlanco.css'; +import Swal from 'sweetalert2' +import axios from 'axios'; +import StarRatings from 'react-star-ratings'; + + +function PastelChocolate() { + const navigate = useNavigate(); + + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "No se encuentra disponible.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitosa", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + const hacerPedidoPastel1 = async () => { + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: "", + textoCantidad: "8", + textoRelleno: "Chocolate Fudge Cake", + textoTipo: "Pastel de Chocolate", + textoPrecio:"350", + idPastel: "5" + }); + + mostrarAlertaReservaExitosa(); + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("5"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "5", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "5", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
+ +
+
+
+ +

Pastel De Chocolate

+ +
+ +
+
+
+

Precio:

$350

+ +

Tamaño:

Mediano

+ +

Relleno:

Chocolate Fudge Cake

+
+ + +
+
+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Este es un delicioso pastel de chocolate con frosting de chocolate y bolitas de chocolate. El pastel es de un color marrón intenso y tiene una textura húmeda y densa. El frosting de chocolate es cremoso y dulce, y las bolitas de chocolate añaden un toque de textura y sabor. +

+
+
+ +
+
+

Información adicional

+ +
+
+

-----------

+
+
+ +
+
+

Reseñas

+ +
+
+

-----------

+
+
+ + +
+
+ + + +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + + + ); +} + +export default PastelChocolate; \ No newline at end of file diff --git a/src/Pasteles/PastelFrambuesa.jsx b/src/Pasteles/PastelFrambuesa.jsx new file mode 100644 index 0000000..e91b9e1 --- /dev/null +++ b/src/Pasteles/PastelFrambuesa.jsx @@ -0,0 +1,520 @@ +import React, {useEffect, useState} from "react"; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import './ChocolateBlanco.css'; +import Swal from 'sweetalert2' +import axios from 'axios'; +import StarRatings from 'react-star-ratings'; + +function PastelFrambuesa() { + const navigate = useNavigate(); + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "No se encuentra disponible.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitosa", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + const hacerPedidoPastel1 = async () => { + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: "", + textoCantidad: "12", + textoRelleno: "Vanilla Rainbow Cake", + textoTipo: "Pastel Frambuesa", + textoPrecio:"500", + idPastel: "7" + }); + + mostrarAlertaReservaExitosa(); + + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("7"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "7", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "7", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
+ {} +
+
+
+ +

Pastel De Frambuesa

+ +
+ +
+
+
+

Precio:

$500

+ +

Tamaño:

Grande

+ +

Relleno:

Vanilla Rainbow Cake

+ +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Este es un delicioso pastel de terciopelo rojo con glaseado blanco y chispas. El pastel es de un color rojo intenso y tiene una textura suave y húmeda. El glaseado blanco es cremoso y dulce, y las chispas añaden un toque de color y diversión. +

+
+
+ +
+
+

Información adicional

+ +
+
+

-----------

+
+
+ +
+
+

Reseñas

+ +
+
+

-----------

+
+
+ + +
+
+ + + + + +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + + + + + ); +} + +export default PastelFrambuesa; \ No newline at end of file diff --git a/src/Pasteles/PastelMoka.jsx b/src/Pasteles/PastelMoka.jsx new file mode 100644 index 0000000..cfd54e4 --- /dev/null +++ b/src/Pasteles/PastelMoka.jsx @@ -0,0 +1,514 @@ +import React, {useEffect, useState} from "react"; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import Swal from 'sweetalert2' +import axios from 'axios'; +import StarRatings from 'react-star-ratings'; + + +function PastelMoka() { + const navigate = useNavigate(); + + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "No se encuentra disponible.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitosa", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + const hacerPedidoPastel1 = async () => { + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: "", + textoCantidad: "8", + textoRelleno: "Vanilla Rainbow Cake", + textoTipo: "Pastel de Moka", + textoPrecio:"560", + idPastel: "4" + }); + + mostrarAlertaReservaExitosa(); + + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("4"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "4", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "4", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
+ +
+
+
+ +

Pastel De Moka

+ +
+ +
+
+
+

Precio:

$560

+ +

Tamaño:

Mediano

+ +

Relleno:

Vanilla Rainbow Cake

+ +
+ + +
+
+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Este es un delicioso pastel de chocolate con ganache de chocolate. El pastel es de un color marrón intenso y tiene una textura húmeda y densa. El ganache de chocolate es cremoso y dulce, y la decoración con frutas frescas añade un toque de frescura y color. +

+
+
+ +
+
+

Información adicional

+ +
+
+

-----------

+
+
+ +
+
+

Reseñas

+ +
+
+

-----------

+
+
+ +
+
+ +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + ); +} + +export default PastelMoka; \ No newline at end of file diff --git a/src/Pasteles/PastelZanahoria.jsx b/src/Pasteles/PastelZanahoria.jsx new file mode 100644 index 0000000..22553bb --- /dev/null +++ b/src/Pasteles/PastelZanahoria.jsx @@ -0,0 +1,519 @@ +import React, {useEffect, useState} from "react"; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import './ChocolateBlanco.css'; +import Swal from 'sweetalert2' +import axios from 'axios'; +import StarRatings from 'react-star-ratings'; + +function PastelZanahoria() { + const navigate = useNavigate(); + const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' + }); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const redirectToLogin = () => { + + navigate("/Login"); + }; + + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "No se encuentra disponible.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitosa", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + const hacerPedidoPastel1 = async () => { + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: "", + textoCantidad: "8", + textoRelleno: "Vanilla Rainbow Cake", + textoTipo: "Pastel de Zanahoria", + textoPrecio:"450", + idPastel: "6" + }); + + mostrarAlertaReservaExitosa(); + + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("6"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "6", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "6", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ + +
+ +
+ + +
+ +
+
+ {} +
+
+
+ +

Pastel De Zanahoria

+ +
+ +
+
+
+

Precio:

$450

+ +

Tamaño:

Chico

+ +

Relleno:

Vanilla Rainbow Cake

+ + +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Este es un delicioso pastel de zanahoria con queso crema y nueces picadas. El pastel es de un color naranja intenso y tiene una textura húmeda y densa. El queso crema es cremoso y dulce, y las nueces picadas añaden un toque de textura y sabor. +

+
+
+ +
+
+

Información adicional

+ +
+
+

-----------

+
+
+ +
+
+

Reseñas

+ +
+
+

-----------

+
+
+ + +
+
+ + + + +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + + + + ); +} + +export default PastelZanahoria; \ No newline at end of file diff --git a/src/Pedidos.css b/src/Pedidos.css new file mode 100644 index 0000000..9fcc7d4 --- /dev/null +++ b/src/Pedidos.css @@ -0,0 +1,174 @@ + +.content-card-product h3:hover { + color: var(--primary-color); +} + +.add-cart { + justify-self: start; + border: 2px solid var(--primary-color); + padding: 1rem; + border-radius: 50%; + cursor: pointer; + transition: all 0.4s ease; + + display: flex; + align-items: center; + justify-content: center; +} + +.add-cart:hover { + background-color: var(--primary-color); +} + +.add-cart i { + font-size: 1.5rem; + color: var(--primary-color); +} + +.add-cart:hover i { + color: #fff; +} + +.content-card-product .price { + justify-self: end; + align-self: center; + + font-size: 1.7rem; + font-weight: 600; +} + +.content-card-product .price span { + font-size: 1.5rem; + font-weight: 400; + text-decoration: line-through; + color: #777; + margin-left: 0.5rem; +} + + +/* ************* ICONOS ************* */ + + +.icono-cliente { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-User { + font-size: 4rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) + +} +.icono-basket { + font-size: 4.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +.icono-lupa{ + font-size: 2rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color: white; +} + +.icono-basket-card{ + font-size: 2.5rem; /* Cambia el tamaño del icono ajustando el valor de '2rem' según sea necesario */ + align-items: center; + text-align: left; + color:var(--primary-color) +} + +/* Estilos del contenedor principal de reservaciones */ +#contenedor_reservaciones { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + padding-top: 10px; +} + +/* Estilos de cada tarjeta de reservación */ +.reservacion { + display: flex; /* Añadir esta propiedad para usar flexbox */ + width: 700px; + gap: 1.5rem; + height: 230px; + margin: 20px; + padding: 15px; + border: 1px solid #ccc; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + background-color: #fff; +} + +/* Estilos para la imagen */ +.imagenPastel { + width: 300px; + height: 100%; /* Ajustar al 100% del contenedor padre */ + object-fit: cover; + background-repeat: no-repeat; + background-size: 100% auto; + border-radius: 8px; /* Añadir bordes redondeados solo a la izquierda */ +} + +/* Estilos para el texto */ +.reservaData { + width: 50%; + padding: 0 15px; /* Agregar relleno solo a los lados */ +} + +.reservacion h3 { + margin-top: 10px; + font-size: 18px; +} + +.reservacion p { + margin: 8px 0; +} + +/* Estilos del botón Eliminar Reservación */ +.eliminar-btn { + background-color: #8B374A; + color: #fff; + border: none; + padding: 8px 16px; + border-radius: 5px; + cursor: pointer; +} + +.eliminar-btn:hover { + background-color: #ff4646; +} + + +.eliminar-btn:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + +.IniSesReserva{ + padding-top: 2rem; + padding-bottom: 10px; + border-bottom: 1px solid #e4e4e4; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 24px; + font-weight: 300; +} + +.ReservaNull{ + padding-top: 2rem; + padding-bottom: 10px; + border-bottom: 1px solid #e4e4e4; + display: flex; + align-items: center; + justify-content: space-between; + font-size: 24px; + font-weight: 300; +} \ No newline at end of file diff --git a/src/Pedidos.jsx b/src/Pedidos.jsx new file mode 100644 index 0000000..32b5a33 --- /dev/null +++ b/src/Pedidos.jsx @@ -0,0 +1,404 @@ +import { useState, useEffect } from 'react'; + +import './Pedidos.css'; + +import viteLogo from '/vite.svg' +import Edicion1 from './assets/Edicion21.jpg'; +import Edicion12 from './assets/Edicion12.jpg'; +import Edicion13 from './assets/Edicion13.jpg'; +import Edicion14 from './assets/Edicion14.jpg'; +import Edicion15 from './assets/Edicion15.jpg'; +import Edicion16 from './assets/Edicion16.jpg'; +import otra_imagen from './assets/Edicion2.jpg'; +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import axios from "axios"; +//imagenes de pastel de fresas +import pastel_fresa_original from "./assets/Pastel-fresa-original.png"; +import pastel_fresa_arcoiris from "./assets/Pastel-fresas-arcoiris.png"; +import pastel_fresa_oreo from "./assets/Pastel-fresas-oreo.png"; +import pastel_fresa_vainilla from "./assets/Pastel-fresas-vainilla.png"; + +import Swal from 'sweetalert2'; + +import pastelZarza from "./assets/pastel-zarza.jpg" + + +function Pedidos() { + const [count, setCount] = useState(0); + const navigate = useNavigate(); + +const [pedidosDePasteles, setPedidosDePasteles] = useState([]); + +const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' +}); + + +const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + console.log("hola"+ datosFormulario.nombre); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerPedidosDePasteles(); + console.log("obtuvo los pedidos"); + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + const mostrarAlertaPedidoFallidaLogin=()=>{ + Swal.fire({ + title: "Pedido Fallida", + text: "Inicia Sesion para poder hacer un pedido.", + icon: "error", + button: "Aceptar" + + }); + }; + + + + const obtenerPedidosDePasteles = async () => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerPedidosDePasteles'); + console.log("Pedidos de pasteles obtenidos:", response.data.pedidos_de_pasteles); + // Almacena los pedidos de pasteles en el estado + setPedidosDePasteles(response.data.pedidos_de_pasteles); + } catch (error) { + console.error("Error al obtener pedidos de pasteles:", error); + } + }; + + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + const redirectToLogin = () => { + + navigate("/Login"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const mostrarAlertaEliminarPedido = (idPedido, nombPastel, status) => { + if (status === "listo para entregar") { + Swal.fire({ + title: "No se puede eliminar", + text: `El pedido del ${nombPastel} ya está listo para entregar y no se puede eliminar.`, + icon: "info", + confirmButtonText: "Entendido", + }); + } else { + Swal.fire({ + title: "Eliminar Pedido", + text: `¿Seguro que quieres eliminar tu pedido del ${nombPastel}?`, + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Pedido eliminado correctamente.", + icon: "success", + }); + eliminarPedido(idPedido); + } + }); + } + }; + + + const eliminarPedido = async (idPedido) => { + console.log(idPedido); + try { + if (idPedido) { + const response = await axios.post('http://localhost:4567/frontend/eliminarPedido', { datosId: { idPedido } }); + console.log(response.data); + // Lógica adicional si es necesario + obtenerPedidosDePasteles(); // Asumiendo que tienes una función para obtener pedidos, similar a obtenerReservaciones + } else { + console.log("El ID del pedido es obligatorio para eliminar."); + // Lógica adicional si es necesario + } + } catch (error) { + throw error; + } + }; + + const [pedidos, setPedidos] = useState([]); + + const generarPedidos = () => { + if (nombreUsuario == null) { + return ( +

Inicia Sesión para poder ver tus pedidos de pasteles.

+ ); + } else { + if (pedidosDePasteles.length === 0) { + return ( +

No tienes pedidos de pasteles en este momento.

+ ); + } else { + return ( +
+ {pedidosDePasteles.map(pedido => ( +
+ + +
+ {pedido.nombre_pastel === 'Pastel de Fresas' ? ( + pedido.relleno === 'Original' ? : + pedido.relleno === 'Arcoiris' ? : + pedido.relleno === 'Oreo' ? : + pedido.relleno === 'Vainilla' ? : + // Si el relleno no coincide con ninguno de los anteriores + ) : pedido.nombre_pastel === 'Pastel Chocolate Blanco' ? ( + + + ) : pedido.nombre_pastel === 'Pastel Cajeta' ? ( + + + ): pedido.nombre_pastel === 'Pastel de Chocolate' ? ( + + + ): pedido.nombre_pastel === 'Pastel Frambuesa' ? ( + + + ) : pedido.nombre_pastel === 'Pastel de Moka' ? ( + + + ) : pedido.nombre_pastel === 'Pastel de Zanahoria' ? ( + + + ):( + // Si el pastel no es de fresas ni de chocolate blanco + )} +
+ + +
+

{pedido.nombre_pastel}

+

Precio del pastel: ${pedido.precio}

+

Tamaño: {pedido.tamaño}

+

Estatus: {pedido.estatus}

+

Inscripción: {pedido.inscripcion}

+

Relleno: {pedido.relleno}

+ +
+
+ ))} +
+ ); + } + } + }; + + return ( + <> + +
+
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ + +
+ +
+
+
+
+ +
+ +
+
+ + +
+
+ {generarPedidos()} +
+
+ + + + + + + ) + } + + export default Pedidos \ No newline at end of file diff --git a/src/PersPastel1.jsx b/src/PersPastel1.jsx new file mode 100644 index 0000000..9cba2f2 --- /dev/null +++ b/src/PersPastel1.jsx @@ -0,0 +1,710 @@ +import React, { useState, useEffect } from "react"; +import './PersPastelStyle.css'; + +import { Button, Select, MenuItem, TextField, Box } from '@mui/material'; + +import StarRatings from 'react-star-ratings'; + +import { RiCustomerService2Fill } from "react-icons/ri"; +import { FaUser } from "react-icons/fa"; +import { LuShoppingBasket } from "react-icons/lu"; +import { FaMagnifyingGlass } from "react-icons/fa6"; +import { CiHeart } from "react-icons/ci"; +import { FaRegEye } from "react-icons/fa"; +import { CiShare2 } from "react-icons/ci"; +import { useNavigate } from "react-router-dom"; +import axios from 'axios'; +import pastel_fresa_original from "./assets/Pastel-fresa-original.png"; +import pastel_fresa_arcoiris from "./assets/Pastel-fresas-arcoiris.png"; +import pastel_fresa_oreo from "./assets/Pastel-fresas-oreo.png"; +import pastel_fresa_vainilla from "./assets/Pastel-fresas-vainilla.png"; +import Swal from 'sweetalert2' +import pastelTexto from "./assets/pastel-texto.jpg" + +function Pastel() { + const navigate = useNavigate(); + + const [quantity, setQuantity] = useState(1); + + const [textoEncima, setTextoEncima] = useState(""); + + const [textoCantidad, setTextoCantidad] = useState(""); + + const [textoRelleno, setTextoRelleno] = useState(""); + + const [textoTipo, setTextoTipo] = useState(""); + + const [textoPrecio, setTextoPrecio] = useState(""); + + + + + const [datosPastel, setDatosPastel] = useState( + { + texto: '', + quantity: 1 + +}); + +const [datosPastelEnviar, setDatosPastelEnviar] = useState( + { + texto: textoEncima, + quantity: datosPastel.quantity + +}); + +const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' +}); + + const redirectPersonalizarPastelArcoiris = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/PersonalizarPastel/PastelArcoiris"); + }; + + const redirectInicio = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + const redirectToLogin = () => { + + navigate("/Login"); + }; + + const redirectToPedidos = () => { + navigate("/Pedidos"); + + }; + + const redirectToPasteles = () => { + navigate("/Pasteles"); + }; + + const [lastSelectedImage, setLastSelectedImage] = useState(pastel_fresa_original); + const [imagenVisible, setImagenVisible] = useState(pastel_fresa_original); + const [inputActivo, setInputActivo] = useState(false); + const cambiarImagenBoton = (nuevaImagen) => { + if (!inputActivo) { + setImagenVisible(nuevaImagen); + setLastSelectedImage(nuevaImagen); + } + }; + + const handleChange = (event) => { + setImagenVisible(pastelTexto); + setDatosPastel(prevState => ({ + ...prevState, // Clona el estado actual + texto: event.target.value, // Establece el campo 'correo' con el valor del evento + })); + + }; + + const handleInputFocus = () => { + console.log(textoEncima); + setDatosPastel(prevState => ({ + ...prevState, // Clona el estado actual + texto: textoEncima, // Establece el campo 'correo' con el valor del evento + })); + + //console.log("hola"); + + + setImagenVisible(pastelTexto); + }; + + const handleInputBlur = () => { + + setTextoEncima(datosPastel.texto); + console.log(textoEncima); + setDatosPastel(prevState => ({ + ...prevState, // Clona el estado actual + texto: "", // Establece el campo 'correo' con el valor del evento + })); + setImagenVisible(lastSelectedImage); + }; + + const handleDocumentClick = (event) => { + // Comprueba si el clic ocurrió fuera del input + if (!event.target.matches("#inscription")) { + } + }; + + const mostrarAlertaLogOut = () => { + Swal.fire({ + title: "Cerrar Sesión", + text: "¿Seguro que quieres cerrar sesión?", + icon: "warning", + showCancelButton: true, // Mostrar el botón de cancelar + confirmButtonColor: "#3085d6", // Color del botón de confirmar + cancelButtonColor: "#d33", // Color del botón de cancelar + confirmButtonText: "Sí", // Texto del botón de confirmar + cancelButtonText: "No", // Texto del botón de cancelar + }).then((result) => { + if (result.isConfirmed) { + Swal.fire({ + text: "Sesión cerrada correctamente. Adiós " + nombreUsuario + "", + icon: "success", + }); + cerrarSesion(); + } + }); + }; + + const [nombreUsuario, setNombreUsuario]=useState(""); + + const obtenerNombreUsuario = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/obtenerUsuario', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + console.log("hola"+ datosFormulario.nombre); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + useEffect(() => { + // Llamar a la función al cargar la página + obtenerNombreUsuario(); + obtenerReseñasPorPastel(); + mostrarReseñas(); + setTextoRelleno("Original"); + document.addEventListener("click", handleDocumentClick); + return () => { + document.removeEventListener("click", handleDocumentClick); + }; + }, []); + + const cerrarSesion = async () => { + try { + // Realizar la llamada al backend para obtener el nombre del usuario + const response = await axios.post('http://localhost:4567/frontend/cerrarSesion', { datosFormulario }); + setNombreUsuario(response.data.nombre); + console.log(nombreUsuario); + obtenerNombreUsuario(); + //mostrarAlertaLogOut(); + } catch (error) { + // Manejar el error según tus necesidades + console.error("Error al obtener el nombre del usuario", error); + } + }; + + const mostrarAlertaPedidoFallidaLogin=()=>{ + Swal.fire({ + title: "Pedido Fallida", + text: "Inicia Sesion para poder hacer un pedido.", + icon: "error", + button: "Aceptar" + + }); + } + + const handleIncrement = () => { + setQuantity((prevQuantity) => prevQuantity + 1); + }; + + const handleDecrement = () => { + setQuantity((prevQuantity) => (prevQuantity > 1 ? prevQuantity - 1 : 1)); + }; + + const mostrarAlertaReservaFallidaPers=()=>{ + Swal.fire({ + title: "Pedidos Info", + text: "Solo hay pasteles de hasta 12 personas.", + icon: "info", + button: "Aceptar" + + }); + }; + + const mostrarAlertaReservaExitosa=()=>{ + Swal.fire({ + title: "Pedido Exitoso", + text: "Tu Pedido se ha realizado correctamente.", + icon: "success", + button: "Aceptar" + + }); + }; + + + + const handleQuantityChange = (value) => { + if (value >= 1 && value <= 12) { + setQuantity(value); + setDatosPastel((prevData) => ({ ...prevData, quantity: value })); + } else { + mostrarAlertaReservaFallidaPers(); + } + }; + + const clickBotonOriginal = () => { + cambiarImagenBoton(pastel_fresa_original); + setTextoRelleno("Original"); + + }; + + const clickBotonArcoiris = () => { + cambiarImagenBoton(pastel_fresa_arcoiris); + setTextoRelleno("Arcoiris"); + + }; + + const clickBotonOreo = () => { + cambiarImagenBoton(pastel_fresa_oreo); + setTextoRelleno("Oreo"); + + }; + + const clickBotonVainilla = () => { + cambiarImagenBoton(pastel_fresa_vainilla); + setTextoRelleno("Vainilla"); + + }; + + + const hacerPedidoPastel1 = async () => { + console.log("Fresas"); + console.log(datosPastel.quantity); + console.log(textoEncima); + console.log(textoRelleno); + + + + try{ + + if(nombreUsuario==null){ + mostrarAlertaPedidoFallidaLogin(); + + }else{ + + const response = await axios.post('http://localhost:4567/frontend/hacerPedidoPastel1', { + textoEncima: textoEncima, + textoCantidad: datosPastel.quantity, + textoRelleno: textoRelleno, + textoTipo: "Pastel de Fresas", + textoPrecio:"1000", + idPastel: "1" + }); + + console.log(response.data); + mostrarAlertaReservaExitosa(); + + // Limpiar los estados después de hacer el pedido + setDatosPastel({ texto: "", quantity: 1 }); + setTextoEncima(""); + setTextoCantidad(""); + setTextoRelleno("Original"); + setTextoTipo(""); + setDatosPastel({ texto: "", quantity: 1 }); + setQuantity(1); + cambiarImagenBoton(pastel_fresa_original); + + + } + + }catch(error){ + console.error("Error al hace el pedido"); + throw error; + + } + + + + }; + + + const [reseñas, setReseñas] = useState([]); + const [datosFormularioReseña, setDatosFormularioReseña] = useState( + {contenido: '', + estrellas: 5 + }); + + + const handleInputChange = (e) => { + const { name, value } = e.target; + setDatosFormularioReseña({ + ...datosFormularioReseña, + [name]: value, + }); + }; + + const enviarReseña = async (e) => { + e.preventDefault(); + await agregarReseña(); + await obtenerReseñasPorPastel("1"); // Obtener las reseñas nuevamente para actualizar la lista + }; + + + const agregarReseña = async () => { + console.log("Agregando reseña"); + console.log(datosFormularioReseña.contenido); + console.log(datosFormularioReseña.estrellas); + console.log(nombreUsuario) + + try{ + if(nombreUsuario==null){ + mostrarAlertaReseñaFallidaLogin(); + }else{ + const response = await axios.post('http://localhost:4567/frontend/agregarResenia', { + nombreUsuario: nombreUsuario, + idPastel: "1", // Asegúrate de tener el id del pastel + contenido: datosFormularioReseña.contenido, + estrellas: datosFormularioReseña.estrellas, + }); + + console.log(response.data); + //mostrarAlertaReseñaExitosa(); + console.log("reseña exitosa"); + console.log("") + // Limpiar los estados después de agregar la reseña + setDatosFormularioReseña({ contenido: "", estrellas: 0 }); + } + }catch(error){ + console.error("Error al agregar la reseña"); + throw error; + } + + + }; + + + const obtenerReseñasPorPastel = async (idPastel) => { + try { + const response = await axios.post('http://localhost:4567/frontend/obtenerReseniasPorPastel', { + idPastel: "1", + }); + console.log("Reseñas obtenidas:", response.data.reseñas); + const reseñasTransformadas = response.data.reseñas.map(reseña => ({ + idReseña: reseña.id_reseña, + nombreUsuario: reseña.nombre_usuario, + idPastel: reseña.id_pastel, + contenido: reseña.contenido, + estrellas: reseña.estrellas, + })); + + setReseñas(reseñasTransformadas); + } catch (error) { + console.error("Error al obtener reseñas:", error); + } + }; + + const mostrarReseñas = () => { + if (!nombreUsuario) { + return ( +

Inicia Sesión para poder ver las reseñas.

+ ); + } else { + if (reseñas.length === 0) { + return ( +

No hay reseñas para este pastel en este momento.

+ ); + } else { + return ( +
+ {reseñas.map(reseña => ( +
+
+ +
+
{reseña.nombreUsuario}
+
+
+
+ {"★".repeat(reseña.estrellas)}{"☆".repeat(5 - reseña.estrellas)} +
+

+ {reseña.contenido} +

+
+ ))} +
+ ); + } + } + }; + + + + + + return ( + <> + +
+ +
+
+
+ +
+ + Soporte al cliente + 123-456-7890 + +
+
+ +
+ +

Pasteleria RAPI

+
+ +
+ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+
+ Pastel +
{datosPastel.texto}
+
+
+
+ Pastel de Fresas + +
+ +
+
+
+

Personaliza tu pastel

+
+

Tipo de Relleno

+
+ + + + +
+
+ + +
+
Personas
+ handleQuantityChange(e.target.value)} + InputProps={{ inputProps: { min: 1 } }} + className="input-cantidad" + /> +
+ + +
+
+ + +
+

Inscription (30 Character Limit)

+ +
+
+
+
+ +
+ +
+ +
+
+

Descripción

+ +
+
+

+ Lorem ipsum dolor, sit amet consectetur adipisicing elit. + Laboriosam iure provident atque voluptatibus reiciendis quae + rerum, maxime placeat enim cupiditate voluptatum, temporibus + quis iusto. Enim eum qui delectus deleniti similique? Lorem, + ipsum dolor sit amet consectetur adipisicing elit. Sint autem + magni earum est dolorem saepe perferendis repellat ipsam + laudantium cum assumenda quidem quam, vero similique? Iusto + officiis quod blanditiis iste?, ipsum dolor sit amet consectetur + adipisicing elit. Sint autem magni earum est dolorem saepe + perferendis repellat ipsa laudantium cum assumenda quidem + quam, vero similique? Iustoofficiis +

+
+
+
+ +
+ +
+ +

Reseñas

+ +
+

Calificación:

+ setDatosFormularioReseña({...datosFormularioReseña, estrellas: newRating})} + numberOfStars={5} + name='rating' + starDimension="30px" + /> +
+
+
+ + + + + + +
+ {mostrarReseñas()} + +
+ +
+ + + + + + ); +} + +export default Pastel; \ No newline at end of file diff --git a/src/PersPastelStyle.css b/src/PersPastelStyle.css new file mode 100644 index 0000000..874e26d --- /dev/null +++ b/src/PersPastelStyle.css @@ -0,0 +1,853 @@ +@import url('https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;500;700&display=swap'); + + + + +.main-pers-pastel { + display: flex; + gap: 30px; + margin-bottom: 80px; + font-family: 'Ubuntu'; + max-width: 1200px; + margin: 0 auto; + margin-top: 20px; + + +} + + + +/* ********************************** */ +/* HEADER */ +/* ********************************** */ +.container-hero { + background-color: var(--background-color); +} + +.hero { + display: flex; + justify-content: space-between; + align-items: center; + padding: 2rem 0; +} + +.customer-support { + display: flex; + align-items: center; + gap: 2rem; +} + +.customer-support i { + font-size: 3.3rem; +} + +.content-customer-support { + display: flex; + flex-direction: column; +} + +.container-logo { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.container-logo i { + font-size: 3rem; +} + +.container-logo h1 a { + text-decoration: none; + color: #000; + font-size: 3rem; + text-transform: uppercase; + letter-spacing: -1px; +} + +.container-user { + display: flex; + gap: 1rem; + cursor: pointer; +} + +.container-user .fa-user { + font-size: 3rem; + color: var(--primary-color); + padding-right: 2.5rem; + border-right: 1px solid #e2e2e2; +} + +.container-user .fa-basket-shopping { + font-size: 3rem; + color: var(--primary-color); + padding-left: 1rem; +} + +.content-shopping-cart { + display: flex; + flex-direction: column; +} + +/* ************* NAVBAR ************* */ +.container-navbar { + background-color: var(--primary-color); +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + padding: 1rem 0; + color: white; +} + +.navbar .fa-bars { + display: none; +} + +.menu { + display: flex; + gap: 2rem; + +} + +.menu li { + list-style: none; +} + +.menu a { + text-decoration: none; + font-size: 1.3rem; + color: var(--dark-color); + font-weight: 600; + text-transform: uppercase; + position: relative; + color: white; +} + +.menu a::after { + content: ''; + width: 1.5rem; + height: 1px; + background-color: #fff; + position: absolute; + bottom: -3px; + left: 50%; + transform: translate(-50%, 50%); + opacity: 0; + transition: all 0.3s ease; +} + +.menu a:hover::after { + opacity: 1; +} + +.menu a:hover { + color: #fff; +} + +.search-form { + position: relative; + display: flex; + align-items: center; + border: 2px solid #fff; + border-radius: 2rem; + background-color: #fff; + height: 4.4rem; + overflow: hidden; +} + +.search-form input { + outline: none; + font-family: inherit; + border: none; + width: 25rem; + font-size: 1.4rem; + padding: 0 2rem; + color: #777; + cursor: pointer; +} + +.search-form input::-webkit-search-cancel-button { + appearance: none; +} + +.search-form .btn-search { + border: none; + background-color: var(--primary-color); + display: flex; + align-items: center; + justify-content: center; + height: 100%; + padding: 1rem; +} + +.btn-search i { + font-size: 2rem; + color: #fff; +} + + +.container-title { + padding: 30px; + background-color: #eee; + margin-bottom: 50px; + color: #222; +} + + +.imgPastel{ + position: relative; + max-height: 670px; +} + +.texto-encima { + position: absolute; + top: 54%; + left:34%; + max-width: 220px; + word-wrap: break-word; /* Esta propiedad permite que las palabras se rompan cuando no caben en el contenedor */ + overflow-wrap: break-word; + transform: translate(-50%, -50%); + background-color: rgba(255, 255, 255, 0.4); /* Cambia el color de fondo según lo desees */ + padding: 10px; + border-radius: 5px; + font-size: 32px; + text-align: center; + } + + +.container-img-1 { + background-color: #f7f7f9; + background-image: url(''); + flex: 1; + width: 55%; + height: 100%; + background-size: 100% auto; +} + + + +.container-img-2 { + background-color: #f7f7f9; + background-image: url('assets/Edicion21.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} +.container-img-3 { + background-color: #f7f7f9; + background-image: url('assets/Edicion12.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} +.container-img-4 { + background-color: #f7f7f9; + background-image: url('assets/Edicion13.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} +.container-img-5 { + background-color: #f7f7f9; + background-image: url('assets/Edicion14.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} + +.container-img-6 { + background-color: #f7f7f9; + background-image: url('assets/Edicion15.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} + +.container-img-7 { + background-color: #f7f7f9; + background-image: url('assets/Edicion16.jpg'); + flex: 1; + width: 55%; + height: 100%; + padding-top: 60.4%; + background-size: 100% auto; +} + + + +.imgPastel{ + flex: 1; + width: 100%; + height: 100%; + background-size: 200% auto; +} + +.container-info-product { + flex: 1; + display: flex; + flex-direction: column; +} + +.container-price { + padding-bottom: 20px; + border-bottom: 1px solid #e4e4e4; + display: flex; + align-items: center; + justify-content: space-between; +} + +.container-price span { + font-size: 24px; + font-weight: 300; +} + +.container-details-product { + padding: 30px 0; + padding-bottom: 0px; +} + + +.textPersPastel{ + font-size: 18px; + font-weight: bold; + margin-bottom: 10px; +} + +.pastel-Type{ + font-size: 18px; + font-weight: lighter; + margin-bottom: 10px; +} + +.botones-pastel{ + display: flex; + gap: 4; + margin-bottom: 20px; + +} + +.boton-1{ + margin-right: 20px; + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-1:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-1:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .boton-2{ + margin-right: 10px; + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-2:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-2:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .boton-3{ + margin-right: 10px; + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-3:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-3:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .boton-4{ + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.boton-4:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-4:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + +.label-text-pers{ + margin-top: 10px; + font-size: 16px; + font-weight: lighter; + margin-bottom: 10px; + +} + +.input-text-pers{ + margin-top: 10px; + font-size: 16px; + margin-bottom: 10px; + text-indent: 5px; + width: 100%; + height: 50px; + +} + +.form-group { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 15px; +} + +.form-group label { + width: 100px; + color: #222; + font-weight: lighter; +} + +.form-group select { + width: 300px; + border: none; + padding: 12px 15px; + background-color: #f7f7f7; + outline: none; + color: #666; +} + +.btn-clean { + border: none; + background: none; + color: #666; + margin-left: 120px; + cursor: pointer; +} + +.btn-clean:hover { + color: #1bbeb4; +} + +.container-add-cart { + display: flex; + gap: 20px; + padding-bottom: 30px; + border-bottom: 1px solid #e4e4e4; +} + +.container-quantity { + position: relative; +} + +.input-quantity { + background-color: #f7f7f7; + border: none; + padding: 10px; + width: 60px; + height: 100%; + color: #666; + font-weight: 500; + line-height: 0; +} + +.input-quantity:focus { + outline: none; +} + +.input-quantity::-webkit-inner-spin-button, +.input-quantity::-webkit-outer-spin-button { + -webkit-appearance: none; + appearance: none; +} + + +.fa-chevron-down:hover { + color: #1bbeb4; +} + +.fa-chevron-up:hover { + color: #1bbeb4; +} + +.btn-add-to-cart{ + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + border-radius: 5px; + background-color: #8B374A +} + +.btn-add-to-cart:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .btn-add-to-cart:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + +.hidden { + display: none; +} + +.container-description, +.container-additional-information, +.container-reviews { + display: flex; + flex-direction: column; + border-bottom: 1px solid #e4e4e4; + padding: 10px 0; +} + +.title-description, +.title-additional-information, +.title-reviews { + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; +} + +.title-description h4, +.title-additional-information h4, +.title-reviews h4 { + font-weight: 300; + color: #666; + font-size: 14px; +} + +.text-description, +.text-additional-information, +.text-reviews { + font-size: 13px; + color: #252525; + line-height: 22px; + margin-top: 25px; +} + +.container-social { + display: flex; + justify-content: space-between; + padding: 10px 0; + align-items: center; + border-bottom: 1px solid #e4e4e4; +} + +.container-social span { + font-weight: 300; + color: #252525; +} + +.container-buttons-social { + display: flex; + gap: 15px; + align-items: center; +} + +.container-buttons-social a:link, +.container-buttons-social a:visited { + color: #666; + font-size: 15px; +} + +.container-buttons-social a:hover { + color: #1bbeb4; +} + +.container-related-products h2 { + text-align: center; + margin-bottom: 30px; +} + +.card-list-products { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 25px; +} + +.card { + cursor: pointer; +} + +.card-img { + background: transparent; + margin-bottom: 15px; +} + +.card-img img { + height: 400px; + object-fit: cover; + box-shadow: 1px 1px 3px rgba(0, 0, 0, 0.2); +} + +.info-card { + display: flex; + justify-content: space-between; +} + +.text-product { + color: #252525; + font-weight: 300; + line-height: 1.4; +} + +.text-product h3{ + color: inherit; + font-weight: inherit; + font-size: 15px; +} + +.text-product h3:hover{ + color: #1bbeb4; +} + +.text-product p{ + color: #666; + font-size: 13px; +} + +.text-product p:hover{ + color: #1bbeb4; +} + +footer { + padding: 30px; + background-color: #eee; + margin-top: 50px; + color: #222; +} + + +.reseñas{ + display: flex; + align-items: center; +} + +.reseñas-conteiner{ + + display: flex; + align-items: center; +} + + + +/* Estilos para el contenedor principal */ +.customer-reviews-container { + background-color: #fff; + margin-left: 35.5rem; + margin-right: 35.5rem; + position: relative; +} + +/* Estilos para el título */ +.customer-reviews-title { + font-size: 2.875rem; /* text-3xl */ + font-weight: bold; + padding-top: 3rem; + text-align: center; + color: #4b5563; /* text-zinc-800 */ + margin-bottom: 2.5rem; /* mb-10 */ +} + +/* Estilos para el contenedor de cada reseña */ +.customer-review-card {/* ajustar según sea necesario */ + + border-radius: 1rem; + max-width: 100%; + overflow: hidden; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + padding: 1.5rem; + background-color: #f9fafb; /* bg-zinc-50 */ + + margin-bottom: 3rem ; + +} + +/* Estilos para la sección de la imagen y la información del cliente */ +.customer-review-info { + display: flex; + align-items: center; + gap: 0.25rem; /* space-x-2 */ + margin-bottom: 1rem; /* mb-4 */ +} + +/* Estilos para la imagen del cliente */ +.customer-review-avatar { + width: 4.5rem; /* w-10 */ + height: 4.5rem; /* h-10 */ + border-radius: 50%; +} + +/* Estilos para el nombre del cliente */ +.customer-review-name { + padding-left: 3rem; + font-size: 1.875rem; /* text-sm */ + font-weight: bold; +} + +/* Estilos para la descripción del cliente */ +.customer-review-description { + font-size: 0.875rem; /* text-sm */ + color: #4b5563; /* text-zinc-600 */ +} + +/* Estilos para la calificación */ +.customer-review-rating { + margin-bottom: 0.5rem; /* mb-2 */ + color: var(--primary-color); /* text-pink-500 */ + font-size: 2.5rem; +} + +/* Estilos para el contenido de la reseña */ +.customer-review-content { + color: #4b5563; /* text-zinc-700 */ + font-size: 1.5rem; /* text-base */ +} + + +.btn-increment-decrement { + display: flex; + flex-direction: column; + position: absolute; + top: 17px; + right: 17px; +} + +.btn-increment-decrement i { + font-size: 31px; + color: #666; + cursor: pointer; + padding-bottom: 3rem; + +} + + + +.input-cantidad { + background-color: #f7f7f7; + border: none; + padding: 15px; + width: 110px; + height: 100%; + color: #666; + font-weight: lighter; + line-height: 0; +} +.input-cantidad:focus { + outline: none; +} + +.input-cantidad::-webkit-inner-spin-button, +.input-cantidad::-webkit-outer-spin-button { + -webkit-appearance: none; + appearance: none; +} + +.container-cantidad-personas { + display: flex; + align-items: center; + gap: 20px; +} + +.container-add-reservacion { + display: flex; + gap: 20px; + padding-bottom: 30px; + border-bottom: 1px solid #e4e4e4; + font-weight: lighter; +} + +.titulo-pers{ + font-weight: lighter; + font-size: 18px; +} + +.fa-chevron-up, +.fa-chevron-down { + font-size: 20px; /* Aumentar el tamaño de la fuente de los iconos */ +} + + +/* ********************************** */ +/* Reseñas */ +/* ********************************** */ + +.boton-reseñas{ + border: none; + color: white; + padding: 14px 28px; + cursor: pointer; + width: 200px; + border-radius: 5px; + background-color: #8B374A; + +} + +.boton-reseñas:hover { + background-color: #4b1e29; /* Cambia el color al pasar el cursor sobre el botón */ + } + + .boton-reseñas:active { + transform: scale(0.90); /* Reduce ligeramente el tamaño del botón cuando se hace clic */ + } + + .input-reseñas{ + margin-top: 10px; + font-size: 16px; + margin-bottom: 10px; + margin-right: 20px; + text-indent: 5px; + width: 100%; + height: 40px; +} + +.reseñas-conteiner{ + margin-bottom: 5rem; +} + +.star-ratings { + margin-top: 1rem; + margin-bottom: 1rem; + width:335px; +} + + +.estrellas-reviews-container{ + background-color: #fff; + margin-left: 35.5rem; + margin-right: 35.5rem; + position: relative; +} \ No newline at end of file diff --git a/src/Popups/PopupActualizar.jsx b/src/Popups/PopupActualizar.jsx new file mode 100644 index 0000000..f696bf3 --- /dev/null +++ b/src/Popups/PopupActualizar.jsx @@ -0,0 +1,43 @@ +import { Button } from "@mui/base" +import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material" +import { useState } from "react" +import { useNavigate } from "react-router-dom" + +function PopupActualizar ({nombre}){ + const navigate = useNavigate(); + const[open,setOpen] = useState(true); + + const redirectToLogin = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/Login"); + }; + + const eventoAbrir = () => { + setOpen(true) + } + + const eventoCerrar = () => { + setOpen(false) + redirectToLogin(); + } + + return( + <> +
+ + Actualizacion + + + Credenciales actualizadas correctamenete + + + + + + +
+ + ) +} + +export default PopupActualizar \ No newline at end of file diff --git a/src/Popups/PopupActualizarInv.jsx b/src/Popups/PopupActualizarInv.jsx new file mode 100644 index 0000000..b422951 --- /dev/null +++ b/src/Popups/PopupActualizarInv.jsx @@ -0,0 +1,34 @@ +import { Button } from "@mui/base" +import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material" +import { useState } from "react" + +function PopupActualizarInv ({nombre}){ + const[open,setOpen] = useState(true); + + const eventoAbrir = () => { + setOpen(true) + } + + const eventoCerrar = () => { + setOpen(false) + } + return( + <> +
+ + Correo no encontrado + + + El correo que introdujo no existe o no se encuentra. + + + + + + +
+ + ) +} + +export default PopupActualizarInv \ No newline at end of file diff --git a/src/Popups/PopupLoginInvalido.jsx b/src/Popups/PopupLoginInvalido.jsx new file mode 100644 index 0000000..571170a --- /dev/null +++ b/src/Popups/PopupLoginInvalido.jsx @@ -0,0 +1,35 @@ +import { Button } from "@mui/base" +import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material" +import { useState } from "react" + +function PopupLoginInvalido ({nombre}){ + const[open,setOpen] = useState(true); + + const eventoAbrir = () => { + setOpen(true) + } + + const eventoCerrar = () => { + setOpen(false) + } + return( + <> + +
+ + Error al Iniciar Sesion + + + Correo o contraseña incorrecta. + + + + + + +
+ + ) +} + +export default PopupLoginInvalido \ No newline at end of file diff --git a/src/Popups/PopupLoginValido.jsx b/src/Popups/PopupLoginValido.jsx new file mode 100644 index 0000000..27f2599 --- /dev/null +++ b/src/Popups/PopupLoginValido.jsx @@ -0,0 +1,43 @@ +import { Button } from "@mui/base" +import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material" +import { useState } from "react" +import { useNavigate } from "react-router-dom" + +function PopupLoginValido ({nombre}){ + const navigate = useNavigate(); + const[open,setOpen] = useState(true); + + const redirectToHome = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const eventoAbrir = () => { + setOpen(true) + } + + const eventoCerrar = () => { + setOpen(false) + redirectToHome(); + } + return( + <> + +
+ + Inicio de Sesion Exitoso + + + Bienvenido: {nombre} + + + + + + +
+ + ) +} + +export default PopupLoginValido \ No newline at end of file diff --git a/src/Popups/PopupRegistro.jsx b/src/Popups/PopupRegistro.jsx new file mode 100644 index 0000000..9a83177 --- /dev/null +++ b/src/Popups/PopupRegistro.jsx @@ -0,0 +1,36 @@ +import { Button } from "@mui/base" +import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material" +import { useState } from "react" + +function PopupRegistro (){ + const[open,setOpen] = useState(true); + + + const eventoAbrir = () => { + setOpen(true) + } + + + const eventoCerrar = () => { + setOpen(false) + } + return( + <> +
+ + Registro Exitoso + + + Cuenta Registrada con exito + + + + + + +
+ + ) +} + +export default PopupRegistro \ No newline at end of file diff --git a/src/Popups/PopupRsindatos.jsx b/src/Popups/PopupRsindatos.jsx new file mode 100644 index 0000000..6c53ea4 --- /dev/null +++ b/src/Popups/PopupRsindatos.jsx @@ -0,0 +1,35 @@ +import { Button } from "@mui/base" +import { Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from "@mui/material" +import { useState } from "react" + +function Popup (){ + const[open,setOpen] = useState(true); + + const eventoAbrir = () => { + setOpen(true) + } + + const eventoCerrar = () => { + setOpen(false) + } + return( + <> + +
+ + Registro Fallido + + + Porfavor introduzca los datos correspondientes. + + + + + + +
+ + ) +} + +export default Popup \ No newline at end of file diff --git a/src/Sesion/LoginForm.css b/src/Sesion/LoginForm.css new file mode 100644 index 0000000..476b5f2 --- /dev/null +++ b/src/Sesion/LoginForm.css @@ -0,0 +1,126 @@ +.wrapper{ + width: 450px; + background: transparent; + border: 2px solid rgba(255, 255, 255, .2); + backdrop-filter: blur(50px); + box-shadow: 0 0 10px rgba(0, 0, 0, .2); + color: #fff; + border-radius: 20px; + padding: 50px 30px; +} + +.wrapper h1{ + font-size: 36px; + text-align: center; +} + +.wrapper .input-box{ + position: relative; + + margin: 30px 0; +} +.input-box input{ + width: 100%; + height: 100%; + background: transparent; + border: 2px solid rgba(255, 255, 255, .2); + outline: none; + border-radius: 40px; + font-size: 16px; + color: #fff; + padding: 20px 45px 20px 20px; +} + +.input-box input::placeholder{ + color: #fff; +} +.input-box .icon{ + position: absolute; + right: 20px; + top: 50%; + transform: translateY(-50%); + font-size: 16px; +} +.wrapper .remember-forgot{ + display: flex; + justify-content: space-between; + font-size: 14.5px; + margin: -15px 0 15px; +} +.remember-forgot label input{ + accent-color: #fff; + margin-right: 4px; +} +.remember-forgot a{ + color: #fff; + text-decoration: none; +} +.remember-forgot a:hover{ + text-decoration: underline; +} + +.wrapper .boton1{ + display: inline-block; + position: absolute; + background-color: none; + top: 20px; + left: 10px; + width: 45px; + height: 35px; + padding: 0px; + padding-left: 0px; + padding-right: 0px; + font-size: 14px; +} + +.wrapper button{ + width: 100%; + height: 45px; + background: #fff; + border: none; + outline: none; + border-radius: 40px; + box-shadow: 0 0 10px rgba(0, 0, 0, .1); + cursor: pointer; + font-size: 16px; + color: #333; + font-weight: 700; + +} +.wrapper .register-link{ + font-size: 14.5px; + text-align: center; + margin: 20px 0 15px; +} + +.register-link p a{ + color: #fff; + text-decoration: none; + font-weight: 600; +} +.register-link p a:hover { + text-decoration: underline; +} + +.cuerpo { + width: 135.1%; + background-repeat: no-repeat; + height: 100%; + padding-left: 0%; + background-size: 100% auto; + margin:0; + font-family: 'Poppins', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background: url("src/assets/fondo_pasteles.jpg"); + background-position: center; + + } + + .cuerpo { + transform: translateX(-361px); + } \ No newline at end of file diff --git a/src/Sesion/LoginForm.jsx b/src/Sesion/LoginForm.jsx new file mode 100644 index 0000000..03608cd --- /dev/null +++ b/src/Sesion/LoginForm.jsx @@ -0,0 +1,187 @@ +import React, { useState } from "react"; +import './LoginForm.css'; +import { FaUser, FaLock, FaHome } from "react-icons/fa"; +import { TextField, Button, Box } from "@mui/material"; +import axios from "axios"; +import { useNavigate } from "react-router-dom"; + +import PopupV from "/src/Popups/PopupLoginValido.jsx"; +import PopupIv from "/src/Popups/PopupLoginInvalido.jsx"; +import Swal from 'sweetalert2' + + +function LoginForm(props){ + const navigate = useNavigate(); +const [Cargando, setCargando] = useState(false) +const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '' +}) + +const redirectToRecuperarContraseña = () => { + navigate("/RecuperarContraseña"); + }; + + const redirectToAdminVista = () => { + navigate("/AdminVista"); + }; + + const mostrarAlertaLoginExitoso=(nomb)=>{ + Swal.fire({ + title: "Inicio de sesion Exitoso", + text: "Bienvenido "+nomb+".", + icon: "success", + button: "Aceptar" + + }).then(respuesta=>{ + if(respuesta){ + if(datosFormulario.correo == "admin" && datosFormulario.password == "12345"){ + console.log("asdasddsdasdasdadadsasddasdasdassa"); + redirectToAdminVista(); + }else{ + redirectToHome(); + } + + } + + }) + } + + const mostrarAlertaLoginFallido=()=>{ + Swal.fire({ + title: "Inicio de sesion fallido", + text: "Usuario o Contraseña Incorrecta.", + icon: "error", + button: "Aceptar" + + }); + } + + const mostrarAlertaLoginSinDatos=()=>{ + Swal.fire({ + title: "Inicio de sesion fallido", + text: "Introduzca los datos que se le piden.", + icon: "error", + button: "Aceptar" + + }); + } + +const loginUsuario = async (evento) => { + evento.preventDefault(); + try{ + console.log(datosFormulario) + const response = await axios.post('http://localhost:4567/frontend/login',{datosFormulario}) + console.log(response.data) + console.log("c = " +datosFormulario.correo+" p = "+datosFormulario.password) + if(datosFormulario.correo && datosFormulario.password){ + if (response.data === 'Invalido') { + // Si la respuesta es 'Invalido', limpiar los campos del formulario + mostrarAlertaLoginFallido(); + setDatosFormulario({ + correo: '', + password: '' + }); + + + + } else { + + // Si la respuesta es 'Valido', puedes realizar las acciones deseadas + setNombre(response.data.nombre); + console.log(response.data.nombre); + mostrarAlertaLoginExitoso(response.data.nombre); + //abrirPopupV() + } + }else{ + + mostrarAlertaLoginSinDatos(); + } + + return response.data + } catch(error){ + throw error + } +} + +const [nombre,setNombre]=useState('') + +const [mostrarPopupV, setMostrarPopupV] = useState(false); +const abrirPopupV = () => { + setMostrarPopupV(true); +}; + +const [mostrarPopupIv, setMostrarPopupIv] = useState(false); +const abrirPopupIv = () => { + setMostrarPopupIv(true); +}; + +const cambiosFormulario = (evento) => { + //console.log(evento.target) + const {name,value} = evento.target + setDatosFormulario ({...datosFormulario, [name]: value}) + + setMostrarPopupIv(false); +} + +const redirectToHome = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const redirectToRegistro = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/Registro"); + }; + + return( + <> +
+
+
+ +
+ +
+ +

Inicio

+ + +
+ + +
+
+ + +
+
+ + ¿Contraseña olvidada? +
+ + + + +
+

¿No tienes una cuenta? Register

+
+ + + {mostrarPopupV && setMostrarPopupV(false)} />} + + + {mostrarPopupIv && setMostrarPopupIv(false)} />} + +
+
+
+ + ) + +} + +export default LoginForm; \ No newline at end of file diff --git a/src/Sesion/Recuperar.css b/src/Sesion/Recuperar.css new file mode 100644 index 0000000..14e336d --- /dev/null +++ b/src/Sesion/Recuperar.css @@ -0,0 +1,143 @@ +.wrapper{ + width: 450px; + background: transparent; + border: 2px solid rgba(255, 255, 255, .2); + backdrop-filter: blur(50px); + box-shadow: 0 0 10px rgba(0, 0, 0, .2); + color: #fff; + border-radius: 20px; + padding: 50px 30px; +} + +.wrapper h1{ + font-size: 36px; + text-align: center; +} +.wrapper .label-correo { + margin-top: 10px; + margin-left: 10px; /* Puedes ajustar este valor según sea necesario */ + margin-bottom: -20px; /* Puedes ajustar este valor según sea necesario */ + display: block; /* Asegura que el label se comporte como un bloque */ + font-size: 16px; + +} + +.wrapper .input-box{ + position: relative; + width: 100%; + height: 50px; + margin: 30px 0; +} +.input-box input{ + width: 100%; + height: 100%; + background: transparent; + border: 2px solid rgba(255, 255, 255, .2); + outline: none; + border-radius: 40px; + font-size: 16px; + color: #fff; + padding: 20px 45px 20px 20px; +} + +.input-box input::placeholder{ + color: #fff; +} +.input-box .icon{ + position: absolute; + right: 20px; + top: 50%; + transform: translateY(-50%); + font-size: 16px; +} +.wrapper .remember-forgot{ + display: flex; + justify-content: space-between; + font-size: 14.5px; + margin: -15px 0 15px; +} +.remember-forgot label input{ + accent-color: #fff; + margin-right: 4px; +} +.remember-forgot a{ + color: #fff; + text-decoration: none; +} +.remember-forgot a:hover{ + text-decoration: underline; +} + +.wrapper .boton1{ + display: inline-block; + position: absolute; + background-color: none; + top: 20px; + left: 10px; + width: 45px; + height: 35px; + padding: 0px; + padding-left: 0px; + padding-right: 0px; + font-size: 14px; +} + +.wrapper button{ + width: 100%; + height: 45px; + background: #fff; + border: none; + outline: none; + border-radius: 40px; + box-shadow: 0 0 10px rgba(0, 0, 0, .1); + cursor: pointer; + font-size: 16px; + color: #333; + font-weight: 700; + +} +.wrapper .register-link{ + font-size: 14.5px; + text-align: center; + margin: 20px 0 15px; +} + +.register-link p a{ + color: #fff; + text-decoration: none; + font-weight: 600; +} +.register-link p a:hover { + text-decoration: underline; +} + + +.cuerpo { + width: 135.1%; + background-repeat: no-repeat; + height: 100%; + padding-left: 0%; + background-size: 100% auto; + margin:0; + font-family: 'Poppins', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-position: center; + } + + .cuerpo { + transform: translateX(-361px); + } + .label-correo.desactivado { + color: #999; /* Color de texto desactivado */ + } + + .input-box.desactivado { + background-color: gray; /* Color de fondo desactivado */ + border: 2px solid #ccc; /* Borde desactivado */ + border-radius: 30px; + } \ No newline at end of file diff --git a/src/Sesion/Recuperar/Recuperar.css b/src/Sesion/Recuperar/Recuperar.css new file mode 100644 index 0000000..3511771 --- /dev/null +++ b/src/Sesion/Recuperar/Recuperar.css @@ -0,0 +1,210 @@ +/* POPPINS FONT */ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap'); + +.body-login{ + background: url("/src/assets/fondo_pasteles.jpg"); + background-size: 100%; + background-repeat: no-repeat; + overflow: hidden; + background-attachment: fixed; + display: flex; + height: 100%; + position: relative; + justify-content: center; + margin: 0; + padding: 0; +} + +.wrapper{ + display: flex; + width: 40%; + height: 100vh; + padding-left: 4px; + align-items: center; + justify-content: center; +} + +.link:hover, .active{ + border-bottom: 2px solid #fff; +} + +.btn:hover{ + background: rgba(255, 255, 255, 0.3); +} +#registerBtn{ + margin-left: 15px; +} +.btn.white-btn{ + background: rgba(255, 255, 255, 0.7); +} +.btn.btn.white-btn:hover{ + background: rgba(255, 255, 255, 0.5); +} +.form-box{ + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 512px; + height: 500px; + overflow: hidden; + z-index: 2; + border-radius: 4%; + background: rgba(39, 39, 39, 0.5); +} +.login-container{ + position: absolute; + left: 4px; + width: 500px; + opacity: 1; + display: flex; + flex-direction: column; + transition: .5s ease-in-out; +} +.register-container{ + position: absolute; + right: -520px; + width: 500px; + display: flex; + flex-direction: column; + transition: .5s ease-in-out; + gap: 7px; +} +.password-container{ + position: absolute; + right: -520px; + width: 500px; + display: flex; + flex-direction: column; + transition: .5s ease-in-out; + gap: 7px; +} +.top span{ + color: #fff; + font-size: small; + padding: 10px 0; + display: flex; + justify-content: center; +} +.top2 span{ + color: #fff; + font-size: small; + padding: 10px 0; + display: flex; + justify-content: center; +} +.two span a{ + font-weight: 500; + color: #fff; + margin-left: 5px; +} +.top span a{ + font-weight: 500; + color: #fff; + margin-left: 5px; +} +.top2 span a{ + font-weight: 500; + color: #fff; + margin-left: 5px; +} +.header-login{ + color: #fff; + font-size: 30px; + text-align: center; + padding: 10px 0 30px 0; +} +.two-forms{ + display: flex; + gap: 20px; +} +.input-field{ + font-size: 15px; + background: rgba(255, 255, 255, 0.2); + color: #fff; + height: 50px; + width: 100%; + padding: 0 10px 0 45px; + border: none; + border-radius: 30px; + outline: none; + transition: .2s ease; + margin-bottom: 10px; /*para separar los componentes agregando un margen por debajo*/ +} +.input-field:hover, .input-field:focus{ + background: rgba(255, 255, 255, 0.25); +} +::-webkit-input-placeholder{ + color: #fff; +} +.input-box i{ + position: relative; + margin-top: 10px; + margin-bottom: 10px; + top: -35px; + left: 17px; + color: #fff; +} +.input-box i{ + position: relative; + margin-top: 10px; + margin-bottom: 10px; + top: -35px; + left: 17px; + color: #fff; +} +.submit{ + font-size: 15px; + font-weight: 500; + color: black; + height: 45px; + width: 100%; + border: none; + border-radius: 30px; + outline: none; + background: rgba(255, 255, 255, 0.7); + cursor: pointer; + transition: .3s ease-in-out; +} +.submit:hover{ + background: rgba(255, 255, 255, 0.5); + box-shadow: 1px 5px 7px 1px rgba(0, 0, 0, 0.2); +} +.two-col{ + display: flex; + justify-content: space-between; + color: #fff; + font-size: small; + margin-top: 10px; + margin-bottom: 10px; + margin-left: 10px; +} +.two-col .one{ + display: flex; + gap: 5px; +} +.two label a{ + text-decoration: none; + color: #fff; +} +.two label a:hover{ + text-decoration: underline; +} + +@media only screen and (max-width: 540px) { + .wrapper{ + min-height: 100vh; + } + .form-box{ + width: 100%; + height: 500px; + } + .register-container, .login-container{ + width: 100%; + padding: 0 20px; + } + .register-container .two-forms{ + flex-direction: column; + gap: 0; + } +} \ No newline at end of file diff --git a/src/Sesion/RecuperarContraForm.jsx b/src/Sesion/RecuperarContraForm.jsx new file mode 100644 index 0000000..4681f56 --- /dev/null +++ b/src/Sesion/RecuperarContraForm.jsx @@ -0,0 +1,252 @@ +import React, { useState, useEffect } from "react"; +import './Recuperar.css'; +import { FaUser, FaLock, FaHome } from "react-icons/fa"; +import { TextField, Button, Box } from "@mui/material"; +import axios from "axios"; +import { useNavigate } from "react-router-dom"; +import emailjs from 'emailjs-com'; +import PopupActualizar from "/src/Popups/PopupActualizar"; +import PopupActualizarInv from "/src/Popups/PopupActualizarInv.jsx"; +import PopupV from "/src/Popups/PopupLoginValido.jsx"; +import PopupIv from "/src/Popups/PopupLoginInvalido.jsx"; +import Swal from 'sweetalert2'; + +function RecuperarContra(props) { + const navigate = useNavigate(); + const [Cargando, setCargando] = useState(false); + const [datosFormulario, setDatosFormulario] = useState({ + correo: '', + password: '', + codigo: '' + }); + const [codigoAleatorio, setCodigoAleatorio] = useState(null); + const [mostrarCodigo, setMostrarCodigo] = useState(false); + const [codigoVerificado, setCodigoVerificado] = useState(false); + + useEffect(() => { + const codigo = Math.floor(100000 + Math.random() * 900000); + setCodigoAleatorio(codigo); + console.log("Código aleatorio:", codigo); + }, []); + + const mostrarAlertaCambioContraExitoso = () => { + Swal.fire({ + title: "Cambio de contraseña", + text: "Credenciales actualizadas correctamente", + icon: "success", + button: "Aceptar" + }).then(respuesta => { + if (respuesta) { + redirectToLogin(); + } + }); + }; + + const mostrarAlertaCambioContraFallido = () => { + Swal.fire({ + title: "Correo no encontrado", + text: "El correo que introdujo no existe o se escribió incorrectamente.", + icon: "error", + button: "Aceptar" + }); + }; + + const mostrarAlertaCodigoInvalido = () => { + Swal.fire({ + title: "Código incorrecto", + text: "El código ingresado no es válido. Inténtelo de nuevo.", + icon: "error", + button: "Aceptar" + }); + }; + + const [desactivarCorreo, setDesactivarCorreo] = useState(false); + const [cambio, setCambio] = useState(0); + + const enviarCorreo = (correo, codigo) => { + const serviceID = "service_bx84r3q"; + const templateID = "template_11jpkjs"; + const userID = "AOcEsViQIfZLeg0HL"; + + const templateParams = { + to: correo, + subject: "Recuperación de contraseña", + replyto: "no-reply@example.com", + message: `Su código de verificación es: ${codigo}` + }; + + emailjs.send(serviceID, templateID, templateParams, userID) + .then((response) => { + console.log('Correo enviado', response.status, response.text); + }) + .catch((err) => { + console.error('Error al enviar el correo', err); + }); + }; + + const loginUsuario = async (evento) => { + evento.preventDefault(); + + if (cambio === 0) { + try { + const response = await axios.post('http://localhost:4567/frontend/RecuperarContra', { datosFormulario }); + console.log(response.data); + + if (response.data === 'Usuario encontrado') { + console.log("Sí se encontró"); + enviarCorreo(datosFormulario.correo, codigoAleatorio); // Enviar correo con el código aleatorio + setMostrarCodigo(true); + setDesactivarCorreo(true); + setCambio(1); + } else { + console.log("No se encontró"); + mostrarAlertaCambioContraFallido(); + } + + return response.data; + } catch (error) { + throw error; + } + } else if (cambio === 1) { + if (parseInt(datosFormulario.codigo) === codigoAleatorio) { + setCodigoVerificado(true); + setCambio(2); + } else { + mostrarAlertaCodigoInvalido(); + } + } else if (cambio === 2) { + try { + const response = await axios.post('http://localhost:4567/frontend/ColocarContra2', { datosFormulario }); + console.log(response.data); + console.log(datosFormulario); + enviarCorreo(datosFormulario.correo, codigoAleatorio); // Enviar correo confirmando el cambio de contraseña + mostrarAlertaCambioContraExitoso(); + } catch (error) { + throw error; + } + } + }; + + const [nombre, setNombre] = useState(''); + + const [mostrarPopupActualizarInv, setMostrarPopupActualizarInv] = useState(false); + const abrirPopupActualizarInv = () => { + setMostrarPopupActualizarInv(true); + }; + + const [mostrarPopupVeri, setMostrarPopupVeri] = useState(false); + const abrirPopupVeri = () => { + setMostrarPopupVeri(true); + }; + + const [mostrarPopupV, setMostrarPopupV] = useState(false); + const abrirPopupV = () => { + setMostrarPopupV(true); + }; + + const [mostrarPopupIv, setMostrarPopupIv] = useState(false); + const abrirPopupIv = () => { + setMostrarPopupIv(true); + }; + + const cambiosFormulario = (evento) => { + const { name, value } = evento.target; + setDatosFormulario({ ...datosFormulario, [name]: value }); + setMostrarPopupActualizarInv(false); + }; + + const redirectToHome = () => { + navigate("/"); + }; + + const redirectToLogin = () => { + navigate("/Login"); + }; + + return ( + <> +
+
+
+
+ +
+ +

Recuperar Contraseña

+ + +
+ + +
+ + {mostrarCodigo && ( +
+ +
+ + +
+
+ )} + + {codigoVerificado && ( +
+ +
+ + +
+
+ )} + + + + + {mostrarPopupV && setMostrarPopupV(false)} />} + + + + {mostrarPopupIv && setMostrarPopupIv(false)} />} + + + + {mostrarPopupVeri && setMostrarPopupVeri(false)} />} + + + + {mostrarPopupActualizarInv && setMostrarPopupActualizarInv(false)} />} + + +
+
+
+ + ); +} + +export default RecuperarContra; diff --git a/src/Sesion/Registrar.jsx b/src/Sesion/Registrar.jsx new file mode 100644 index 0000000..986bfac --- /dev/null +++ b/src/Sesion/Registrar.jsx @@ -0,0 +1,183 @@ +import React, { useState } from "react"; +import './LoginForm.css'; +import { FaUser, FaLock, FaHome } from "react-icons/fa"; +import { TextField, Button, Box } from "@mui/material"; +import axios from "axios"; +import { useNavigate } from "react-router-dom"; + +import Swal from 'sweetalert2' +import PopupRegistro from "/src/Popups/PopupRegistro.jsx"; +import PopupRegistroS from "/src/Popups/PopupRsindatos.jsx"; + +function Registrar(props){ + const navigate = useNavigate(); +const [Cargando, setCargando] = useState(false) +const [datosFormulario, setDatosFormulario] = useState( + {correo: '', + password: '', + nombre: '' +}); + + const mostrarAlertaRegistroFallido=()=>{ + Swal.fire({ + title: "Registro Fallido", + text: "Introduzca los datos para poder registrarse.", + icon: "error", + button: "Aceptar" + + }); + } + + const mostrarAlertaRegistroExitoso=()=>{ + Swal.fire({ + title: "Registro Exitoso", + text: "Usuario registrado correctamente.", + icon: "success", + button: "Aceptar" + + }); + } + + const mostrarAlertaCorreoExistente=()=>{ + //console.log(datosFormulario.correo); + Swal.fire({ + title: "Registro Fallido", + text: "El correo "+datosFormulario.correo+" ya ha sido registrado", + icon: "error", + button: "Aceptar" + + }); + } + + + const registrarUsuario = async (evento) => { + evento.preventDefault(); + try{ + if(datosFormulario.correo && datosFormulario.password && datosFormulario.nombre) { + + const response2 = await axios.post('http://localhost:4567/frontend/correoExiste',{datosFormulario}) + console.log(response2.data); + const res = response2.data; + console.log("res: "+res); + + // Verificar si el correo existe + if (res.correoExistente) { + // Hacer algo si el correo existe + mostrarAlertaCorreoExistente(); + setDatosFormulario({ + correo: '', + password: '', + nombre: '' + }); + + } else { + + // Hacer algo en caso de que el correo no existe + + const response = await axios.post('http://localhost:4567/frontend/',{datosFormulario}) + console.log(response.data) + mostrarAlertaRegistroExitoso(); + setDatosFormulario({ + correo: '', + password: '', + nombre: '' + }); + return response.data + } + + }else{ + console.log("si entro"); + mostrarAlertaRegistroFallido(); + setDatosFormulario({ + correo: '', + password: '', + nombre: '' + }); + + return; + } + } catch(error){ + throw error + } +} + +const [mostrarPopupR, setMostrarPopupR] = useState(false); +const abrirPopupR = () => { + setMostrarPopupR(true); +}; + +const [mostrarPopupRs, setMostrarPopupRs] = useState(false); +const abrirPopupRs = () => { + setMostrarPopupRs(true); +}; + +const cambiosFormulario = (evento) => { + //console.log(evento.target) + const {name,value} = evento.target + setDatosFormulario ({...datosFormulario, [name]: value}) + setMostrarPopupR(false); + +} + +const redirectToHome = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/"); + }; + + const redirectToLogin = () => { + // Redirige a la página del hotel cuando se hace clic en el botón + navigate("/Login"); + }; + + return( + <> +
+
+
+ +
+ +
+ +

Registro

+ + +
+ + +
+
+ + +
+
+ + +
+ + + + + + +
+

¿Tienes cuenta? Login

+
+ + {mostrarPopupRs && setMostrarPopupRs(false)} />} + + + {mostrarPopupR && setMostrarPopupR(false)} />} + +
+
+
+ + ) + +} + +export default Registrar; \ No newline at end of file diff --git a/src/assets/Edicion1.jpg b/src/assets/Edicion1.jpg new file mode 100644 index 0000000..8abcf77 Binary files /dev/null and b/src/assets/Edicion1.jpg differ diff --git a/src/assets/Edicion12.jpg b/src/assets/Edicion12.jpg new file mode 100644 index 0000000..824e201 Binary files /dev/null and b/src/assets/Edicion12.jpg differ diff --git a/src/assets/Edicion13.jpg b/src/assets/Edicion13.jpg new file mode 100644 index 0000000..79de260 Binary files /dev/null and b/src/assets/Edicion13.jpg differ diff --git a/src/assets/Edicion14.jpg b/src/assets/Edicion14.jpg new file mode 100644 index 0000000..4d97d70 Binary files /dev/null and b/src/assets/Edicion14.jpg differ diff --git a/src/assets/Edicion15.jpg b/src/assets/Edicion15.jpg new file mode 100644 index 0000000..3eec966 Binary files /dev/null and b/src/assets/Edicion15.jpg differ diff --git a/src/assets/Edicion16.jpg b/src/assets/Edicion16.jpg new file mode 100644 index 0000000..b9cbd2d Binary files /dev/null and b/src/assets/Edicion16.jpg differ diff --git a/src/assets/Edicion2.jpg b/src/assets/Edicion2.jpg new file mode 100644 index 0000000..ac7f548 Binary files /dev/null and b/src/assets/Edicion2.jpg differ diff --git a/src/assets/Edicion21.jpg b/src/assets/Edicion21.jpg new file mode 100644 index 0000000..c1dd29a Binary files /dev/null and b/src/assets/Edicion21.jpg differ diff --git a/src/assets/Edicion3.jpg b/src/assets/Edicion3.jpg new file mode 100644 index 0000000..109eae4 Binary files /dev/null and b/src/assets/Edicion3.jpg differ diff --git a/src/assets/Edicion4.jpg b/src/assets/Edicion4.jpg new file mode 100644 index 0000000..f4c2d88 Binary files /dev/null and b/src/assets/Edicion4.jpg differ diff --git a/src/assets/Edicion5.jpg b/src/assets/Edicion5.jpg new file mode 100644 index 0000000..e5acd1e Binary files /dev/null and b/src/assets/Edicion5.jpg differ diff --git a/src/assets/Edicion6.jpg b/src/assets/Edicion6.jpg new file mode 100644 index 0000000..f4312ea Binary files /dev/null and b/src/assets/Edicion6.jpg differ diff --git a/src/assets/MejoresPasteles.jpg b/src/assets/MejoresPasteles.jpg new file mode 100644 index 0000000..f9a7f18 Binary files /dev/null and b/src/assets/MejoresPasteles.jpg differ diff --git a/src/assets/Pastel-Zanahoria.jpg b/src/assets/Pastel-Zanahoria.jpg new file mode 100644 index 0000000..cca0732 Binary files /dev/null and b/src/assets/Pastel-Zanahoria.jpg differ diff --git a/src/assets/Pastel-fresa-original.png b/src/assets/Pastel-fresa-original.png new file mode 100644 index 0000000..4f30339 Binary files /dev/null and b/src/assets/Pastel-fresa-original.png differ diff --git a/src/assets/Pastel-fresas-arcoiris.png b/src/assets/Pastel-fresas-arcoiris.png new file mode 100644 index 0000000..0cb0b46 Binary files /dev/null and b/src/assets/Pastel-fresas-arcoiris.png differ diff --git a/src/assets/Pastel-fresas-oreo.png b/src/assets/Pastel-fresas-oreo.png new file mode 100644 index 0000000..f541111 Binary files /dev/null and b/src/assets/Pastel-fresas-oreo.png differ diff --git a/src/assets/Pastel-fresas-vainilla.png b/src/assets/Pastel-fresas-vainilla.png new file mode 100644 index 0000000..2f6eac4 Binary files /dev/null and b/src/assets/Pastel-fresas-vainilla.png differ diff --git a/src/assets/ejemplo.jpg b/src/assets/ejemplo.jpg new file mode 100644 index 0000000..dead0b0 Binary files /dev/null and b/src/assets/ejemplo.jpg differ diff --git a/src/assets/fondo_pasteles.jpg b/src/assets/fondo_pasteles.jpg new file mode 100644 index 0000000..a36feda Binary files /dev/null and b/src/assets/fondo_pasteles.jpg differ diff --git a/src/assets/pastel-4-leches.jpg b/src/assets/pastel-4-leches.jpg new file mode 100644 index 0000000..d9426c8 Binary files /dev/null and b/src/assets/pastel-4-leches.jpg differ diff --git a/src/assets/pastel-fondo.jpg b/src/assets/pastel-fondo.jpg new file mode 100644 index 0000000..9273093 Binary files /dev/null and b/src/assets/pastel-fondo.jpg differ diff --git a/src/assets/pastel-moka.jpg b/src/assets/pastel-moka.jpg new file mode 100644 index 0000000..794e516 Binary files /dev/null and b/src/assets/pastel-moka.jpg differ diff --git a/src/assets/pastel-tematico.jpg b/src/assets/pastel-tematico.jpg new file mode 100644 index 0000000..18208a8 Binary files /dev/null and b/src/assets/pastel-tematico.jpg differ diff --git a/src/assets/pastel-texto.jpg b/src/assets/pastel-texto.jpg new file mode 100644 index 0000000..081c371 Binary files /dev/null and b/src/assets/pastel-texto.jpg differ diff --git a/src/assets/pastel-zarza.jpg b/src/assets/pastel-zarza.jpg new file mode 100644 index 0000000..48a7e9f Binary files /dev/null and b/src/assets/pastel-zarza.jpg differ diff --git a/src/assets/pastel1.jpg b/src/assets/pastel1.jpg new file mode 100644 index 0000000..1324fee Binary files /dev/null and b/src/assets/pastel1.jpg differ diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..22c3eba --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..a99eb32 --- /dev/null +++ b/src/index.css @@ -0,0 +1,69 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} + diff --git a/src/main.jsx b/src/main.jsx new file mode 100644 index 0000000..72cd56a --- /dev/null +++ b/src/main.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; +import AppInicio from './AppInicio.jsx' +import AdminVista from './AdminPackages/AdminVista.jsx' +import PersPastel1 from './PersPastel1.jsx' +import Pedidos from './Pedidos.jsx' +import Pasteles from './Pasteles.jsx' +import LoginForm from './Sesion/LoginForm.jsx'; +import RegistrarForm from './Sesion/Registrar.jsx'; +import RecuperarContraForm from './Sesion/RecuperarContraForm.jsx'; +import ChocolateBlanco from './Pasteles/ChocolateBlanco.jsx'; +import PastelMoka from './Pasteles/PastelMoka.jsx'; +import PastelChocolate from './Pasteles/PastelChocolate.jsx'; +import PastelZanahoria from './Pasteles/PastelZanahoria.jsx'; +import PastelFrambuesa from './Pasteles/PastelFrambuesa.jsx'; +import PastelCajeta from './Pasteles/PastelCajeta.jsx'; + +createRoot(document.getElementById('root')).render( + + + + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + }/> + + + , +); + + + + + + + + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +})