diff --git a/.env.example b/.env.example deleted file mode 100644 index 44a16bb..0000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -NEXT_PUBLIC_BASE_URL= diff --git a/package-lock.json b/package-lock.json index 812d487..e31dea5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,20 @@ "version": "0.1.0", "dependencies": { "axios": "^1.6.8", + "framer-motion": "^11.1.9", "next": "14.2.3", "react": "^18", "react-cookie": "^7.1.4", "react-dom": "^18", - "react-toastify": "^10.0.5" + "react-hook-form": "^7.51.4", + "react-icons": "^5.2.1", + "react-markdown": "^9.0.1", + "react-query": "^3.39.3", + "react-toastify": "^10.0.5", + "remark-gfm": "^4.0.0" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.13", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -44,6 +51,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -436,11 +454,68 @@ "tslib": "^2.4.0" } }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.13.tgz", + "integrity": "sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", @@ -456,6 +531,19 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "20.12.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", @@ -494,6 +582,11 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", @@ -712,8 +805,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/acorn": { "version": "8.11.3", @@ -985,11 +1077,27 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "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 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } }, "node_modules/binary-extensions": { "version": "2.3.0", @@ -1007,7 +1115,6 @@ "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" @@ -1025,6 +1132,21 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -1092,6 +1214,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1108,6 +1239,42 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1186,6 +1353,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1198,8 +1374,7 @@ "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 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/cookie": { "version": "0.6.0", @@ -1295,7 +1470,6 @@ "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" }, @@ -1308,6 +1482,18 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1356,6 +1542,31 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1840,6 +2051,15 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -1849,6 +2069,11 @@ "node": ">=0.10.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2027,11 +2252,34 @@ "node": ">= 6" } }, + "node_modules/framer-motion": { + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.9.tgz", + "integrity": "sha512-flECDIPV4QDNcOrDafVFiIazp8X01HFpzc01eDKJsdNH/wrATcYydJSH9JbPWMS8UD5lZlw+J1sK8LG2kICgqw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "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 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2332,6 +2580,44 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -2340,6 +2626,15 @@ "react-is": "^16.7.0" } }, + "node_modules/html-url-attributes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz", + "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2378,7 +2673,6 @@ "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" @@ -2387,8 +2681,12 @@ "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 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" }, "node_modules/internal-slot": { "version": "1.0.7", @@ -2404,6 +2702,28 @@ "node": ">= 0.4" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -2529,6 +2849,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2586,6 +2915,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -2643,6 +2981,17 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2823,6 +3172,11 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2925,12 +3279,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2951,60 +3326,883 @@ "node": "14 || >=16.14" } }, - "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/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "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, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">=8.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", "dependencies": { - "mime-db": "1.52.0" + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "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, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", "dependencies": { - "brace-expansion": "^1.1.7" + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" }, - "engines": { - "node": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/minipass": { + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "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/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", @@ -3016,8 +4214,7 @@ "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 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mz": { "version": "2.7.0", @@ -3030,6 +4227,14 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -3258,11 +4463,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, "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" } @@ -3326,6 +4535,30 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3339,7 +4572,6 @@ "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" } @@ -3624,6 +4856,15 @@ "react-is": "^16.13.1" } }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -3694,11 +4935,84 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.51.4", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.4.tgz", + "integrity": "sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-toastify": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-10.0.5.tgz", @@ -3753,6 +5067,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -3771,6 +5090,73 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -3811,7 +5197,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -3826,7 +5211,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4035,6 +5419,15 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -4183,6 +5576,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4220,6 +5626,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", + "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -4380,6 +5794,24 @@ "node": ">=8.0" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -4534,6 +5966,100 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universal-cookie": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.1.4.tgz", @@ -4543,6 +6069,15 @@ "cookie": "^0.6.0" } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4558,6 +6093,33 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4758,8 +6320,7 @@ "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 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/yallist": { "version": "4.0.0", @@ -4790,6 +6351,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 67a676a..749e8e7 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,20 @@ }, "dependencies": { "axios": "^1.6.8", + "framer-motion": "^11.1.9", "next": "14.2.3", "react": "^18", "react-cookie": "^7.1.4", "react-dom": "^18", - "react-toastify": "^10.0.5" + "react-hook-form": "^7.51.4", + "react-icons": "^5.2.1", + "react-markdown": "^9.0.1", + "react-query": "^3.39.3", + "react-toastify": "^10.0.5", + "remark-gfm": "^4.0.0" }, "devDependencies": { + "@tailwindcss/typography": "^0.5.13", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/public/CheckIcon.svg b/public/CheckIcon.svg new file mode 100644 index 0000000..0e25ca1 --- /dev/null +++ b/public/CheckIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/CheckSubIcon.svg b/public/CheckSubIcon.svg new file mode 100644 index 0000000..5412143 --- /dev/null +++ b/public/CheckSubIcon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/CheckedIcon.svg b/public/CheckedIcon.svg new file mode 100644 index 0000000..6031262 --- /dev/null +++ b/public/CheckedIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/DropDown.svg b/public/DropDown.svg new file mode 100644 index 0000000..5b8a622 --- /dev/null +++ b/public/DropDown.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/ExclamationMark.svg b/public/ExclamationMark.svg new file mode 100644 index 0000000..81a9a2b --- /dev/null +++ b/public/ExclamationMark.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/RightArrowIcon.svg b/public/RightArrowIcon.svg new file mode 100644 index 0000000..420748b --- /dev/null +++ b/public/RightArrowIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..9d2146d Binary files /dev/null and b/public/logo.png differ diff --git a/public/sign/positionCircle.png b/public/sign/positionCircle.png new file mode 100644 index 0000000..628452d Binary files /dev/null and b/public/sign/positionCircle.png differ diff --git a/public/sign/positionClose.png b/public/sign/positionClose.png new file mode 100644 index 0000000..f537849 Binary files /dev/null and b/public/sign/positionClose.png differ diff --git a/public/sign/positionColorCircle.png b/public/sign/positionColorCircle.png new file mode 100644 index 0000000..39e8cfb Binary files /dev/null and b/public/sign/positionColorCircle.png differ diff --git a/public/sign/termsDetail.png b/public/sign/termsDetail.png new file mode 100644 index 0000000..f20850a Binary files /dev/null and b/public/sign/termsDetail.png differ diff --git a/public/sign/termsNotCheck.png b/public/sign/termsNotCheck.png new file mode 100644 index 0000000..b312350 Binary files /dev/null and b/public/sign/termsNotCheck.png differ diff --git a/public/termsCheck.png b/public/termsCheck.png new file mode 100644 index 0000000..887a6a5 Binary files /dev/null and b/public/termsCheck.png differ diff --git a/src/api/auth/auth.post.api.ts b/src/api/auth/auth.post.api.ts index 17be0b4..f78d4f0 100644 --- a/src/api/auth/auth.post.api.ts +++ b/src/api/auth/auth.post.api.ts @@ -1,4 +1,5 @@ // import { ICommon } from '../types/common'; +import { basicResponse } from '@/models/response'; import { postRequest } from '../request'; import { ISignIn, @@ -10,6 +11,7 @@ import { IPhoneAuth } from '../types/auth'; + /* 회원가입 */ export const signup = async ({ @@ -49,22 +51,22 @@ export const signin = async ({ memberEmail, memberPassword }: ISignIn) => { /* 이메일 인증 요청 */ export const emailauthrequest = async ({ emailAddress }: IEmail) => { - const response = await postRequest('auth/email', { + const response = await postRequest(`auth/email`, { emailAddress }); - return response; + return response as basicResponse | null; }; /* 이메일 코드 검증 */ export const emailauthverify = async ({ emailAddress, code }: IEmailAuth) => { - const response = await postRequest('auth/email/verify', { + const response = await postRequest(`auth/email/verify`, { emailAddress, code }); - return response; + return response as basicResponse | null; }; /* 휴대전화 번호 인증 요청*/ @@ -74,7 +76,7 @@ export const phoneauthrequest = async ({ phoneNumber }: IPhoneNumber) => { phoneNumber }); - return response; + return response as basicResponse | null; }; /* 휴대전화 번호 코드 검증*/ @@ -85,7 +87,7 @@ export const phoneauthverify = async ({ phoneNumber, code }: IPhoneAuth) => { code }); - return response; + return response as basicResponse | null; }; /* 로그아웃*/ diff --git a/src/api/types/auth.ts b/src/api/types/auth.ts index 9834860..9af83d6 100644 --- a/src/api/types/auth.ts +++ b/src/api/types/auth.ts @@ -49,6 +49,11 @@ export interface IEmailAuth extends IEmail { code: number; } +export interface IEmailAuth2 { + emailAddress: string; + code: number; +} + export interface ITokenRefresh { // 아직 타입 안들어옴 } diff --git a/src/components/findpassword/ChangePasswordDone.tsx b/src/components/findpassword/ChangePasswordDone.tsx new file mode 100644 index 0000000..2c5d3bb --- /dev/null +++ b/src/components/findpassword/ChangePasswordDone.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import MainContainer from '../shared/MainContainer'; +import { useRouter } from 'next/router'; + +const ChangePasswordDone = () => { + const router = useRouter(); + return ( + +
+
+
+ +
+
+ +
+
+
+
+ 비밀번호 재설정이
+ 완료되었습니다. +
+
+
+
+ +
+
+ ); +}; + +export default ChangePasswordDone; diff --git a/src/components/findpassword/EmailCertification.tsx b/src/components/findpassword/EmailCertification.tsx new file mode 100644 index 0000000..ed9b0db --- /dev/null +++ b/src/components/findpassword/EmailCertification.tsx @@ -0,0 +1,250 @@ +import React, { ChangeEvent, Dispatch, useEffect, useRef, useState } from 'react'; +import ToBack from '../shared/sign/ToBack'; +import { SignupBtnStatus } from '@/models/signupBtnStatus'; +import { motion } from 'framer-motion'; +import { useMutation } from 'react-query'; +import { invertSecond } from '@/utils/invertSecond'; +import { emailauthrequest, emailauthverify } from '@/api/auth/auth.post.api'; + +interface EmailCertificationProps { + setStep: Dispatch>; +} + +const EmailCertification = ({ setStep }: EmailCertificationProps) => { + const [userEmail, setUserEmail] = useState(''); + const [emailValid, setEmailValid] = useState(false); + const [btnStatus, setBtnStatus] = useState('FIRST'); + const [isRequest, setIsRequest] = useState(false); + const [validNumber, setValidNumber] = useState(''); + const [validTime, setValidTime] = useState(300); + const [isError, setIsError] = useState(false); + const [emailError, setEmailError] = useState(false); + const inputRef = useRef(null); + const startRef = useRef(null); + + const { mutateAsync: emailRequest } = useMutation((email: string) => { + return emailauthrequest({ emailAddress: email }); + }); + + const { mutateAsync: emailVerify } = useMutation( + ({ emailAddress, code }: { emailAddress: string; code: number }) => { + return emailauthverify({ emailAddress, code }); + } + ); + + const handleEmailChange = (e: ChangeEvent) => { + setUserEmail(e.target.value); + const emailRegEx = + /^[A-Za-z0-9]([-_.]?[A-Za-z0-9])*@[A-Za-z0-9]([-_.]?[A-Za-z0-9])*\.[A-Za-z]{2,3}$/; + const isValid = emailRegEx.test(e.target.value); + setEmailValid(isValid); + }; + + const handleValidNumberChange = (e: ChangeEvent) => { + const regex = e.target.value.replace(/[^0-9]/g, ''); + setValidNumber(regex); + }; + + useEffect(() => { + startRef.current?.focus(); + }, []); + + useEffect(() => { + if (emailValid) { + setBtnStatus('SECOND'); + } else { + setBtnStatus('FIRST'); + } + }, [emailValid]); + + useEffect(() => { + if (isRequest) { + inputRef.current?.focus(); + } + }, [isRequest]); + + useEffect(() => { + let timeoutId: NodeJS.Timeout; + if (isError || emailError) { + timeoutId = setTimeout(() => { + setIsError(false); + setEmailError(false); + }, 4000); + } + return () => clearTimeout(timeoutId); + }, [isError, emailError]); + + useEffect(() => { + let intervalId: NodeJS.Timeout; + + if (isRequest && validTime > 0) { + intervalId = setInterval(() => { + setValidTime((prevTime) => prevTime - 1); + }, 1000); + } + + return () => clearInterval(intervalId); + }, [isRequest, validTime]); + + const handleClick = async () => { + if (btnStatus == 'SECOND') { + const { status } = (await emailRequest(userEmail)) as { status: string }; + if (status == 'SUCCESS') { + setIsRequest(true); + setBtnStatus('THIRD'); + } + if (status == 'FAIL') { + setUserEmail(''); + setEmailError(true); + return; + } + } + if (btnStatus == 'THIRD') { + if (validNumber.length != 6) { + setValidNumber(''); + setIsError(true); + inputRef.current?.focus(); + return; + } + const { status } = (await emailVerify({ + emailAddress: userEmail, + code: Number(validNumber) + })) as { status: string }; + + if (status == 'SUCCESS') { + setStep((prev) => prev + 1); + } + if (status == 'FAIL') { + setValidNumber(''); + setIsError(true); + inputRef.current?.focus(); + return; + } + } + }; + + return ( +
+ + + +
+ 가입한 이메일을
+ 입력해주세요. +
+
+ + +
+
+ +
+
+
+
+ +
+ +
+
+ {emailError ? ( +
+
+ *등록되지 않은 이메일입니다. +
+
+ ) : ( + '' + )} + + + {isRequest && ( + <> +
+ {isError ? ( +
+
+ *올바르지 않은 코드입니다. +
+
+ ) : ( +
+ )} +
+
+ +
+
+ {invertSecond(validTime)} +
+
+
+
+
+
+ +
+
+
+ 이메일로 발송된 코드를 입력해주세요. +
+
+ + )} +
+ ); +}; + +export default EmailCertification; \ No newline at end of file diff --git a/src/components/findpassword/NewPasswordForm.tsx b/src/components/findpassword/NewPasswordForm.tsx new file mode 100644 index 0000000..48af19b --- /dev/null +++ b/src/components/findpassword/NewPasswordForm.tsx @@ -0,0 +1,148 @@ +import React, { ChangeEvent, Dispatch, useState } from 'react'; + +const NewPasswordForm = ({ + setStep +}: { + setStep: Dispatch>; +}) => { + const [newPassword, setNewPassword] = useState(''); + const [checkPassword, setCheckPassword] = useState(''); + const [validBtn, setValidBtn] = useState(false); + const [error, setError] = useState(false); + const [secondError, setSecondError] = useState(false); + + const handleNewPassword = (e: ChangeEvent) => { + setError(false); + const newPasswordValue = e.target.value; + setNewPassword(newPasswordValue); + setValidBtn( + newPasswordValue === checkPassword && newPasswordValue != '' && checkPassword != '' + ); + }; + + const handleCheckPassword = (e: ChangeEvent) => { + setSecondError(false); + const checkPasswordValue = e.target.value; + setCheckPassword(checkPasswordValue); + setValidBtn( + newPassword === checkPasswordValue && checkPasswordValue != '' && newPassword != '' + ); + }; + + const checkValidPassword = () => { + const passwordRegex = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*[0-9]).{8,16}$/; + if (!passwordRegex.test(newPassword)) { + setError(true); + } else { + setError(false); + } + }; + + const checkValidNewPassword = () => { + if (newPassword != checkPassword) { + setSecondError(true); + } + }; + + const handleButtonClick = () => { + //todo : 비밀번호 변경 요청 api 필요 + setStep((prev) => prev + 1); + }; + + return ( + <> +
+
+
+ +
+
+ {error ? ( +
+ 비밀번호 형식을 확인해주세요. +
+ ) : ( + '' + )} +
+ +
+
+
+ +
+
+
+
+
+
+ +
+
+
+ *영문 (대문자 포함), 숫자, 특수문자 중 2가지 이상 조합 8~16자리 +
+
+ +
+
+ +
+
+ {secondError ? ( +
+ 일치하지 않습니다. +
+ ) : ( + '' + )} +
+ +
+
+
+ +
+
+
+
+
+ +
+ + ); +}; + +export default NewPasswordForm; diff --git a/src/components/findpassword/SetNewPasswod.tsx b/src/components/findpassword/SetNewPasswod.tsx new file mode 100644 index 0000000..836f034 --- /dev/null +++ b/src/components/findpassword/SetNewPasswod.tsx @@ -0,0 +1,22 @@ +import React, { Dispatch } from 'react'; +import ToBack from '../shared/sign/ToBack'; +import NewPasswordForm from './NewPasswordForm'; + +const SetNewPassword = ({ + setStep +}: { + setStep: Dispatch>; +}) => { + return ( +
+ +
+ 새로 사용할
+ 비밀번호를 설정해주세요. +
+ +
+ ); +}; + +export default SetNewPassword; diff --git a/src/components/shared/MainContainer.tsx b/src/components/shared/MainContainer.tsx new file mode 100644 index 0000000..92e83fd --- /dev/null +++ b/src/components/shared/MainContainer.tsx @@ -0,0 +1,7 @@ +import React, { ReactNode } from 'react'; + +const MainContainer = ({ children }: { children: ReactNode }) => { + return
{children}
; +}; + +export default MainContainer; diff --git a/src/components/shared/sign/SignInButton.tsx b/src/components/shared/sign/SignInButton.tsx new file mode 100644 index 0000000..b7a605c --- /dev/null +++ b/src/components/shared/sign/SignInButton.tsx @@ -0,0 +1,15 @@ +import { useRouter } from 'next/router'; +import React from 'react'; + +const SignInButton = () => { + const router = useRouter(); + return ( + + ); +}; + +export default SignInButton; diff --git a/src/components/shared/sign/SignUpButton.tsx b/src/components/shared/sign/SignUpButton.tsx new file mode 100644 index 0000000..091b596 --- /dev/null +++ b/src/components/shared/sign/SignUpButton.tsx @@ -0,0 +1,15 @@ +import { useRouter } from 'next/router'; +import React from 'react'; + +const SignUpButton = () => { + const router = useRouter(); + return ( + + ); +}; + +export default SignUpButton; diff --git a/src/components/shared/sign/ToBack.tsx b/src/components/shared/sign/ToBack.tsx new file mode 100644 index 0000000..d692e8b --- /dev/null +++ b/src/components/shared/sign/ToBack.tsx @@ -0,0 +1,15 @@ +import Link from 'next/link'; +import React from 'react'; +import { IoIosArrowRoundBack } from 'react-icons/io'; + +const ToBack = () => { + return ( +
+ + + +
+ ); +}; + +export default ToBack; diff --git a/src/components/signin/SigninForm.tsx b/src/components/signin/SigninForm.tsx new file mode 100644 index 0000000..76698bf --- /dev/null +++ b/src/components/signin/SigninForm.tsx @@ -0,0 +1,134 @@ +import React, { useEffect, useState } from 'react'; +import { useForm } from 'react-hook-form'; + +interface SigninType { + email: string; + password: string; +} + +const SigninForm = () => { + const [isError, setIsError] = useState(false); + const { + register, + handleSubmit, + formState: { errors } + } = useForm(); + + const FormSubmit = async (data: SigninType) => { + //todo : signin 처리 + console.log(data); + setIsError(true); + }; + + useEffect(() => { + let timeoutId: NodeJS.Timeout; + if (isError) { + timeoutId = setTimeout(() => { + setIsError(false); + }, 5000); + } + return () => clearTimeout(timeoutId); + }, [isError]); + + return ( +
FormSubmit(data))} + className="max-w-[361px] mx-auto"> +
+ +
+
+ +
+
+
+ +
+
+
+ {errors?.email ? ( +
+ {errors.email.type === 'required' + ? '필수 입력사항입니다.' + : errors.email.message} +
+ ) : ( +
+ )} + +
+ +
+
+ +
+
+
+ +
+
+
+ {errors?.password ? ( +
+ {errors.password.type === 'required' + ? '필수 입력사항입니다.' + : errors.password.message} +
+ ) : ( +
+ )} + + {isError ? ( +
+ *등록되지 않은 계정이거나 비밀번호가 올바르지 않습니다. +
+ 입력하신 내용을 다시 확인해주세요. +
+ ) : ( +
+ )} + + + + ); +}; + +export default SigninForm; diff --git a/src/components/signup/EmailVerification.tsx b/src/components/signup/EmailVerification.tsx new file mode 100644 index 0000000..af9fd5b --- /dev/null +++ b/src/components/signup/EmailVerification.tsx @@ -0,0 +1,310 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import ToBack from '../shared/sign/ToBack'; +import { useMutation } from 'react-query'; +import { motion } from 'framer-motion'; +import { emailauthrequest, emailauthverify } from 'src/api/auth/auth.post.api'; +import Image from 'next/image'; +import PasswordVerification from './PasswordVerification'; + +const EmailVerification = () => { + const [userName, setUserName] = useState(''); + const [userEmail, setUserEmail] = useState(''); + const [emailValid, setEmailValid] = useState(false); + const [validNumber, setValidNumber] = useState(''); + const [validTime, setValidTime] = useState(300); + const [isError, setIsError] = useState(false); + const [showVerification, setShowVerification] = useState(false); + const startRef = useRef(null); + const [isInvalidCode, setIsInvalidCode] = useState(false); + const [isPartnerShip, setIsPartnerShip] = useState(false); + const [timerExpired, setTimerExpired] = useState(false); + const [isEmailConfirmed, setIsEmailConfirmed] = useState(false); + + const { mutateAsync: emailRequest } = useMutation((email: string) => { + return emailauthrequest({ emailAddress: email }); + }); + + const { mutateAsync: emailVerify } = useMutation( + ({ emailAddress, code }: { emailAddress: string; code: number }) => { + return emailauthverify({ emailAddress, code }); + } + ); + + const handleNameChange = (e: ChangeEvent) => { + setUserName(e.target.value); + }; + + const handleEmailChange = (e: ChangeEvent) => { + setUserEmail(e.target.value); + const emailRegEx = + /^[A-Za-z0-9]([-_.]?[A-Za-z0-9])*@[A-Za-z0-9]([-_.]?[A-Za-z0-9])*\.[A-Za-z]{2,3}$/; + const isValid = emailRegEx.test(e.target.value); + setEmailValid(isValid); + setIsPartnerShip(false); + }; + + const handleValidNumberChange = async (e: ChangeEvent) => { + const regex = e.target.value.replace(/[^0-9]/g, ''); + setValidNumber(regex); + + if (regex.length === 6) { + try { + const { status } = (await emailVerify({ + emailAddress: userEmail, + code: Number(regex) + })) as unknown as { status: string }; + + if (status === 'SUCCESS') { + console.log('인증 성공'); + console.log(status); + setIsEmailConfirmed(true); + } + } catch (error: any) { + console.error(error); + const errorResponse = error.response.data; + const errorCode = errorResponse.errorCode; + console.log('인증 실패 - 에러 코드:', errorCode); + + if (errorCode === '1-005') { + setIsInvalidCode(true); + } + } + } + }; + + const handleRetryClick = async () => { + try { + await emailRequest(userEmail); + setShowVerification(true); + setValidTime(300); + setTimerExpired(false); + } catch (error: any) { + if (error.response.data.errorCode === '1-003') { + setIsPartnerShip(true); + } + setIsError(true); + } + }; + + useEffect(() => { + startRef.current?.focus(); + }, []); + + useEffect(() => { + if (isError) { + const timeoutId = setTimeout(() => { + setIsError(false); + }, 4000); + return () => clearTimeout(timeoutId); + } + }, [isError]); + + useEffect(() => { + let intervalId: NodeJS.Timeout; + if (validTime > 0) { + intervalId = setInterval(() => { + setValidTime((prevTime) => { + if (prevTime === 1) { + setTimerExpired(true); + } + return prevTime - 1; + }); + }, 1000); + } + return () => clearInterval(intervalId); + }, [validTime]); + + return ( +
+ {!isEmailConfirmed && ( + <> + + +
+ 제휴 기업이라면,
+ 사내 이메일을 인증해주세요. +
+
+ +
+
+ +
+
+
+
+ +
+
+
+ + +
+
+
+ +
+
+ {userEmail && !emailValid && ( +
+ *이메일 형식에 맞지 않습니다. +
+ )} + {isPartnerShip && !timerExpired && ( +
+ 계약되지 않은 회사입니다. +
+ )} +
+
+
+ +
+
+ +
+
+
+
+ ExclamationMark Logo +
본인 인증, 예약 확인, 약관 변경 안내 등을 위해 사용됩니다.
사내 이메일로 정확하게 입력해주세요.
+
+ + {showVerification && ( + +
+
+
+ +
+
+ {isInvalidCode && !timerExpired && ( +
+ 올바르지 않은 코드입니다. +
+ )} + {timerExpired && ( +
+ 인증 시간이 초과되었습니다. +
+ )} +
+
+
+ +
+
+ {Math.floor(validTime / 60)}:{validTime % 60 < 10 ? `0${validTime % 60}` : validTime % 60} +
+
+
+
+ ExclamationMark Logo +
이메일로 발송된 코드를 입력해주세요.
+
+ + )} + + )} + {isEmailConfirmed && ( + + )} +
+ ); +}; + +export default EmailVerification; + diff --git a/src/components/signup/JobPosition.tsx b/src/components/signup/JobPosition.tsx new file mode 100644 index 0000000..19cd6d6 --- /dev/null +++ b/src/components/signup/JobPosition.tsx @@ -0,0 +1,81 @@ +/* eslint-disable no-unused-vars */ +import React, { useState } from 'react'; +import JobPositionItem from './JobPositionItem'; +import { jobPosition as allPostion } from '@/constant/jobPosition'; +import { motion } from 'framer-motion'; + +const JobPosition = ({ setSelectedJob, setShowJobPosition }: { setSelectedJob: (job: string) => void; setShowJobPosition: (show: boolean) => void; }) => { + //todo : 이미 선택된 직무를 다시 변경 할 수 있으니까 초기 직무선택값을 받아야함 + const [selectPosition, setSelectPosition] = useState(null); + + const handleClick = (title: string) => { + setSelectPosition(title); + setSelectedJob(title); + }; + + const handleSubmit = () => { + //todo : 선택한 직무 넘기기 + const res = allPostion?.find((item) => item.title === selectPosition); + console.log(res?.description); + setShowJobPosition(false); + + }; + + return ( +
+
+
+ 직무선택 +
+
{ + handleSubmit() + }} + className="w-[18px] h-[18px] absolute top-[25px] right-[16px] cursor-pointer"> + +
+
+ +
    + {allPostion?.map((position, i) => ( + + + + ))} +
