From 5f91bc1971156a56cef824be8469fa81e2de8335 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 11:50:23 -0400 Subject: [PATCH 001/101] first commit --- pruebas/01-reading-list/th3alexdev/.gitignore | 24 + pruebas/01-reading-list/th3alexdev/index.html | 13 + .../th3alexdev/package-lock.json | 2256 +++++++++++++++++ .../01-reading-list/th3alexdev/package.json | 24 + .../th3alexdev/postcss.config.js | 6 + .../th3alexdev/tailwind.config.js | 21 + .../01-reading-list/th3alexdev/vite.config.js | 7 + 7 files changed, 2351 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/.gitignore create mode 100644 pruebas/01-reading-list/th3alexdev/index.html create mode 100644 pruebas/01-reading-list/th3alexdev/package-lock.json create mode 100644 pruebas/01-reading-list/th3alexdev/package.json create mode 100644 pruebas/01-reading-list/th3alexdev/postcss.config.js create mode 100644 pruebas/01-reading-list/th3alexdev/tailwind.config.js create mode 100644 pruebas/01-reading-list/th3alexdev/vite.config.js diff --git a/pruebas/01-reading-list/th3alexdev/.gitignore b/pruebas/01-reading-list/th3alexdev/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/.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/pruebas/01-reading-list/th3alexdev/index.html b/pruebas/01-reading-list/th3alexdev/index.html new file mode 100644 index 000000000..fbe1baf42 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/index.html @@ -0,0 +1,13 @@ + + + + + + + Bukstore + + +
+ + + diff --git a/pruebas/01-reading-list/th3alexdev/package-lock.json b/pruebas/01-reading-list/th3alexdev/package-lock.json new file mode 100644 index 000000000..c2b8ddbf3 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/package-lock.json @@ -0,0 +1,2256 @@ +{ + "name": "th3alexdev", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "th3alexdev", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "autoprefixer": "^10.4.15", + "postcss": "^8.4.27", + "tailwindcss": "^3.3.3", + "vite": "^4.1.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "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.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", + "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "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.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001520", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001520.tgz", + "integrity": "sha512-tahF5O9EiiTzwTUqAeFjIZbn4Dnqxzz7ktrgGlMYNLH43Ul26IgTMH/zvL3DG0lZxBYnlT04axvInszUsZULdA==", + "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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "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/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.490", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.490.tgz", + "integrity": "sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "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/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "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-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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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/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/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/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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==", + "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/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "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/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-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "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-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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "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/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/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "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/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/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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/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": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/pruebas/01-reading-list/th3alexdev/package.json b/pruebas/01-reading-list/th3alexdev/package.json new file mode 100644 index 000000000..bcb62cc20 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/package.json @@ -0,0 +1,24 @@ +{ + "name": "th3alexdev", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.27", + "@types/react-dom": "^18.0.10", + "@vitejs/plugin-react": "^3.1.0", + "autoprefixer": "^10.4.15", + "postcss": "^8.4.27", + "tailwindcss": "^3.3.3", + "vite": "^4.1.0" + } +} diff --git a/pruebas/01-reading-list/th3alexdev/postcss.config.js b/pruebas/01-reading-list/th3alexdev/postcss.config.js new file mode 100644 index 000000000..2e7af2b7f --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/pruebas/01-reading-list/th3alexdev/tailwind.config.js b/pruebas/01-reading-list/th3alexdev/tailwind.config.js new file mode 100644 index 000000000..c7bbbf600 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/tailwind.config.js @@ -0,0 +1,21 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: { + fontFamily: { + body: ['"Monteserrat"', 'sans-serif'] + }, + colors: { + 'card-background': '#252429', + 'text': '#FFF', + 'background': '#EDEDED', + 'primary': '#17171D', + } + }, + }, + plugins: [], +} \ No newline at end of file diff --git a/pruebas/01-reading-list/th3alexdev/vite.config.js b/pruebas/01-reading-list/th3alexdev/vite.config.js new file mode 100644 index 000000000..5a33944a9 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/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()], +}) From 45a3958a6bf48ae5f737997811d9078899a3909b Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:11:48 -0400 Subject: [PATCH 002/101] Add icons --- pruebas/01-reading-list/th3alexdev/public/search.svg | 1 + pruebas/01-reading-list/th3alexdev/public/vite.svg | 1 + 2 files changed, 2 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/public/search.svg create mode 100644 pruebas/01-reading-list/th3alexdev/public/vite.svg diff --git a/pruebas/01-reading-list/th3alexdev/public/search.svg b/pruebas/01-reading-list/th3alexdev/public/search.svg new file mode 100644 index 000000000..1ef5dcff9 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/public/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pruebas/01-reading-list/th3alexdev/public/vite.svg b/pruebas/01-reading-list/th3alexdev/public/vite.svg new file mode 100644 index 000000000..e7b8dfb1b --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file From c72e5fa27cb199ba46be38570e420e624bc7ca07 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:29:20 -0400 Subject: [PATCH 003/101] Add initial React setup and BooksProvider context --- pruebas/01-reading-list/th3alexdev/src/main.jsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/main.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/main.jsx b/pruebas/01-reading-list/th3alexdev/src/main.jsx new file mode 100644 index 000000000..b277f52b4 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/main.jsx @@ -0,0 +1,13 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import { BooksProvider } from './context/contextBooksProvider' +import App from './App' +import './css/index.css' + +const root = ReactDOM.createRoot(document.getElementById('root')); + +root.render( + + + , +) From 42c8dd45dbfc44f61e7ed44018c7899735720787 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:30:25 -0400 Subject: [PATCH 004/101] Implement BooksProvider context for managing book data --- .../src/context/contextBooksProvider.jsx | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx b/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx new file mode 100644 index 000000000..c941359a7 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx @@ -0,0 +1,49 @@ +import { useState, useEffect, createContext } from "react"; +import { getBooks } from "../services/getBooks"; + +export const BooksContext = createContext(); + +export function BooksProvider({ children }) { + const [books, setBooks] = useState([]); + const [loading, setLoading] = useState(false); + + useEffect(() => { + const initBooks = async () => { + + try { + setLoading(true); + + const query = await getBooks(); + + const mappedBooks = query?.library?.map(({ book }) => { + return { + title: book.title, + pages: book.pages, + genre: book.genre, + cover: book.cover, + synopsis: book.synopsis, + year: book.year, + ISBN: book.ISBN, + author: { + name: book.author.name, + otherBooks: book.author.otherBooks, + }, + }; + }); + setBooks(mappedBooks); + } catch (e) { + console.error("murió: ", e); + console.log('no cargó xd') + + } finally { + setLoading(false); + } + }; + + initBooks(); + }, []); + + return ( + {children} + ); +} From 78603bc78ba295ff8bd37e2aeaca3180796d8972 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:31:32 -0400 Subject: [PATCH 005/101] Implement FiltersProvider context for managing book filters --- .../src/context/contextFiltersProvider.jsx | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx b/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx new file mode 100644 index 000000000..9a97e83e9 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx @@ -0,0 +1,69 @@ +import { createContext, useState, useContext, useEffect } from 'react'; +import { BooksContext } from './contextBooksProvider'; + +export const FiltersContext = createContext(); + +export default function FiltersProvider({ children }) { + const { books } = useContext(BooksContext); + + const [filters, setFilters] = useState({ + sortByTitle: '', + sortByPages: false, + genre: '', + genres: [], + maxPosiblePages: 0, + pages: { + minPages: 10, + maxPages: 0, + }, + }); + + useEffect(() => { + if (!books || !books.length) return; + + const getUniqueGenres = () => { + const allGenres = Array.from(new Set(books?.map((book) => book.genre))); + + return allGenres; + }; + + const getBookWithMorePages = () => { + const bookWithMorePages = books?.reduce((prevBook, currentBook) => { + return prevBook.pages > currentBook.pages ? prevBook : currentBook; + }); + + return bookWithMorePages.pages; + }; + + setFilters((prevFilters) => ({ + ...prevFilters, + genres: getUniqueGenres(), + maxPosiblePages: getBookWithMorePages(), + pages: { + minPages: 10, + maxPages: getBookWithMorePages(), + }, + })); + }, [books]); + + const { sortByTitle, genre, pages } = filters; + + const filter = books?.filter((book) => { + if ( + (!genre || book.genre === genre) && + (book.title?.toLowerCase().includes(sortByTitle)) && + book.pages <= pages.maxPages + ) + return true; + + return false; + }); + + const filteredBooks = filter; + + return ( + + {children} + + ); +} From a537221073ec9a1c95f1c92dd07a2b8b5faec791 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:32:58 -0400 Subject: [PATCH 006/101] Create main App component with FiltersProvider and basic layout --- .../01-reading-list/th3alexdev/src/App.jsx | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/App.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/App.jsx b/pruebas/01-reading-list/th3alexdev/src/App.jsx new file mode 100644 index 000000000..e091d37b8 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/App.jsx @@ -0,0 +1,20 @@ +import React from "react"; +import ListOfBooks from "./components/ListOfBooks"; +import Filters from "./components/Filters"; +import FiltersProvider from "./context/contextFiltersProvider"; +import Header from "./components/Header"; + +export default function App() { + + return ( + <> + +
+
+ + +
+ + + ) +} \ No newline at end of file From ae3807fdb3e5ff0fdedd8410a83dcde8214f6f7d Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:33:48 -0400 Subject: [PATCH 007/101] Add sample book data --- .../th3alexdev/src/data/books.json | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/data/books.json diff --git a/pruebas/01-reading-list/th3alexdev/src/data/books.json b/pruebas/01-reading-list/th3alexdev/src/data/books.json new file mode 100644 index 000000000..330366fd4 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/data/books.json @@ -0,0 +1,213 @@ +{ + "library": [ + { + "book": { + "title": "El Señor de los Anillos", + "pages": 1200, + "genre": "Fantasía", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1566425108i/33.jpg", + "synopsis": "Una aventura épica en un mundo de fantasía llamado la Tierra Media.", + "year": 1954, + "ISBN": "978-0618640157", + "author": { + "name": "J.R.R. Tolkien", + "otherBooks": ["El Hobbit", "El Silmarillion"] + } + } + }, + { + "book": { + "title": "Juego de Tronos", + "pages": 694, + "genre": "Fantasía", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1273763400i/8189620.jpg", + "synopsis": "En un reino donde las estaciones duran años, una batalla épica por el trono se desarrolla.", + "year": 1996, + "ISBN": "978-0553103540", + "author": { + "name": "George R. R. Martin", + "otherBooks": [ + "Choque de Reyes", + "Tormenta de Espadas", + "Festín de Cuervos" + ] + } + } + }, + { + "book": { + "title": "Harry Potter y la piedra filosofal", + "pages": 223, + "genre": "Fantasía", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1550337333i/15868.jpg", + "synopsis": "Un niño descubre que es un mago y comienza una aventura en una escuela de magia.", + "year": 1997, + "ISBN": "978-0747532699", + "author": { + "name": "J.K. Rowling", + "otherBooks": [ + "Harry Potter y la cámara secreta", + "Harry Potter y el prisionero de Azkaban", + "Harry Potter y el cáliz de fuego" + ] + } + } + }, + { + "book": { + "title": "1984", + "pages": 328, + "genre": "Ciencia ficción", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1657781256i/61439040.jpg", + "synopsis": "Una inquietante visión de un futuro distópico y totalitario.", + "year": 1949, + "ISBN": "978-0451524935", + "author": { + "name": "George Orwell", + "otherBooks": ["Rebelión en la granja"] + } + } + }, + { + "book": { + "title": "Apocalipsis Zombie", + "pages": 444, + "genre": "Zombies", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1422626176i/24762432.jpg", + "synopsis": "Un gallego se queda en casa en pleno apocalipsis zombie y acaba casi salvando el mundo", + "year": 2001, + "ISBN": "978-4444532611", + "author": { + "name": "Manel Loreiro", + "otherBooks": [] + } + } + }, + { + "book": { + "title": "Dune", + "pages": 412, + "genre": "Ciencia ficción", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1555447414i/44767458.jpg", + "synopsis": "En el inhóspito planeta desértico de Arrakis, una gran intriga política y familiar se desarrolla.", + "year": 1965, + "ISBN": "978-0441172719", + "author": { + "name": "Frank Herbert", + "otherBooks": ["El mesías de Dune", "Hijos de Dune"] + } + } + }, + { + "book": { + "title": "La Guía del Autoestopista Galáctico", + "pages": 216, + "genre": "Ciencia ficción", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1653311117i/6691227.jpg", + "synopsis": "Un viaje absurdo y cómico por el espacio, con toallas.", + "year": 1979, + "ISBN": "978-0345391803", + "author": { + "name": "Douglas Adams", + "otherBooks": [ + "El restaurante del fin del mundo", + "La vida, el universo y todo lo demás" + ] + } + } + }, + { + "book": { + "title": "Neuromante", + "pages": 271, + "genre": "Ciencia ficción", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1554437249i/6088007.jpg", + "synopsis": "Una visión profética de la ciber-realidad y la inteligencia artificial.", + "year": 1984, + "ISBN": "978-0441569595", + "author": { + "name": "William Gibson", + "otherBooks": ["Conde Cero", "Mona Lisa Acelerada"] + } + } + }, + { + "book": { + "title": "Fahrenheit 451", + "pages": 249, + "genre": "Ciencia ficción", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1383718290i/13079982.jpg", + "synopsis": "Una sociedad futura donde los libros están prohibidos y 'bomberos' queman cualquier libro que encuentren.", + "year": 1953, + "ISBN": "978-1451673319", + "author": { + "name": "Ray Bradbury", + "otherBooks": ["Crónicas marcianas", "El hombre ilustrado"] + } + } + }, + { + "book": { + "title": "El resplandor", + "pages": 688, + "genre": "Terror", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1641398308i/60038757.jpg", + "synopsis": "Una familia se muda a un hotel aislado para el invierno donde una presencia siniestra influye en el padre hacia la violencia.", + "year": 1977, + "ISBN": "978-0307743657", + "author": { + "name": "Stephen King", + "otherBooks": ["Carrie", "It"] + } + } + }, + { + "book": { + "title": "Drácula", + "pages": 418, + "genre": "Terror", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1387151694i/17245.jpg", + "synopsis": "La historia del infame conde Drácula y su intento de mudarse de Transilvania a Inglaterra.", + "year": 1897, + "ISBN": "978-0486411095", + "author": { + "name": "Bram Stoker", + "otherBooks": [ + "La joya de las siete estrellas", + "La madriguera del gusano blanco" + ] + } + } + }, + { + "book": { + "title": "Frankenstein", + "pages": 280, + "genre": "Terror", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1669159060i/63631742.jpg", + "synopsis": "Un científico obsesionado crea una criatura viva a partir de partes de cuerpos robadas, con consecuencias desastrosas.", + "year": 1818, + "ISBN": "978-0486282114", + "author": { + "name": "Mary Shelley", + "otherBooks": ["El último hombre", "Valperga"] + } + } + }, + { + "book": { + "title": "La llamada de Cthulhu", + "pages": 43, + "genre": "Terror", + "cover": "https://images-na.ssl-images-amazon.com/images/S/compressed.photo.goodreads.com/books/1485924654i/34094154.jpg", + "synopsis": "La historia de un monstruo ancestral que amenaza con revivir y dominar el mundo.", + "year": 1928, + "ISBN": "978-1542461690", + "author": { + "name": "H.P. Lovecraft", + "otherBooks": ["El horror de Dunwich", "En las montañas de la locura"] + } + } + } + ] +} From ac0a725950d8038348c3d845cd3bd75ad2fe6162 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:34:24 -0400 Subject: [PATCH 008/101] Add additional books data --- .../th3alexdev/src/data/newBooks.json | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/data/newBooks.json diff --git a/pruebas/01-reading-list/th3alexdev/src/data/newBooks.json b/pruebas/01-reading-list/th3alexdev/src/data/newBooks.json new file mode 100644 index 000000000..087b95980 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/data/newBooks.json @@ -0,0 +1,128 @@ +{ + "library": [ + { + "book": { + "title": "Don Quijote de la Mancha", + "pages": 1560, + "genre": "Aventuras", + "cover": "https://m.media-amazon.com/images/I/41iPgMDv8TL._SY291_BO1,204,203,200_QL40_FMwebp_.jpg", + "synopsis": "Don Quijote, un caballero enloquecido por la lectura, busca aventuras y enfrenta molinos como dragones en una sátira épica.", + "year": 2022, + "ISBN": "978-8417958596", + "author": { + "name": "Miguel de Cervantes", + "otherBooks": ["La Galatea", "El licenciado Vidriera"] + } + } + }, + { + "book": { + "title": "La Isla del Tesoro", + "pages": 283, + "genre": "Aventuras", + "cover": "https://imagessl2.casadellibro.com/a/l/t7/02/9788408260202.jpg", + "synopsis": "Un joven y una tripulación buscan un tesoro pirata en una isla desierta, enfrentando traiciones y peligros en el camino.", + "year": 2022, + "ISBN": "978-8408260202", + "author": { + "name": "Robert Louis Stevenson", + "otherBooks": [] + } + } + }, + { + "book": { + "title": "Las aventuras de Tom Sawyer", + "pages": 320, + "genre": "Ciencia ficción", + "cover": "https://imagessl1.casadellibro.com/a/l/t7/71/9788418395871.jpg", + "synopsis": "Las travesuras de Tom Sawyer, un niño travieso del Mississippi, y sus amigos en una pequeña ciudad del siglo XIX.", + "year": 2021, + "ISBN": "978-8418395871", + "author": { + "name": "Mark Twain", + "otherBooks": [] + } + } + }, + { + "book": { + "title": "El Resplandor", + "pages": 688, + "genre": "Terror", + "cover": "https://imagessl9.casadellibro.com/a/l/t7/19/9788466357319.jpg", + "synopsis": "Jack Torrance, en busca de una nueva vida como cuidador de un hotel, se enfrenta a horrores sobrenaturales que desencadenan su propia oscuridad.", + "year": 2020, + "ISBN": "978-84663573191", + "author": { + "name": "Stephen King", + "otherBooks": ["It", "Carrie", "Misery"] + } + } + }, + { + "book": { + "title": "Guerra Mundial Z", + "pages": 472, + "genre": "Zombies", + "cover": "https://imagessl4.casadellibro.com/a/l/t7/24/9788490624524.jpg", + "synopsis": "Narra una lucha global desesperada contra una pandemia zombi a través de relatos testimoniales.", + "year": 2020, + "ISBN": "978-8490624524", + "author": { + "name": "Stephen King", + "otherBooks": ["It", "Carrie", "Misery"] + } + } + }, + { + "book": { + "title": "La Vuelta al Mundo en 80 Días", + "pages": 472, + "genre": "Aventuras", + "cover": "https://imagessl5.casadellibro.com/a/l/t7/95/9788469836095.jpg", + "synopsis": "Phileas Fogg y Passepartout viajan en una aventura global, desafiando el tiempo y obstáculos para ganar una apuesta audaz.", + "year": 2018, + "ISBN": "978-8469836095", + "author": { + "name": "Julio Verne", + "otherBooks": [ + "Viaje al centro de la Tierra", + "La isla misteriosa", + "De la Tierra a la luna" + ] + } + } + }, + { + "book": { + "title": "El Exorcista", + "pages": 376, + "genre": "Terror", + "cover": "https://imagessl3.casadellibro.com/a/l/t7/03/9788413145303.jpg", + "synopsis": "Un inquietante relato donde una madre lucha por salvar a su hija poseída por una presencia demoníaca.", + "year": 2023, + "ISBN": "978-8413145303", + "author": { + "name": "William Peter Blatty", + "otherBooks": ["Legión", "Dimiter"] + } + } + }, + { + "book": { + "title": "Juego de Tronos", + "pages": 895, + "genre": "Ciencia ficción", + "cover": "https://imagessl4.casadellibro.com/a/l/t7/24/9788401032424.jpg", + "synopsis": "Intrigas, traiciones y dragones en lucha por el poder mientras los personajes luchan por el control del trono de hierro.", + "year": 2023, + "ISBN": "978-8401032424", + "author": { + "name": "George R. R. Martin", + "otherBooks": ["Choque de reyes", "Tormenta de espadas"] + } + } + } + ] +} From b5918720130f295571d1ff6a6526c4e329dff79e Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:35:19 -0400 Subject: [PATCH 009/101] Create service to fetch book data --- .../th3alexdev/src/services/getBooks.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/services/getBooks.js diff --git a/pruebas/01-reading-list/th3alexdev/src/services/getBooks.js b/pruebas/01-reading-list/th3alexdev/src/services/getBooks.js new file mode 100644 index 000000000..7a9f6f983 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/services/getBooks.js @@ -0,0 +1,14 @@ +import staticBooks from "./../data/books.json"; +import additionalBooks from "./../data/newBooks.json"; + +export async function getBooks() { + const mergedLibrary = staticBooks.library.concat(additionalBooks.library); + const books = { library: mergedLibrary }; + + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve(books); + reject(new Error('La petición falló')); + }, 500); + }); +} \ No newline at end of file From ac0c14a40bddb0691354cb29ee81901dd8bb006b Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:36:34 -0400 Subject: [PATCH 010/101] Create component for search books --- .../th3alexdev/src/components/Header.jsx | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/components/Header.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx new file mode 100644 index 000000000..dada241dd --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx @@ -0,0 +1,52 @@ +import { useContext, useRef } from 'react'; +import { FiltersContext } from '../context/contextFiltersProvider'; +import { SearchIcon, CloseIcon } from './Icons'; + +export default function Header() { + const searchInputRef = useRef(); + const { filters, setFilters } = useContext(FiltersContext); + + const { sortByTitle } = filters; + + const removeSortByTitle = () => { + setFilters({ ...filters, sortByTitle: '' }); + searchInputRef.current.value = '' + }; + + return ( + <> +
+
{ + e.preventDefault(); + }} + > +
+ { + setFilters({ ...filters, sortByTitle: e.target.value }); + }} + ref={searchInputRef} + /> + +
+
+
+ + ); +} From ec042d35854b40209678202eeb99e3f5dd39ae07 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:37:36 -0400 Subject: [PATCH 011/101] Create component for displaying filtered book list --- .../th3alexdev/src/components/ListOfBooks.jsx | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx new file mode 100644 index 000000000..a6e33b2a3 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx @@ -0,0 +1,57 @@ +import { useContext } from "react"; +import { FiltersContext } from "../context/contextFiltersProvider"; +import { BooksContext } from "../context/contextBooksProvider"; +import Loader from "./Loader"; + +export default function ListOfBooks() { + const { filters, filteredBooks } = useContext(FiltersContext); + const { loading } = useContext(BooksContext); + + const { sortByPages } = filters; + + return ( + <> +
+ {loading ? ( + + ) : ( +
    + {filteredBooks?.map( + ({ title, cover, ISBN, author, year, pages }) => ( +
  • + {title} +
    +

    + {title} +

    +

    {author.name}

    +
    +

    {year}

    +

    + {pages} pág. +

    +
    +
    +
  • + ) + )} +
+ )} +
+ + ); +} From 7c8afc11a2f43a39f85e2b5bd99d9f27d826fb71 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:40:34 -0400 Subject: [PATCH 012/101] Add custom styles --- .../th3alexdev/src/css/index.css | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/css/index.css diff --git a/pruebas/01-reading-list/th3alexdev/src/css/index.css b/pruebas/01-reading-list/th3alexdev/src/css/index.css new file mode 100644 index 000000000..4e9fb4dfc --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/css/index.css @@ -0,0 +1,44 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + background-color: #17171D; + color: #FFF; + color-scheme: dark; + font-family: 'General Sans', sans-serif; +} + +* { + scrollbar-gutter: stable; + /* outline: 1px solid #ffffff33; */ +} + +@layer components { + .filter-pill { + @apply px-1 text-base opacity-60 hover:opacity-100 transition-opacity flex items-center gap-1; + } +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type=number] { + -moz-appearance:textfield; /* Firefox */ +} + +::-webkit-scrollbar { + width: 16px; + height: 100vh; +} + +::-webkit-scrollbar-thumb { + background-color: #747377; +} + +::-webkit-scrollbar-track { + background-color: #1a1920; +} \ No newline at end of file From 18fc7c8231160dc59472e107067cfa49aa206f47 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:41:25 -0400 Subject: [PATCH 013/101] Add loader styles --- .../th3alexdev/src/css/loader.module.css | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/css/loader.module.css diff --git a/pruebas/01-reading-list/th3alexdev/src/css/loader.module.css b/pruebas/01-reading-list/th3alexdev/src/css/loader.module.css new file mode 100644 index 000000000..29a21555c --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/css/loader.module.css @@ -0,0 +1,19 @@ +.loader { + width: 48px; + height: 48px; + border: 5px solid #fff; + border-bottom-color: transparent; + border-radius: 50%; + display: inline-block; + box-sizing: border-box; + animation: rotation 1s linear infinite; +} + +@keyframes rotation { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} From bb02334b5f2428a4303f7369f1c60ea3ce3dfc29 Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 17 Aug 2023 22:42:27 -0400 Subject: [PATCH 014/101] Update configuration for color scheme --- pruebas/01-reading-list/th3alexdev/tailwind.config.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/tailwind.config.js b/pruebas/01-reading-list/th3alexdev/tailwind.config.js index c7bbbf600..d196d61b6 100644 --- a/pruebas/01-reading-list/th3alexdev/tailwind.config.js +++ b/pruebas/01-reading-list/th3alexdev/tailwind.config.js @@ -12,8 +12,9 @@ export default { colors: { 'card-background': '#252429', 'text': '#FFF', - 'background': '#EDEDED', - 'primary': '#17171D', + 'background': '#17171D', + 'primary': '#4B7FF2', + 'secondary': '#FFD440' } }, }, From 3cb423818ae79fe9daca86c6e70c8e6d7627f22e Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 18 Aug 2023 13:09:03 -0400 Subject: [PATCH 015/101] Add UserSavedBooks component and useSidebar hook --- pruebas/01-reading-list/th3alexdev/src/App.jsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/App.jsx b/pruebas/01-reading-list/th3alexdev/src/App.jsx index e091d37b8..089c1d236 100644 --- a/pruebas/01-reading-list/th3alexdev/src/App.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/App.jsx @@ -3,18 +3,22 @@ import ListOfBooks from "./components/ListOfBooks"; import Filters from "./components/Filters"; import FiltersProvider from "./context/contextFiltersProvider"; import Header from "./components/Header"; +import UserSavedBooks from "./components/UserSavedBooks"; +import { useSidebar } from "./hooks/useSidebar"; export default function App() { + const [showSidebar, toggleSidebar] = useSidebar(); return ( <> -
-
- - +
+
+ + +
- ) -} \ No newline at end of file + ); +} From f0d4093c4aa67d5d4de30992342ba683121d9289 Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 18 Aug 2023 13:09:47 -0400 Subject: [PATCH 016/101] Update component styles --- .../th3alexdev/src/components/ListOfBooks.jsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx index a6e33b2a3..b4e2d0fde 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx @@ -2,6 +2,7 @@ import { useContext } from "react"; import { FiltersContext } from "../context/contextFiltersProvider"; import { BooksContext } from "../context/contextBooksProvider"; import Loader from "./Loader"; +import { AddBookIcon } from "./Icons"; export default function ListOfBooks() { const { filters, filteredBooks } = useContext(FiltersContext); @@ -19,13 +20,18 @@ export default function ListOfBooks() { {filteredBooks?.map( ({ title, cover, ISBN, author, year, pages }) => (
  • + {title}

    {author.name}

    -

    {year}

    +

    {year}

    Date: Fri, 18 Aug 2023 13:11:03 -0400 Subject: [PATCH 017/101] Add custom hook for managing sidebar state --- .../01-reading-list/th3alexdev/src/hooks/useSidebar.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/hooks/useSidebar.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/hooks/useSidebar.jsx b/pruebas/01-reading-list/th3alexdev/src/hooks/useSidebar.jsx new file mode 100644 index 000000000..81863ed1e --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/hooks/useSidebar.jsx @@ -0,0 +1,9 @@ +import { useState } from "react"; + +export const useSidebar = () => { + const [showSidebar, setShowSidebar] = useState(false); + + const toggleSidebar = () => setShowSidebar(!showSidebar); + + return [showSidebar, toggleSidebar]; +}; From 9e998a0a84a3057b01d1d91e1a03d171ba7a8fdd Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 18 Aug 2023 13:12:14 -0400 Subject: [PATCH 018/101] Add Loader component --- .../01-reading-list/th3alexdev/src/components/Loader.jsx | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/components/Loader.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Loader.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Loader.jsx new file mode 100644 index 000000000..cb119647c --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/components/Loader.jsx @@ -0,0 +1,9 @@ +import styles from "./../css/loader.module.css"; + +export default function Loader() { + return ( +

    + +
    + ); +} From 094b04f03f5ffb762c364aa51e38c97a52907805 Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 18 Aug 2023 13:13:18 -0400 Subject: [PATCH 019/101] Add icon components --- .../th3alexdev/src/components/Icons.jsx | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx new file mode 100644 index 000000000..2a938a304 --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx @@ -0,0 +1,83 @@ +export function CloseIcon() { + return ( + + + + ); +} + +export function SearchIcon() { + return ( + + + + ); +} + +export function FilterIcon() { + return ( + + + + ); +} + +export function AddBookIcon() { + return ( + + + + ); +} + +export function SavedBooksIconRegular() { + return ( + + + + ); +} + +export function SavedBooksIconSolid() { + return ( + + + + ); +} From b857818412555d3e94dc36f3bfed20de5e998569 Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 18 Aug 2023 13:16:34 -0400 Subject: [PATCH 020/101] Implement FIlters component with page range and genre filtering --- .../th3alexdev/src/components/Filters.jsx | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx new file mode 100644 index 000000000..e0f32038d --- /dev/null +++ b/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx @@ -0,0 +1,122 @@ +import { useContext, useState, useRef } from "react"; +import { FiltersContext } from "../context/contextFiltersProvider"; +import Brand from "./Brand"; +import { FilterIcon } from "./Icons"; + +export default function Filters() { + const numOfPagesInput = useRef(); + const numOfPagesRange = useRef(); + + const { filters, setFilters } = useContext(FiltersContext); + + const { maxPosiblePages, sortByPages, pages } = filters; + const { minPages, maxPages } = pages; + + const handleChangeRange = (e) => { + setFilters({ + ...filters, + sortByPages: true, + pages: { maxPages: e.target.value }, + }); + numOfPagesInput.current.value = e.target.value; + }; + + const handleSetRange = (e) => { + setFilters({ + ...filters, + sortByPages: true, + pages: { maxPages: e.target.value }, + }); + numOfPagesRange.current.value = e.target.value; + }; + + const removeRange = () => { + setFilters({ + ...filters, + sortByPages: false, + pages: { maxPages: maxPosiblePages }, + }); + numOfPagesRange.current.value = maxPosiblePages; + }; + + return ( +
    +
    + +
    +
    e.preventDefault}> + + handleChangeRange(e)} + ref={numOfPagesRange} + /> +
    + + handleSetRange(e)} + ref={numOfPagesInput} + /> + + +
    +
    +
    +
    +

    Por género

    +
      + {filters.genres.map((genre) => ( +
    • + +
    • + ))} +
    +
    +
    +
    + ); +} From 164cfe4e444e0d5b6a0cea6520dceae8dd7c559d Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 18 Aug 2023 13:18:42 -0400 Subject: [PATCH 021/101] Add saved books icon and sidebar toggle functionality --- .../th3alexdev/src/components/Header.jsx | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx index dada241dd..1796e43a0 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/Header.jsx @@ -1,31 +1,32 @@ -import { useContext, useRef } from 'react'; -import { FiltersContext } from '../context/contextFiltersProvider'; -import { SearchIcon, CloseIcon } from './Icons'; +import { useContext, useRef } from "react"; +import { FiltersContext } from "../context/contextFiltersProvider"; +import { SearchIcon, CloseIcon } from "./Icons"; +import { SavedBooksIconRegular, SavedBooksIconSolid } from "./Icons"; -export default function Header() { +export default function Header({showSidebar, toggleSidebar}) { const searchInputRef = useRef(); const { filters, setFilters } = useContext(FiltersContext); const { sortByTitle } = filters; const removeSortByTitle = () => { - setFilters({ ...filters, sortByTitle: '' }); - searchInputRef.current.value = '' + setFilters({ ...filters, sortByTitle: "" }); + searchInputRef.current.value = ""; }; return ( <> -
    +
    { e.preventDefault(); }} > -
    +
    { setFilters({ ...filters, sortByTitle: e.target.value }); }} @@ -33,7 +34,7 @@ export default function Header() { />
    +
    + + 0 + + +
    ); From 1254109ebb81d1ccba445c66c9d2b31a8c0ee318 Mon Sep 17 00:00:00 2001 From: AleKs Date: Sat, 19 Aug 2023 22:19:38 -0400 Subject: [PATCH 022/101] Add useEffect to control body overflow based on sidebar visibility --- pruebas/01-reading-list/th3alexdev/src/App.jsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/App.jsx b/pruebas/01-reading-list/th3alexdev/src/App.jsx index 089c1d236..9a6c1eeb9 100644 --- a/pruebas/01-reading-list/th3alexdev/src/App.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/App.jsx @@ -1,20 +1,25 @@ -import React from "react"; +import React, { useEffect } from "react"; import ListOfBooks from "./components/ListOfBooks"; import Filters from "./components/Filters"; import FiltersProvider from "./context/contextFiltersProvider"; import Header from "./components/Header"; -import UserSavedBooks from "./components/UserSavedBooks"; +import Sidebar from "./components/Sidebar"; import { useSidebar } from "./hooks/useSidebar"; export default function App() { const [showSidebar, toggleSidebar] = useSidebar(); + useEffect(() => { + if(showSidebar) document.body.style.overflowY = 'hidden'; + else document.body.style.overflowY = 'auto'; + }, [showSidebar]); + return ( <>
    - +
    From ee4ab6267a8cfb4bdf5c98f8deb862add8bdf20a Mon Sep 17 00:00:00 2001 From: AleKs Date: Sat, 19 Aug 2023 22:20:20 -0400 Subject: [PATCH 023/101] Refactor component to use custom hook for range handling --- .../th3alexdev/src/components/Filters.jsx | 47 ++++++------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx index e0f32038d..f5aeceeed 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx @@ -1,7 +1,8 @@ -import { useContext, useState, useRef } from "react"; +import { useContext, useRef } from "react"; import { FiltersContext } from "../context/contextFiltersProvider"; -import Brand from "./Brand"; import { FilterIcon } from "./Icons"; +import { useFilters } from "../hooks/useFilters"; +import Brand from "./Brand"; export default function Filters() { const numOfPagesInput = useRef(); @@ -12,32 +13,10 @@ export default function Filters() { const { maxPosiblePages, sortByPages, pages } = filters; const { minPages, maxPages } = pages; - const handleChangeRange = (e) => { - setFilters({ - ...filters, - sortByPages: true, - pages: { maxPages: e.target.value }, - }); - numOfPagesInput.current.value = e.target.value; - }; - - const handleSetRange = (e) => { - setFilters({ - ...filters, - sortByPages: true, - pages: { maxPages: e.target.value }, - }); - numOfPagesRange.current.value = e.target.value; - }; - - const removeRange = () => { - setFilters({ - ...filters, - sortByPages: false, - pages: { maxPages: maxPosiblePages }, - }); - numOfPagesRange.current.value = maxPosiblePages; - }; + const [handleChangeRange, handleSetRange, removeRange] = useFilters({ + numOfPagesInput, + numOfPagesRange, + }); return (
    @@ -45,9 +24,9 @@ export default function Filters() {
    e.preventDefault}> - +

    + +

    handleChangeRange(e)} ref={numOfPagesRange} /> @@ -79,7 +58,9 @@ export default function Filters() { />
    -
    - - 0 - - -
    + +
    ); From dc00cb1d4e04b6205d7005f2855d441163d6a6c5 Mon Sep 17 00:00:00 2001 From: AleKs Date: Sat, 19 Aug 2023 22:21:31 -0400 Subject: [PATCH 025/101] Adjust size of CloseIcon --- pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx index 2a938a304..66f378eae 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx @@ -3,9 +3,9 @@ export function CloseIcon() { From e325efea7941d62aa769e40c975803aa81a4b2b2 Mon Sep 17 00:00:00 2001 From: AleKs Date: Sat, 19 Aug 2023 22:22:42 -0400 Subject: [PATCH 026/101] Adjust position of add book button for better alignment --- .../01-reading-list/th3alexdev/src/components/ListOfBooks.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx index b4e2d0fde..c47676180 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx @@ -23,7 +23,7 @@ export default function ListOfBooks() { className="relative py-4 px-3 flex flex-nowrap flex-col items-center rounded-md hover:bg-card-hover group" key={ISBN} > - From 005b1d8be2dbcf3d418d0ba4364eed79c7d4e2e7 Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:42:31 -0400 Subject: [PATCH 032/101] Refactor and rename icons --- .../th3alexdev/src/components/Icons.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx index 66f378eae..f2c077e51 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx @@ -54,7 +54,7 @@ export function AddBookIcon() { ); } -export function SavedBooksIconRegular() { +export function SavedBooksIcon() { return ( - + ); } From e72396af7954d27a246eeca55e2c5e7e04dc525a Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:43:16 -0400 Subject: [PATCH 033/101] Add book addition functionality and display error messages --- .../th3alexdev/src/components/ListOfBooks.jsx | 79 ++++++++++--------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx index c47676180..69cf7ad43 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx @@ -3,10 +3,13 @@ import { FiltersContext } from "../context/contextFiltersProvider"; import { BooksContext } from "../context/contextBooksProvider"; import Loader from "./Loader"; import { AddBookIcon } from "./Icons"; +import ErrorMessage from "./ErrorMessage"; +import { UserListContext } from "../context/contextUserListProvider"; export default function ListOfBooks() { const { filters, filteredBooks } = useContext(FiltersContext); - const { loading } = useContext(BooksContext); + const { loading, error } = useContext(BooksContext); + const { addBook, removeBook } = useContext(UserListContext) const { sortByPages } = filters; @@ -15,46 +18,50 @@ export default function ListOfBooks() {
    {loading ? ( + ) : error ? ( + ) : (
      - {filteredBooks?.map( - ({ title, cover, ISBN, author, year, pages }) => ( -
    • ( +
    • + - {title} -
      -

      + + + + {`Cubierta +
      +

      + {book.title} +

      +

      {book.author.name}

      +
      +

      {book.year}

      +

      - {title} -

      -

      {author.name}

      -
      -

      {year}

      -

      - {pages} pág. -

      -
      + {book.pages} pág. +

      -
    • - ) - )} +
    +

  • + ))} )} From b7b69b9e99cc6fc9d61254c4246538a8487b845a Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:43:57 -0400 Subject: [PATCH 034/101] Improve error handling --- .../src/context/contextFiltersProvider.jsx | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx b/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx index 9a97e83e9..42c7761c0 100644 --- a/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/context/contextFiltersProvider.jsx @@ -1,15 +1,16 @@ -import { createContext, useState, useContext, useEffect } from 'react'; -import { BooksContext } from './contextBooksProvider'; +import { createContext, useState, useContext, useEffect } from "react"; +import { BooksContext } from "./contextBooksProvider"; +import { ERROR_MESSAGES } from "../constants/errorMessages"; export const FiltersContext = createContext(); export default function FiltersProvider({ children }) { - const { books } = useContext(BooksContext); + const { books, error, setError } = useContext(BooksContext); const [filters, setFilters] = useState({ - sortByTitle: '', + sortByTitle: "", sortByPages: false, - genre: '', + genre: "", genres: [], maxPosiblePages: 0, pages: { @@ -46,12 +47,12 @@ export default function FiltersProvider({ children }) { })); }, [books]); - const { sortByTitle, genre, pages } = filters; + const { sortByTitle, genre, pages, sortByPages } = filters; const filter = books?.filter((book) => { if ( (!genre || book.genre === genre) && - (book.title?.toLowerCase().includes(sortByTitle)) && + book.title?.toLowerCase().includes(sortByTitle) && book.pages <= pages.maxPages ) return true; @@ -61,6 +62,16 @@ export default function FiltersProvider({ children }) { const filteredBooks = filter; + useEffect(() => { + if (error === ERROR_MESSAGES.FETCH_ERROR) return; + + if ((sortByTitle || genre || sortByPages) && !filteredBooks.length) { + setError(ERROR_MESSAGES.NOT_FOUND); + } else { + setError(null); + } + }, [filteredBooks, error]); + return ( {children} From 5902cb4dd7e0ab29d58d9176de8113c89c58c209 Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:44:27 -0400 Subject: [PATCH 035/101] Enhance error handling --- .../th3alexdev/src/context/contextBooksProvider.jsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx b/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx index c941359a7..095906890 100644 --- a/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/context/contextBooksProvider.jsx @@ -1,11 +1,13 @@ import { useState, useEffect, createContext } from "react"; import { getBooks } from "../services/getBooks"; +import { ERROR_MESSAGES } from "../constants/errorMessages" export const BooksContext = createContext(); export function BooksProvider({ children }) { const [books, setBooks] = useState([]); const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); useEffect(() => { const initBooks = async () => { @@ -32,9 +34,9 @@ export function BooksProvider({ children }) { }); setBooks(mappedBooks); } catch (e) { - console.error("murió: ", e); - console.log('no cargó xd') - + console.error("Hubo un error: ", e); + setError(ERROR_MESSAGES.FETCH_ERROR); + } finally { setLoading(false); } @@ -44,6 +46,6 @@ export function BooksProvider({ children }) { }, []); return ( - {children} + {children} ); } From 9119aa0c532c3a8bec54e8cc871277eb3393a206 Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:45:36 -0400 Subject: [PATCH 036/101] Update background color and text style --- .../01-reading-list/th3alexdev/src/css/index.css | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/css/index.css b/pruebas/01-reading-list/th3alexdev/src/css/index.css index 4e9fb4dfc..3f11fe5d4 100644 --- a/pruebas/01-reading-list/th3alexdev/src/css/index.css +++ b/pruebas/01-reading-list/th3alexdev/src/css/index.css @@ -3,7 +3,7 @@ @tailwind utilities; :root { - background-color: #17171D; + background-color: #18191d; color: #FFF; color-scheme: dark; font-family: 'General Sans', sans-serif; @@ -11,7 +11,15 @@ * { scrollbar-gutter: stable; - /* outline: 1px solid #ffffff33; */ + outline: 1px solid #ffffff55; +} + +body { + overflow-x: hidden; +} + +img { + -webkit-user-drag: none; } @layer components { @@ -41,4 +49,8 @@ input[type=number] { ::-webkit-scrollbar-track { background-color: #1a1920; +} + +.text-balance { + text-wrap: balance; } \ No newline at end of file From 6612cf2fa21a02b29c403e39779d54c1079a2929 Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:46:01 -0400 Subject: [PATCH 037/101] Adjust color palette --- pruebas/01-reading-list/th3alexdev/tailwind.config.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/tailwind.config.js b/pruebas/01-reading-list/th3alexdev/tailwind.config.js index d196d61b6..74d5d7cb0 100644 --- a/pruebas/01-reading-list/th3alexdev/tailwind.config.js +++ b/pruebas/01-reading-list/th3alexdev/tailwind.config.js @@ -12,9 +12,10 @@ export default { colors: { 'card-background': '#252429', 'text': '#FFF', - 'background': '#17171D', - 'primary': '#4B7FF2', - 'secondary': '#FFD440' + 'background': '#18191d', + 'primary': '#009687', + 'secondary': '#FFD440', + 'sidebar': '#282e33' } }, }, From 3e1824392ee6e216b810e229323fd72ab499886f Mon Sep 17 00:00:00 2001 From: AleKs Date: Wed, 23 Aug 2023 15:46:40 -0400 Subject: [PATCH 038/101] Remove unnecessary icons --- pruebas/01-reading-list/th3alexdev/public/search.svg | 1 - pruebas/01-reading-list/th3alexdev/public/vite.svg | 1 - 2 files changed, 2 deletions(-) delete mode 100644 pruebas/01-reading-list/th3alexdev/public/search.svg delete mode 100644 pruebas/01-reading-list/th3alexdev/public/vite.svg diff --git a/pruebas/01-reading-list/th3alexdev/public/search.svg b/pruebas/01-reading-list/th3alexdev/public/search.svg deleted file mode 100644 index 1ef5dcff9..000000000 --- a/pruebas/01-reading-list/th3alexdev/public/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pruebas/01-reading-list/th3alexdev/public/vite.svg b/pruebas/01-reading-list/th3alexdev/public/vite.svg deleted file mode 100644 index e7b8dfb1b..000000000 --- a/pruebas/01-reading-list/th3alexdev/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 41ae2bd4040da60bc1beff65a412be1cbf5ef403 Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 25 Aug 2023 21:18:35 -0400 Subject: [PATCH 039/101] Refactor context provider and grid layout --- pruebas/01-reading-list/th3alexdev/src/App.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/App.jsx b/pruebas/01-reading-list/th3alexdev/src/App.jsx index 84804f59c..6f6df4e3b 100644 --- a/pruebas/01-reading-list/th3alexdev/src/App.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/App.jsx @@ -2,7 +2,7 @@ import React, { useEffect } from "react"; import ListOfBooks from "./components/ListOfBooks"; import Filters from "./components/Filters"; import FiltersProvider from "./context/contextFiltersProvider"; -import UserListProvider from "./context/contextUserListProvider"; +import ReadListProvider from "./context/contextUserListProvider"; import Header from "./components/Header"; import Sidebar from "./components/Sidebar"; import { useSidebar } from "./hooks/useSidebar"; @@ -17,16 +17,16 @@ export default function App() { return ( <> - - + +
    -
    +
    - - + + ); } From 1f2dca2c659555b9052fe0d83c6e3bdc67540339 Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 25 Aug 2023 21:19:13 -0400 Subject: [PATCH 040/101] Adjust responsive design and styling --- .../th3alexdev/src/components/Filters.jsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx index a82a0c5ff..ce4066737 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/Filters.jsx @@ -19,12 +19,14 @@ export default function Filters() { }); return ( -
    -
    +
    +
    +
    +
    e.preventDefault}> -

    +

    Por género

    -
      +
        {filters.genres.map((genre) => ( -
      • +
      • +
    + +
    + +
    +
    + +
    +
    + + + + +
    - - +
    ); From 5680df3372c87a2f6df1439b3a27ce15d91d436b Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 25 Aug 2023 21:20:44 -0400 Subject: [PATCH 042/101] Adjust icon sizes and paths for display --- pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx index f2c077e51..35b31a167 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/Icons.jsx @@ -17,9 +17,9 @@ export function SearchIcon() { @@ -77,7 +77,7 @@ export function DeleteBookIcon() { viewBox="0 -960 960 960" width="24" > - + ); } From d605973f5ef688b8c8527035b3e43dc45d362e81 Mon Sep 17 00:00:00 2001 From: AleKs Date: Fri, 25 Aug 2023 21:22:24 -0400 Subject: [PATCH 043/101] Improve book list layout and adapt grid for component --- .../th3alexdev/src/components/ListOfBooks.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx index 69cf7ad43..157f274a7 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/ListOfBooks.jsx @@ -4,24 +4,24 @@ import { BooksContext } from "../context/contextBooksProvider"; import Loader from "./Loader"; import { AddBookIcon } from "./Icons"; import ErrorMessage from "./ErrorMessage"; -import { UserListContext } from "../context/contextUserListProvider"; +import { ReadListContext } from "../context/contextUserListProvider"; export default function ListOfBooks() { const { filters, filteredBooks } = useContext(FiltersContext); const { loading, error } = useContext(BooksContext); - const { addBook, removeBook } = useContext(UserListContext) + const { addBook, removeBook } = useContext(ReadListContext) const { sortByPages } = filters; return ( <> -
    +
    {loading ? ( ) : error ? ( ) : ( -
    From 9381501399df23b9eacbbe469604bf5df0d0833e Mon Sep 17 00:00:00 2001 From: AleKs Date: Thu, 14 Sep 2023 12:17:18 -0400 Subject: [PATCH 094/101] Adjust for responsive design --- .../th3alexdev/src/components/SlideSidebar.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pruebas/01-reading-list/th3alexdev/src/components/SlideSidebar.jsx b/pruebas/01-reading-list/th3alexdev/src/components/SlideSidebar.jsx index bb3ef591f..3b93661ff 100644 --- a/pruebas/01-reading-list/th3alexdev/src/components/SlideSidebar.jsx +++ b/pruebas/01-reading-list/th3alexdev/src/components/SlideSidebar.jsx @@ -4,14 +4,14 @@ import UserReadList from "./UserReadList"; export default function SlideSidebar({ showSidebar, toggleSidebar }) { return (