+ {selectPosition == null ? ( +
+ +
+ ) : ( +
+ +
+ )} +
+ ); +}; + +export default JobPosition; diff --git a/src/components/signup/JobPositionItem.tsx b/src/components/signup/JobPositionItem.tsx new file mode 100644 index 0000000..089bd10 --- /dev/null +++ b/src/components/signup/JobPositionItem.tsx @@ -0,0 +1,41 @@ +/* eslint-disable no-unused-vars */ +import React from 'react'; + +interface JobPositionItemProps { + title: string; + handleClick: (title: string) => void; + selectPosition: string | null; +} + +const JobPositionItem = ({ + title, + handleClick, + selectPosition +}: JobPositionItemProps) => { + return ( +
handleClick(title)}> +
+
+ {title} +
+
+ {title == selectPosition ? ( + + ) : ( + + )} +
+
+
+ ); +}; + +export default JobPositionItem; diff --git a/src/components/signup/PasswordVerification.tsx b/src/components/signup/PasswordVerification.tsx new file mode 100644 index 0000000..1bf8fb8 --- /dev/null +++ b/src/components/signup/PasswordVerification.tsx @@ -0,0 +1,318 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +import React, { useEffect, useState } from 'react'; +import ToBack from '../shared/sign/ToBack'; +import { motion } from 'framer-motion'; +import Image from 'next/image'; +import JobPosition from './JobPosition'; + +const PasswordVerification = ({ userName, userEmail }: { userName: string; userEmail: string; }) => { + const [password, setPassword] = useState(''); + const [passwordError, setPasswordError] = useState(''); + const [showJobPosition, setShowJobPosition] = useState(false); + const [selectedJob, setSelectedJob] = useState(null); + const [allAgreed, setAllAgreed] = useState(false); + const [nextButtonDisabled, setNextButtonDisabled] = useState(true); + const [termsCheckIcon, setTermsCheckIcon] = useState(false); + const [serviceTermsCheckIcon, setServiceTermsCheckIcon] = useState(false); + const [privacyTermsCheckIcon, setPrivacyTermsCheckIcon] = useState(false); + const [marketingTermsCheckIcon, setMarketingTermsCheckIcon] = useState(false); + + useEffect(() => { + checkFormValidity(); + }, [passwordError, selectedJob, allAgreed, termsCheckIcon, serviceTermsCheckIcon, privacyTermsCheckIcon, marketingTermsCheckIcon]); + + const handlePasswordChange = (e: React.ChangeEvent) => { + const newPassword = e.target.value; + setPassword(newPassword); + validatePassword(newPassword); + }; + + const validatePassword = (value: string) => { + const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,16}$/; + if (!regex.test(value)) { + setPasswordError('패스워드를 다시 정해주세요.'); + } else { + setPasswordError(''); + } + }; + + const handleJobPositionClick = () => { + setShowJobPosition(true); + }; + + const checkFormValidity = () => { + if (passwordError === '' && selectedJob && serviceTermsCheckIcon && privacyTermsCheckIcon) { + setNextButtonDisabled(false); + } else { + setNextButtonDisabled(true); + } + }; + + const handleServiceTermsCheck = () => { + const newServiceTermsCheckIcon = !serviceTermsCheckIcon; + setServiceTermsCheckIcon(newServiceTermsCheckIcon); + updateAllAgreedIcon(); + if (newServiceTermsCheckIcon && privacyTermsCheckIcon && marketingTermsCheckIcon) { + setAllAgreed(true); + } + else { + setAllAgreed(false); + } + }; + + const handlePrivacyTermsCheck = () => { + const newPrivacyTermsCheckIcon = !privacyTermsCheckIcon; + setPrivacyTermsCheckIcon(newPrivacyTermsCheckIcon); + updateAllAgreedIcon(); + if (serviceTermsCheckIcon && newPrivacyTermsCheckIcon && marketingTermsCheckIcon) { + setAllAgreed(true); + } + else { + setAllAgreed(false); + } + }; + + const handleMarketingTermsCheck = () => { + const newMarketingTermsCheckIcon = !marketingTermsCheckIcon; + setMarketingTermsCheckIcon(newMarketingTermsCheckIcon); + updateAllAgreedIcon(); + if (serviceTermsCheckIcon && privacyTermsCheckIcon && newMarketingTermsCheckIcon) { + setAllAgreed(true); + } + else { + setAllAgreed(false); + } + }; + + const updateAllAgreedIcon = () => { + if (allAgreed) { + setTermsCheckIcon(true); + } else { + setTermsCheckIcon(false); + } + }; + + const handleAllAgreed = () => { + const newAllAgreed = !allAgreed; + setAllAgreed(newAllAgreed); + setServiceTermsCheckIcon(newAllAgreed); + setPrivacyTermsCheckIcon(newAllAgreed); + setMarketingTermsCheckIcon(newAllAgreed); + checkFormValidity(); + }; + + const handleNextButtonClick = () => { + // todo + }; + + return ( +
+ {!showJobPosition && ( + <> +
+ 회원가입을 위한
정보를 입력해주세요. +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
확인완료
+
+
+
+
+
+ ExclamationMark Logo +
본인 인증, 예약 확인, 약관 변경 안내 등을 위해 사용됩니다.
사내 이메일로 정확하게 입력해주세요.
+
+
+
+ +
+ {passwordError && ( +
+ {passwordError} +
+ )} +
+
+
+ +
+
+
+
+ ExclamationMark Logo +
*영문 (대문자 포함), 숫자, 특수문자 중 2가지 이상 조합 8~16자리
+
+
+
+ +
+
+
+
+ +
+ DropDown Logo +
+
+
+ {allAgreed ? ( + + ) : ( + + )} + + + + + + +
+ + )} + {showJobPosition && ( + + + + )} +
+ ); +}; + +export default PasswordVerification; \ No newline at end of file diff --git a/src/components/signup/PhoneCertification.tsx b/src/components/signup/PhoneCertification.tsx new file mode 100644 index 0000000..e672a34 --- /dev/null +++ b/src/components/signup/PhoneCertification.tsx @@ -0,0 +1,225 @@ +import React, { ChangeEvent, useEffect, useRef, useState } from 'react'; +import ToBack from '../shared/sign/ToBack'; +import { SignupBtnStatus } from '@/models/signupBtnStatus'; +import { motion } from 'framer-motion'; +import { invertSecond } from '@/utils/invertSecond'; +import { useMutation } from 'react-query'; +import { phoneauthrequest, phoneauthverify } from '@/api/auth/auth.post.api'; +import EmailVerification from './EmailVerification'; + +const PhoneCertification = () => { + const [phoneNumber, setPhoneNumber] = useState(''); + const [btnStatus, setBtnStatus] = useState('FIRST'); + const [isRequest, setIsRequest] = useState(false); + const [validNumber, setValidNumber] = useState(''); + const [validTime, setValidTime] = useState(180); + const [isError, setIsError] = useState(false); + const inputRef = useRef(null); + const startRef = useRef(null); + const [showEmailPosition, setShowEmailPosition] = useState(false); + + const { mutateAsync: phoneRequest } = useMutation((number: string) => { + return phoneauthrequest({ + phoneNumber: number + }); + }); + + const { mutateAsync: phoneVerify } = useMutation( + ({ phoneNumber, code }: { phoneNumber: string; code: number }) => { + return phoneauthverify({ phoneNumber, code }); + } + ); + + const handlePhoneNumberChange = (e: ChangeEvent) => { + const regex = e.target.value + .replace(/[^0-9]/g, '') + .replace(/^(\d{0,3})(\d{0,4})(\d{0,4})$/g, '$1-$2-$3') + .replace(/(-{1,2})$/g, ''); + setPhoneNumber(regex); + }; + + const handleValidNumberChange = (e: ChangeEvent) => { + const regex = e.target.value.replace(/[^0-9]/g, ''); + setValidNumber(regex); + }; + + useEffect(() => { + startRef.current?.focus(); + }, []); + + useEffect(() => { + if (phoneNumber.length === 13) { + setBtnStatus('SECOND'); + } else { + setBtnStatus('FIRST'); + } + }, [phoneNumber]); + + useEffect(() => { + if (isRequest) { + inputRef.current?.focus(); + } + }, [isRequest]); + + useEffect(() => { + let timeoutId: NodeJS.Timeout; + if (isError) { + timeoutId = setTimeout(() => { + setIsError(false); + }, 3000); + } + return () => clearTimeout(timeoutId); + }, [isError]); + + useEffect(() => { + let intervalId: NodeJS.Timeout; + + if (isRequest && validTime > 0) { + intervalId = setInterval(() => { + setValidTime((prevTime) => prevTime - 1); + }, 1000); + } + + return () => clearInterval(intervalId); + }, [isRequest, validTime]); + + const handleClick = async () => { + if (btnStatus == 'SECOND') { + const { status } = (await phoneRequest(phoneNumber.replace(/-/g, ''))) as { + status: string; + }; + if (status == 'SUCCESS') { + setIsRequest(true); + setBtnStatus('THIRD'); + } + } + if (btnStatus == 'THIRD') { + if (validNumber.length != 6) { + setValidNumber(''); + setIsError(true); + inputRef.current?.focus(); + return; + } + const { status } = (await phoneVerify({ + phoneNumber: phoneNumber.replace(/-/g, ''), + code: Number(validNumber) + })) as { status: string }; + + if (status == 'SUCCESS') { + console.log('핸드폰 인증 성공'); + setShowEmailPosition(true); + } + + if (status == 'FAIL') { + console.log('핸드폰 인증 실패') + //todo : 에러코드에 따른 텍스트 조건부 렌더링 + alert('실패'); + } + } + }; + + return ( +
+ {!showEmailPosition && ( + <> + + +
+ 본인인증을 위해
+ 휴대폰 번호를 +
+ 인증해주세요. +
+
+ + +
+
+
+82
+
+ +
+ +
+
+
+ + {isRequest && ( + <> +
+
+
+ +
+
+ {invertSecond(validTime)} +
+
+
+ {isError ? ( +
+ *올바르지 않은 코드입니다. +
+ ) : ( + '' + )} + + + )} + + )} + {showEmailPosition && ( + + )} +
+ ); +}; + +export default PhoneCertification; diff --git a/src/components/signup/Terms.tsx b/src/components/signup/Terms.tsx new file mode 100644 index 0000000..5948884 --- /dev/null +++ b/src/components/signup/Terms.tsx @@ -0,0 +1,76 @@ +import React, { MouseEvent, useState } from 'react'; +import TermsTitle from './terms/TermsTitle'; +import { 약관목록 } from '@constant/temrs'; +import { TermsType } from '@/models/terms'; +import TermsItem from './terms/TermsItem'; +import dynamic from 'next/dynamic'; + +const TermsModal = dynamic(() => import('./terms/TermsModal'), { + ssr: false +}); + +const Terms = () => { + const [termsAgreements, setTermsAgreements] = useState(() => + setInitialValues(약관목록) + ); + const [openModal, setOpenModal] = useState(false); + const [modalDescription, setModalDescription] = useState(null); + const [modalSubTitle, setModalSubTitle] = useState(null); + + const handleAgreement = (id: number, checked: boolean) => { + setTermsAgreements((prevTerms) => { + return prevTerms.map((term) => (term.id === id ? { ...term, checked } : term)); + }); + }; + + const handleAllTerms = (_: MouseEvent, checked: boolean) => { + setTermsAgreements((prevTerms) => { + return prevTerms.map((term) => ({ ...term, checked })); + }); + }; + + const isAllRequireChecked = termsAgreements + .filter((term) => term.required) + .every((term) => term.checked); + + console.log(isAllRequireChecked); + //todo : isAllRequireChecked을 넘겨서 true 여야지만 회원가입 이뤄지게 (버튼 눌러지게) + + const isAllTermsChecked = termsAgreements.every((term) => term.checked); + + if (openModal) { + return ( + + ); + } + + return ( +
+ +
    + {termsAgreements.map((term) => ( + handleAgreement(term.id, checked)} + /> + ))} +
+
+ ); +}; + +function setInitialValues(terms: TermsType[]) { + return terms.map((term) => ({ ...term, checked: false })); +} + +export default Terms; diff --git a/src/components/signup/terms/TermsItem.tsx b/src/components/signup/terms/TermsItem.tsx new file mode 100644 index 0000000..9d478bb --- /dev/null +++ b/src/components/signup/terms/TermsItem.tsx @@ -0,0 +1,59 @@ +/* eslint-disable no-unused-vars */ +import React, { Dispatch, MouseEvent } from 'react'; + +interface TermsItemProps { + title: string; + description: string; + subTitle: string; + checked: boolean; + onChange: (e: MouseEvent, checked: boolean) => void; + setOpenModal: Dispatch>; + setModalDescription: Dispatch>; + setModalSubTitle: Dispatch>; +} + +const TermsItem = ({ + title, + description, + checked, + subTitle, + setModalSubTitle, + onChange, + setOpenModal, + setModalDescription +}: TermsItemProps) => { + const handleClick = () => { + setModalDescription(description); + setModalSubTitle(subTitle); + setOpenModal(true); + }; + + return ( +
  • +
    { + onChange(e, !checked); + }} + className="justify-start items-center gap-[11px] flex cursor-pointer"> +
    + {checked ? ( + + ) : ( + + )} +
    +
    + {title} +
    +
    + +
  • + ); +}; + +export default TermsItem; diff --git a/src/components/signup/terms/TermsModal.tsx b/src/components/signup/terms/TermsModal.tsx new file mode 100644 index 0000000..392f324 --- /dev/null +++ b/src/components/signup/terms/TermsModal.tsx @@ -0,0 +1,54 @@ +import MainContainer from '@/components/shared/MainContainer'; +import React, { Dispatch } from 'react'; +import { createPortal } from 'react-dom'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; + +interface TermsModalProps { + modalDescription: string | null; + modalSubTitle: string | null; + setOpenModal: Dispatch>; +} + +const TermsModal = ({ + modalDescription, + setOpenModal, + modalSubTitle +}: TermsModalProps) => { + console.log(modalDescription); + const $portalRoot = document.getElementById('root-portal'); + + if ($portalRoot == null) { + return null; + } + if (modalDescription == null) { + return null; + } + + return createPortal( + +
    +
    + {modalSubTitle} +
    +
    { + setOpenModal(false); + }} + className="w-[18px] h-[18px] absolute top-[25px] right-[16px] cursor-pointer"> + +
    +
    +
    + + {modalDescription} + +
    +
    , + $portalRoot + ); +}; + +export default TermsModal; diff --git a/src/components/signup/terms/TermsTitle.tsx b/src/components/signup/terms/TermsTitle.tsx new file mode 100644 index 0000000..fe7b17c --- /dev/null +++ b/src/components/signup/terms/TermsTitle.tsx @@ -0,0 +1,37 @@ +/* eslint-disable no-unused-vars */ +import React, { MouseEvent } from 'react'; + +interface TermsTitleProps { + checked: boolean; + onChange: (e: MouseEvent, checked: boolean) => void; +} + +const TermsTitle = ({ checked, onChange }: TermsTitleProps) => { + return ( +
    onChange(e, !checked)} + className={`cursor-pointer w-[361px] h-12 bg-white rounded-lg border-2 flex items-center + ${ + checked + ? 'border-space-purple text-space-purple' + : 'text-gray-500 border-gray-400' + } + `}> +
    + {checked ? ( + + ) : ( + + )} +
    +
    + 모두 동의합니다 +
    +
    + ); +}; + +export default TermsTitle; diff --git a/src/constant/jobPosition.ts b/src/constant/jobPosition.ts new file mode 100644 index 0000000..d5c2ded --- /dev/null +++ b/src/constant/jobPosition.ts @@ -0,0 +1,66 @@ +export const jobPosition = [ + { + title: '대표', + description: 'OWNER' + }, + { + title: '경영/기획/사무', + description: 'OFFICE' + }, + { + title: '회계/재무/IR', + description: 'FINANCE' + }, + { + title: '인사/총무/HR', + description: 'HRD' + }, + { + title: '마케팅/광고/홍보', + description: 'PROMOTION' + }, + { + title: 'IT 개발', + description: 'ITDEV' + }, + { + title: 'IT 서비스 기획', + description: 'ITPLAN' + }, + { + title: '영업/판매', + description: 'SALE' + }, + { + title: '디자인', + description: 'DESIGN' + }, + { + title: '고객서비스/운영/고객지원/상담', + description: 'SERVICE' + }, + { + title: '언론/미디어/콘텐츠', + description: 'CONTENTS' + }, + { + title: '연구개발', + description: 'RND' + }, + { + title: '전문/특수직', + description: 'PROFESSIONAL' + }, + { + title: '유통/MD', + description: 'MD' + }, + { + title: '금융/증권/보험', + description: 'INSURANCE' + }, + { + title: '기타', + description: 'ETC' + } +]; diff --git a/src/constant/temrs.ts b/src/constant/temrs.ts new file mode 100644 index 0000000..c6db19e --- /dev/null +++ b/src/constant/temrs.ts @@ -0,0 +1,83 @@ +export const 약관목록 = [ + { + id: 1, + title: '(필수) 서비스 이용약관 동의', + subTitle: '서비스 이용약관 동의서', + description: `## 서비스 이용약관 동의서 + +### 제 1장 총칙 +#### 제 1조 (목적) +이 약관은 Offispace가 운영하는 Offispace 멤버용 웹사이트, Offispace 멤버용 앱, "Offispace"와 계약을 체결한 제휴지점 운영자 전용 웹사이트(이하 "웹사이트" 및 "앱"을 통칭하 여 "웹사이트 등"이라 한다)에서 제공하는 인터넷 관련 서비스(이하 “서비스")를 이용함에 있어 "Offispace"와 이용자의 권리, 의무 및 책임 사항을 규정함을 목적으로 합니다. + +#### 제 2조 (정의) +1) "웹사이트 등"이라 함은 "Offispace"가 재화 또는 용역(이하 "재화 등"이라 함)을 멤버(아래에서 정의됨)에게 제공하기 위하여 컴퓨터 등 정보통신설비를 이용한 가상의 영업장을 말합니다. +2) "멤버"란 그룹에 소속되어 "웹사이트 등"에 접속하여 본 약관에 따라 "Offispace"가 제공하는 서비스를 "웹사이트 등"에서 이용할 수 있는 자로서 "웹사이트 등"에 멤버로 등록을 한 자를 말합니다. +3) "그룹"이란 "Offispace"와 멤버십 등록계약 또는 제휴 계약을 체결한 법인, 단체로서, 멤버가 소속된 법인, 단체, 개인을 의미합니다. + +#### 제 3조 (약관 등의 명시와 설명 및 개정) +1) "Offispace"는 이 약관의 내용과 개인정보관리책임자 등을 "멤버"가 쉽게 알 수 있도록 "서비스”에 게시합니다. 다만, 약관의 내용은 이용자가 연결 화면을 통하여 볼 수 있도록 할 수 있습니다. +2) "Offispace"는 이용자가 약관에 동의하기에 앞서 내용을 이용자가 이해할 수 있도록 별도의 연결 화면 또는 팝업 화면 등을 제공하여 이용자의 확인을 구하여야 합니다. +3) "Offispace"는 「전자상거래 등에서의 소비자보호에 관한 법률」, 「약관의 규제에 관한 법률」, 「전자문서 및 전자거래 기본법」, 「전자금융거래법」, 「전자서명법」, 「정보통신망 이용촉진 및 정보보호 등에 관한 법률」, 「방문판매 등에 관한 법률」, 「소비자기본법」 등 관련 법을 위배하지 않는 범위에서 이 약관을 개정할 수 있습니다. + +#### 제 4조 (서비스 가입) +1) "멤버"는 "Offispace"가 정한 가입 양식에 따라 정보를 기입한 후 이 약관에 동의한다는 의사 표시를 함으로서 멤버 가입을 신청합니다. +2) "Offispace"는 제 1항에 따라 제공된 정보를 확인 또는 인정한 후 가입을 승낙함으로써 "웹사이트 등"의 이용계약은 체결됩니다. +3) 제1항, 제2항에도 불구하고, "Offispace"와 제휴 계약을 체결한 그룹에 속한 "멤버"에 한하여, 별도의 가입절차 없이, 서비스이용권한을 부여할 수 있으며, "Offispace”가 권한을 부여한 때로부터 "Offispace"와 이러한 "멤버" 사이에 "웹사이트 등"의 이용계약이 체결된 것으로 봅니다. +4) "멤버"는 "Offispace"에서 제공하는 "웹사이트 등" 에 게시된 이 약관에 따라 가입한 하나의 계정으로 모든 "웹사이트 등"에 로그인하여 이용할 수 있습니다. + +##### 상기 본인은 위와 같은 서비스 이용약관에 동의함.`, + required: true + }, + { + id: 2, + title: '(필수) 개인정보 수집 및 이용 동의', + subTitle: '개인정보 수집 및 이용 동의서', + description: `## 개인정보 수집 및 활용 동의서 + +Offispace는 「개인정보보호법」 및 관계 법령에 의거하여 고객님의 개인정보 수집 및 활용에 대한 활용 동의서를 받고 있습니다. + +개인정보 제공자가 동의한 내용 외의 다른 목적으로 개인정보를 활용하지 않으며, 제공된 개인정보의 이용을 거부하고자 할 때에는 개인정보 관리 책임자를 통해 열람, 정정 혹은 삭제를 요구할 수 있습니다. + +### 개인정보의 수집·이용 목적 +- 멤버 전용서비스에 따른 이용자 식별 본인 확인 및 멤버관리, 공지, 불만처리, 고객상담, 부가서비스 제공 +- 서비스 정보 및 알림 제공 (서비스 내 Push 등) + +### 개인정보 수집 항목 +- 이름 +- 이메일 +- 직무 정보 + +#### 상기 본인은 위와 같이 개인정보 수집 및 활용에 동의함.`, + required: true + }, + { + id: 3, + title: '(선택) 마케팅 정보 수집 및 이용 동의', + subTitle: '마케팅 정보 수신 동의서', + description: `## 마케팅 정보 수신 동의서 + +Offispace는 개인정보보호법 및 정보통신망이용촉진 및 정보보호 등에 관한 법률 등 관계법령에 따라 광고성 정보를 전송하기 위해 이용자의 사전 수신 동의를 받고 있습니다. 본 내용은 Offispace 회원 서비스가 적용되는 개별서비스의 마케팅 수신동의를 포함하고 있으며, 마케팅 정보 수신 동의 시 개별서비스의 마케팅 수신에 일괄 동의한 것으로 처리됩니다. + +### 전송방법 +마케팅 정보 전송 방법은 Offispace의 각 개별서비스에서 정한 방식에 따라 전송됩니다. + +#### 전송내용 +발송되는 마케팅 정보는 수신자에게 Offispace 및 개별서비스에서 제공하는 혜택(포인트, 쿠폰 등) 정보, 각종 이벤트, 신규 상품 관련 소식 등 광고성 정보로 관련 법의 규정을 준수하여 발송됩니다. 단, 광고성 정보 이외에 의무적으로 안내 되어야 하는 정보성 내용은 수신동의 여부와 무관하게 제공됩니다. + +#### 수집항목 +- 이름, 이메일, 직무 정보 + +#### 이용목적 +- 소식지 서비스 제공, 신제품 및 이벤트 안내, 이벤트 경품/사은품 제공, 할인행사, 고객 맞춤 마케팅/판촉 등 관련 이메일 및 SMS 등 발송 + +#### 철회안내 +- 수신동의 이후에라도 언제든지 동의를 철회할 수 있으며, 수신을 동의하지 않아도 회사가 제공하는 기본적인 서비스를 이용하실 수 있습니다. 다만 수신 거부할 경우 신규 서비스나 상품 관련 소식 등의 마케팅 정보를 제공받지 못할 수 있습니다. + +#### 수신동의 변경 및 보유기간 +- 보유 기간 : 마케팅 정보 수신 동의로부터 2년, 기간 초과 시 동의 절차 재진행 (미동의 시, 즉시 파기) +Offispace 정보수정 페이지에서 개별서비스의 마케팅 수신동의를 변경(동의/철회)할 수 있으며, 동의일로부터 회원 탈퇴 혹은 마케팅 수신 동의 해제 시까지 광고성 정보 전달을 위하여 보유ㆍ이용됩니다. + +#### 상기 본인은 위와 같이 마케팅 정보 수신에 동의함.`, + required: false + } +]; diff --git a/src/models/response.ts b/src/models/response.ts new file mode 100644 index 0000000..41420d7 --- /dev/null +++ b/src/models/response.ts @@ -0,0 +1,6 @@ +export interface basicResponse { + status?: string; + errorCode?: string | null; + data?: string | null; + message?: string | null; +} diff --git a/src/models/signupBtnStatus.ts b/src/models/signupBtnStatus.ts new file mode 100644 index 0000000..a9ee894 --- /dev/null +++ b/src/models/signupBtnStatus.ts @@ -0,0 +1,9 @@ +// 처음 진입 했을 때 first, 번호가 정상적으로 입력됐을때 second, 인증요청을 눌렀을 때 third + +const status = { + FIRST: 'FIRST', + SECOND: 'SECOND', + THIRD: 'THIRD' +}; + +export type SignupBtnStatus = keyof typeof status; diff --git a/src/models/terms.ts b/src/models/terms.ts new file mode 100644 index 0000000..c8af24c --- /dev/null +++ b/src/models/terms.ts @@ -0,0 +1,7 @@ +export interface TermsType { + id: number; + title: string; + description: string; + required: boolean; + subTitle: string; +} diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index c14313e..0b28f2b 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,6 +1,13 @@ import '@/styles/globals.css'; import type { AppProps } from 'next/app'; +import { QueryClient, QueryClientProvider } from 'react-query'; + +const queryClient = new QueryClient(); export default function App({ Component, pageProps }: AppProps) { - return ; + return ( + + + + ); } diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx index fc6c518..0b4c64b 100644 --- a/src/pages/_document.tsx +++ b/src/pages/_document.tsx @@ -1,6 +1,4 @@ -import { - Html, Head, Main, NextScript, -} from 'next/document'; +import { Html, Head, Main, NextScript } from 'next/document'; export default function Document() { return ( @@ -9,6 +7,7 @@ export default function Document() {
    +
    ); diff --git a/src/pages/index.tsx b/src/pages/index.tsx index ee23649..c5967c2 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -6,7 +6,7 @@ import Image from 'next/image'; export default function Home() { return (
    -
    +

    Get started by editing  test src/pages/index.tsx diff --git a/src/pages/sign/findpassword/index.tsx b/src/pages/sign/findpassword/index.tsx new file mode 100644 index 0000000..10b4570 --- /dev/null +++ b/src/pages/sign/findpassword/index.tsx @@ -0,0 +1,19 @@ +import ChangePasswordDone from '@/components/findpassword/ChangePasswordDone'; +import EmailCertification from '@/components/findpassword/EmailCertification'; +import SetNewPassword from '@/components/findpassword/SetNewPasswod'; +import MainContainer from '@/components/shared/MainContainer'; +import React, { useState } from 'react'; + +const FindPasswordPage = () => { + const [step, setStep] = useState(0); + + return ( + + {step === 0 ? : null} + {step === 1 ? : null} + {step === 2 ? : null} + + ); +}; + +export default FindPasswordPage; diff --git a/src/pages/sign/index.tsx b/src/pages/sign/index.tsx new file mode 100644 index 0000000..e8c4e3a --- /dev/null +++ b/src/pages/sign/index.tsx @@ -0,0 +1,44 @@ +import MainContainer from '@/components/shared/MainContainer'; +import SignInButton from '@/components/shared/sign/SignInButton'; +import SignUpButton from '@/components/shared/sign/SignUpButton'; + +import Link from 'next/link'; + +const SignHomePage = () => { + return ( + +

    +
    + +
    +
    + + 예약하고, 탐색하고, 성장하는 +
    +
    + + 멀티 서비스 오피스 + +
    +
    + +
    + + +
    + +
    + + 비밀번호를 잊으셨나요?{' '} + + + + 비밀번호 찾기{' '} + + +
    + + ); +}; + +export default SignHomePage; diff --git a/src/pages/signin/index.tsx b/src/pages/signin/index.tsx new file mode 100644 index 0000000..49e4482 --- /dev/null +++ b/src/pages/signin/index.tsx @@ -0,0 +1,28 @@ +import MainContainer from '@/components/shared/MainContainer'; +import SigninForm from '@/components/signin/SigninForm'; +import Link from 'next/link'; + +const SignPage = () => { + return ( + +
    +
    + +
    +
    + +
    + + 비밀번호를 잊으셨나요?{' '} + + + + 비밀번호 찾기{' '} + + +
    +
    + ); +}; + +export default SignPage; diff --git a/src/pages/signup/index.tsx b/src/pages/signup/index.tsx new file mode 100644 index 0000000..8ea30b4 --- /dev/null +++ b/src/pages/signup/index.tsx @@ -0,0 +1,16 @@ +import MainContainer from '@/components/shared/MainContainer'; +import EmailVerification from '@/components/signup/EmailVerification'; +// import PhoneCertification from '@/components/signup/PhoneCertification'; +// import JobPosition from '@/components/signup/JobPosition'; + +const SignUpPage = () => { + // todo 단계별로 회원가입 이뤄지게 + // const [step, setStep] = useState(0); + return ( + + + + ); +}; + +export default SignUpPage; diff --git a/src/remote/sendEmailReq.ts b/src/remote/sendEmailReq.ts new file mode 100644 index 0000000..0829f75 --- /dev/null +++ b/src/remote/sendEmailReq.ts @@ -0,0 +1,10 @@ +import { IEmail } from '@/api/types/auth'; +import axios from 'axios'; + +export const sendEmailReq = async ({ emailAddress }: IEmail) => { + const response = await axios.post('https://joo-api.store/auth/email', { + emailAddress + }); + + return response; +}; diff --git a/src/styles/globals.css b/src/styles/globals.css index 1dde46c..4350919 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -2,11 +2,10 @@ @tailwind components; @tailwind utilities; - - @font-face { font-family: 'Pretendard'; - src: url('/fonts/PretendardVariable.woff2') format('woff2'), + src: + url('/fonts/PretendardVariable.woff2') format('woff2'), url('/fonts/PretendardVariable.ttf') format('ttf'); font-weight: normal; font-style: normal; @@ -19,37 +18,27 @@ box-sizing: border-box; } - - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - body { color: rgb(var(--foreground-rgb)); - background: linear-gradient(to bottom, - transparent, - rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); - } body { - font-family: 'Pretendard', -apple-system, BlinkMacSystemFont, Roboto, - Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + font-family: + 'Pretendard', + -apple-system, + BlinkMacSystemFont, + Roboto, + Oxygen, + Ubuntu, + Cantarell, + Fira Sans, + Droid Sans, + Helvetica Neue, + sans-serif; } @layer utilities { .text-balance { text-wrap: balance; } -} \ No newline at end of file +} diff --git a/src/utils/invertSecond.ts b/src/utils/invertSecond.ts new file mode 100644 index 0000000..b065e7b --- /dev/null +++ b/src/utils/invertSecond.ts @@ -0,0 +1,5 @@ +export const invertSecond = (time: number): string => { + const minutes = Math.floor(time / 60); + const seconds = time % 60; + return `${minutes}:${seconds.toString().padStart(2, '0')}`; +}; diff --git a/tailwind.config.ts b/tailwind.config.ts index 61fd103..2113f0c 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -57,6 +57,6 @@ const config: Config = { } } }, - plugins: [] + plugins: [require('@tailwindcss/typography')] }; export default config; diff --git a/tsconfig.json b/tsconfig.json index efa42bc..2072a32 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,20 +15,13 @@ "baseUrl": ".", "paths": { "@/*": ["./src/*"], - "@app/*": [ - "src/app/*" - ], - "@components/*": [ - "src/components/*" - ], - "@types/*": [ - "src/types/*" - ], - "@utils/*": [ - "src/utils/*" - ], + "@app/*": ["src/app/*"], + "@components/*": ["src/components/*"], + "@types/*": ["src/types/*"], + "@utils/*": ["src/utils/*"], + "@constant/*": ["src/constant/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "next.config.mjs",], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "next.config.mjs"], "exclude": ["node_modules"] }