diff --git "a/.github/ISSUE_TEMPLATE/\354\234\240\354\240\200-\355\224\274\353\223\234\353\260\261-\352\270\260\353\241\235-\355\205\234\355\224\214\353\246\277.md" "b/.github/ISSUE_TEMPLATE/\354\234\240\354\240\200-\355\224\274\353\223\234\353\260\261-\352\270\260\353\241\235-\355\205\234\355\224\214\353\246\277.md" new file mode 100644 index 000000000..935012131 --- /dev/null +++ "b/.github/ISSUE_TEMPLATE/\354\234\240\354\240\200-\355\224\274\353\223\234\353\260\261-\352\270\260\353\241\235-\355\205\234\355\224\214\353\246\277.md" @@ -0,0 +1,11 @@ +--- +name: 유저 피드백 기록 템플릿 +about: 유저 피드백 기록용 템플릿 입니다. +title: '[개발 코드] 피드백 내용 간략히' +labels: 'user feedback' +assignees: '' +--- + +#### 문제 상황 + +#### 유저가 바라는 개선 사항 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..90505e4c8 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,111 @@ +name: Main CI/CD + +on: + pull_request: + branches: ['main'] + types: ['closed'] + +permissions: + contents: read + +jobs: + check-branch: + if: contains(github.head_ref, 'release') + runs-on: ubuntu-latest + steps: + - name: Check branch + run: | + echo "This is a release branch" + + check-merged: + needs: check-branch + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - name: Check merged + run: | + echo "This is a merged release branch" + + extract-version: + needs: check-merged + runs-on: ubuntu-latest + outputs: + version: ${{ steps.extract-version.outputs.version }} + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Extract version + id: extract-version + run: | + echo "version=$(echo "$(git show -s --format=%s)" | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" >> "$GITHUB_OUTPUT" + + CI: + name: Main Server CI Check + needs: extract-version + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup Node + uses: actions/setup-node@v2 + with: + node-version: 16 + - name: Check version + run: | + echo "This release version: ${{ needs.extract-version.outputs.version }}" + - name: Install dependencies + run: npm install + - name: Prettier + run: npm run format + - name: Lint + run: npm run lint + - name: Build Test + run: npm run build + + CD: + name: Main Server CD Check + needs: [CI, extract-version] + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Build and push Docker image + run: | + touch .env.production + echo "${{ secrets.MAIN_ENV }}" >> .env.production + echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin + docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }}:${{ needs.extract-version.outputs.version }} . + docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }}:${{ needs.extract-version.outputs.version }} + + - name: Deploy + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.MAIN_HOST }} + port: 4222 + username: ${{ secrets.MAIN_USERNAME }} + password: ${{ secrets.MAIN_KEY }} + script: | + docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }}:${{ needs.extract-version.outputs.version }} + docker stop ${{ secrets.MAIN_DOCKER_IMAGE }} + docker rm -f ${{ secrets.MAIN_DOCKER_IMAGE }} + docker run --name=${{ secrets.MAIN_DOCKER_IMAGE }} -d -p 3000:3000 ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }}:${{ needs.extract-version.outputs.version }} + docker container prune -f + docker image prune -f + + create-release: + needs: [CD, extract-version] + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: create release + uses: ncipollo/release-action@v1.13.0 + with: + tag: ${{ needs.extract-version.outputs.version }} + name: ${{ needs.extract-version.outputs.version }} diff --git a/.github/workflows/main_server.yml b/.github/workflows/main_server.yml new file mode 100644 index 000000000..799836443 --- /dev/null +++ b/.github/workflows/main_server.yml @@ -0,0 +1,105 @@ +name: Main CI/CD + +on: + pull_request: + branches: ['env/main_cicd'] + types: ['closed'] + +permissions: + contents: read + +jobs: + check-branch: + if: contains(github.head_ref, 'release') + runs-on: ubuntu-latest + steps: + - name: Check branch + run: | + echo "This is a release branch" + + check-merged: + needs: check-branch + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + steps: + - name: Check merged + run: | + echo "This is a merged release branch" + + extract-version: + needs: check-merged + runs-on: ubuntu-latest + outputs: + version: ${{ steps.extract-version.outputs.version }} + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Extract version + id: extract-version + run: | + echo "Extract version: this version is $(echo "$(git show -s --format=%s)" | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" >> "$GITHUB_OUTPUT" + + CI: + name: Main Server CI Check + needs: extract-version + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Setup Node + uses: actions/setup-node@v2 + with: + node-version: 16 + - name: Check version + run: | + echo "This release version: ${{ needs.extract-version.outputs.version }}" + - name: Install Docker + run: docker compose up -d + - name: Change directory + run: cd ${{ secrets.WORK_DIRECTORY }} // 환경 변수화 필요 + - name: Install dependencies + run: npm install ${{ secrets.WORK_DIRECTORY }} + - name: Prettier + run: npm run prettier + - name: Lint + run: npm run lint + - name: Build Test + run: npm run build + + CD: + name: Main Server CD Check + needs: CI + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: true + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push Docker image + run: | + touch ${{ secrets.WORK_DIRECTORY }}/.env.production + echo "${{ secrets.MAIN_ENV }}" >> /home/runner/work/Peer-Frontend/Peer-Frontend/.env.production + echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin + docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }} . + docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }} + + - name: Deploy + uses: appleboy/ssh-action@v1.0.0 + with: + host: ${{ secrets.MAIN_HOST }} + port: 4222 + username: ${{ secrets.MAIN_USERNAME }} + key: ${{ secrets.MAIN_KEY }} + script: | + docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }} + docker rm -f ${{ secrets.MAIN_DOCKER_IMAGE }} + docker run -d -p 3000:3000 ${{ secrets.DOCKER_USERNAME }}/${{ secrets.MAIN_DOCKER_IMAGE }} + docker container prune -f + docker image prune -f diff --git a/.storybook/main.ts b/.storybook/main.ts new file mode 100644 index 000000000..1154e014f --- /dev/null +++ b/.storybook/main.ts @@ -0,0 +1,20 @@ +import type { StorybookConfig } from '@storybook/nextjs' + +const config: StorybookConfig = { + stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + addons: [ + '@storybook/addon-links', + '@storybook/addon-essentials', + '@storybook/addon-onboarding', + '@storybook/addon-interactions', + '@storybook/addon-mdx-gfm' + ], + framework: { + name: '@storybook/nextjs', + options: {}, + }, + docs: { + autodocs: 'tag', + }, +} +export default config diff --git a/.storybook/preview.ts b/.storybook/preview.ts new file mode 100644 index 000000000..8196bc5be --- /dev/null +++ b/.storybook/preview.ts @@ -0,0 +1,15 @@ +import type { Preview } from '@storybook/react' + +const preview: Preview = { + parameters: { + actions: { argTypesRegex: '^on[A-Z].*' }, + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + }, +} + +export default preview diff --git a/next.config.js b/next.config.js index 0c2b1cadc..5142e99dd 100644 --- a/next.config.js +++ b/next.config.js @@ -5,11 +5,12 @@ const withPWA = require('@ducanh2912/next-pwa').default({ dest: 'public', register: true, skipWaiting: true, - disable: false, - // disable: prod ? false : true, 나중에 true로 바꿔야함 + disable: prod ? false : true, // 나중에 true로 바꿔야함 // runtimeCaching, }) +const WorkboxPlugin = require('workbox-webpack-plugin') + const nextConfig = withPWA({ reactStrictMode: false, compiler: { @@ -27,6 +28,12 @@ const nextConfig = withPWA({ 'kr1-api-object-storage.nhncloudservice.com', ], }, + // plugins: [ + // new WorkboxPlugin.GenerateSW({ + // clientsClaim: true, + // skipWaiting: true, + // }), + // ], webpack(config) { config.module.rules.push({ test: /\.svg$/i, @@ -38,7 +45,14 @@ const nextConfig = withPWA({ }, }) -// module.exports = nextConfig +const runtimeCaching = { + plugins: [ + new WorkboxPlugin.GenerateSW({ + clientsClaim: true, + skipWaiting: true, + }), + ], +} module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json index e6401e33e..b2a035be1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,6 +33,7 @@ "dayjs": "^1.11.5", "eslint-config-next": "13.4.19", "eslint-config-prettier": "^9.0.0", + "firebase": "^10.8.0", "framer-motion": "^10.16.5", "jose": "^5.2.0", "lodash": "^4.17.21", @@ -58,9 +59,19 @@ "tls": "^0.0.1", "utf-8-validate": "^5.0.10", "web-push": "^3.6.6", + "workbox-webpack-plugin": "^7.0.0", "zustand": "^4.4.1" }, "devDependencies": { + "@storybook/addon-essentials": "^7.6.13", + "@storybook/addon-interactions": "^7.6.13", + "@storybook/addon-links": "^7.6.13", + "@storybook/addon-mdx-gfm": "^7.6.15", + "@storybook/addon-onboarding": "^1.0.11", + "@storybook/blocks": "^7.6.13", + "@storybook/nextjs": "^7.6.13", + "@storybook/react": "^7.6.13", + "@storybook/test": "^7.6.13", "@svgr/webpack": "^8.1.0", "@types/lodash": "^4.14.199", "@types/react-big-calendar": "^1.8.4", @@ -79,9 +90,11 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-storybook": "^0.6.15", "lodash": "^4.17.21", "prettier": "^3.0.2", "sass": "^1.69.5", + "storybook": "^7.6.13", "typescript": "^5.1.6" } }, @@ -92,6 +105,12 @@ "node": ">=0.10.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", + "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "dev": true + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "license": "Apache-2.0", @@ -103,6 +122,18 @@ "node": ">=6.0.0" } }, + "node_modules/@aw-web-design/x-default-browser": { + "version": "1.4.126", + "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", + "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", + "dev": true, + "dependencies": { + "default-browser-id": "3.0.0" + }, + "bin": { + "x-default-browser": "bin/x-default-browser.js" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "license": "MIT", @@ -656,7 +687,9 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -673,7 +706,9 @@ }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -688,7 +723,8 @@ }, "node_modules/@babel/plugin-proposal-export-default-from": { "version": "7.23.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz", + "integrity": "sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q==", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", @@ -703,7 +739,9 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -718,7 +756,9 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -733,7 +773,9 @@ }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "peer": true, "dependencies": { "@babel/compat-data": "^7.20.5", @@ -751,7 +793,9 @@ }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", @@ -766,7 +810,9 @@ }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", @@ -800,6 +846,18 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "license": "MIT", @@ -835,7 +893,8 @@ }, "node_modules/@babel/plugin-syntax-export-default-from": { "version": "7.23.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz", + "integrity": "sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw==", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -859,8 +918,8 @@ }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.23.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1267,8 +1326,8 @@ }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.23.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-flow": "^7.23.3" @@ -1653,7 +1712,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.23.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1667,7 +1727,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.23.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1722,15 +1783,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "license": "MIT", - "peer": true, + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz", + "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { @@ -1740,10 +1801,37 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", - "license": "ISC", - "peer": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1986,8 +2074,8 @@ }, "node_modules/@babel/preset-flow": { "version": "7.23.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz", + "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", @@ -2050,8 +2138,8 @@ }, "node_modules/@babel/register": { "version": "7.23.7", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", + "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -2131,6 +2219,31 @@ "node": ">=6.9.0" } }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@ducanh2912/next-pwa": { "version": "9.7.2", "license": "MIT", @@ -2269,1763 +2382,6187 @@ "version": "0.3.1", "license": "MIT" }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "license": "MIT", + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "license": "MIT", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dependencies": { - "@floating-ui/utils": "^0.2.1" + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@floating-ui/dom": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", - "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.1" + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", - "dependencies": { - "@floating-ui/dom": "^1.6.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.10.0" + "node": ">=12" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "license": "Apache-2.0", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=12" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "license": "BSD-3-Clause" + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@isaacs/ttlcache": { - "version": "1.4.1", - "license": "ISC", - "peer": true, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "license": "MIT", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=6.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "license": "MIT", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/@mui/base": { + "node_modules/@eslint/js": { + "version": "8.56.0", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fal-works/esbuild-plugin-global-externals": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", + "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", + "dev": true + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.1.tgz", + "integrity": "sha512-5mnH1aQa99J5lZMJwTNzIoRc4yGXHf+fOn+EoEWhCDA3XGPweGHcylCbqq+G1wVJmfILL57fohDMa8ftMZ+44g==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.7.tgz", + "integrity": "sha512-17VCly4P0VFBDqaaal7m1nhyYQwsygtaTpSsnc51sFPRrr9XIYtnD8ficon9fneEGEoJQ2g7OtASvhwX9EbK8g==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + }, + "node_modules/@firebase/app": { + "version": "0.9.27", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.27.tgz", + "integrity": "sha512-p2Dvl1ge4kRsyK5+wWcmdAIE9MSwZ0pDKAYB51LZgZuz6wciUZk4E1yAEdkfQlRxuHehn+Ol9WP5Qk2XQZiHGg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.2.tgz", + "integrity": "sha512-A2B5+ldOguYAeqW1quFN5qNdruSNRrg4W59ag1Eq6QzxuHNIkrE+TrapfrW/z5NYFjCxAYqr/unVCgmk80Dwcg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.9.tgz", + "integrity": "sha512-7LxyupQ8XeEHRh72mO+tqm69kHT6KbWi2KtFMGedJ6tNbwzFzojcXESMKN8RpADXbYoQgY3loWMJjMx4r2Zt7w==", + "dependencies": { + "@firebase/app-check": "0.8.2", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.27.tgz", + "integrity": "sha512-SYlqocfUDKPHR6MSFC8hree0BTiWFu5o8wbf6zFlYXyG41w7TcHp4wJi4H/EL5V6cM4kxwruXTJtqXX/fRAZtw==", + "dependencies": { + "@firebase/app": "0.9.27", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.6.0.tgz", + "integrity": "sha512-Qhl35eJTV6BwvuueTPCY6x8kUlYyzALtjp/Ws0X3fw3AnjVVfuVb7oQ3Xh5VPVfMFhaIuUAd1KXwcAuIklkSDw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.2.tgz", + "integrity": "sha512-pRgje5BPCNR1vXyvGOVXwOHtv88A2WooXfklI8sV7/jWi03ExFqNfpJT26GUo/oD39NoKJ3Kt6rD5gVvdV7lMw==", + "dependencies": { + "@firebase/auth": "1.6.0", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.5.tgz", + "integrity": "sha512-2tVDk1ixi12sbDmmfITK8lxSjmcb73BMF6Qwc3U44hN/J1Fi1QY/Hnnb6klFlbB9/G16a3J3d4nXykye2EADTw==", + "dependencies": { + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.3.tgz", + "integrity": "sha512-9fjqLt9JzL46gw9+NRqsgQEMjgRwfd8XtzcKqG+UYyhVeFCdVRQ0Wp6Dw/dvYHnbH5vNEKzNv36dcB4p+PIAAA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.3.tgz", + "integrity": "sha512-7tHEOcMbK5jJzHWyphPux4osogH/adWwncxdMxdBpB9g1DNIyY4dcz1oJdlkXGM/i/AjUBesZsd5CuwTRTBNTw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/database": "1.0.3", + "@firebase/database-types": "1.0.1", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.1.tgz", + "integrity": "sha512-Tmcmx5XgiI7UVF/4oGg2P3AOTfq3WKEPsm2yf+uXtN7uG/a4WTWhVMrXGYRY2ZUL1xPxv9V33wQRJ+CcrUhVXw==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.4" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.4.2.tgz", + "integrity": "sha512-YaX6ypa/RzU6OkxzUQlpSxwhOIWdTraCNz7sMsbaSEjjl/pj/QvX6TqjkdWGzuBYh2S6rz7ErhDO0g39oZZw/g==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "@firebase/webchannel-wrapper": "0.10.5", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.25.tgz", + "integrity": "sha512-+xI7WmsgZCBhMn/+uhDKcg+lsOUJ9FJyt5PGTzkFPbCsozWfeQZ7eVnfPh0rMkUOf0yIQ924RIe04gwvEIbcoQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/firestore": "4.4.2", + "@firebase/firestore-types": "3.0.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.1.tgz", + "integrity": "sha512-3uUa1hB79Gmy6E1gHTfzoHeZolBeHc/I/n3+lOCDe6BOos9AHmzRjKygcFE/7VA2FJjitCE0K+OHI6+OuoY8fQ==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.5", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.7.tgz", + "integrity": "sha512-uXe6Kmku5lNogp3OpPBcOJbSvnaCOn+YxS3zlXKNU6Q/NLwcvO3RY1zwYyctCos2RemEw3KEQ7YdzcECXjHWLw==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/functions": "0.11.1", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.5.tgz", + "integrity": "sha512-0xxnQWw8rSRzu0ZOCkZaO+MJ0LkDAfwwTB2Z1SxRK6FAz5xkxD1ZUwM0WbCRni49PKubCrZYOJ6yg7tSjU7AKA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.5.tgz", + "integrity": "sha512-usvoIaog5CHEw082HXLrKAZ1qd4hIC3N/LDe2NqBgI3pkGE/7auLVM4Gn5gvyryp0x8z/IP1+d9fkGUj2OaGLQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.6.tgz", + "integrity": "sha512-IORsPp9IPWq4j4yEhTOZ6GAGi3gQwGc+4yexmTAlya+qeBRSdRnJg2iIU/aj+tcKDQYr9RQuQPgHHOdFIx//vA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.4", + "idb": "7.1.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.6.tgz", + "integrity": "sha512-Q2xC1s4L7Vpss7P7Gy6GuIS+xmJrf/vm9+gX76IK1Bo1TjoKwleCLHt1LHkPz5Rvqg5pTgzzI8qqPhBpZosFCg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/messaging": "0.12.6", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.5.tgz", + "integrity": "sha512-OzAGcWhOqEFH9GdwUuY0oC5FSlnMejcnmSAhR+EjpI7exdDvixyLyCR4txjSHYNTbumrFBG+EP8GO11CNXRaJA==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.5.tgz", + "integrity": "sha512-jJwJkVyDcIMBaVGrZ6CRGs4m5FCZsWB5QCWYI3FdsHyIa9/TfteNDilxj9wGciF2naFIHDW7TgE69U5dAH9Ktg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.5", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.5.tgz", + "integrity": "sha512-rGLqc/4OmxrS39RA9kgwa6JmgWytQuMo+B8pFhmGp3d++x2Hf9j+MLQfhOLyyUo64fNw20J19mLXhrXvKHsjZQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/installations": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.5.tgz", + "integrity": "sha512-ImkNnLuGrD/bylBHDJigSY6LMwRrwt37wQbsGZhWG4QQ6KLzHzSf0nnFRRFvkOZodEUE57Ib8l74d6Yn/6TDUQ==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + }, + "node_modules/@firebase/storage": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.1.tgz", + "integrity": "sha512-KJ5NV7FUh54TeTlEjdkTTX60ciCKOp9EqlbLnpdcXUYRJg0Z4810TXbilPc1z7fTIG4iPjtdi95bGE9n4dBX8A==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0", + "undici": "5.26.5" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.4.tgz", + "integrity": "sha512-Y0m5e2gS/wB9Ioth2X/Sgz76vcxvqgQrCmfa9qwhss/N31kxY2Gks6Frv0nrE18AjVfcSmcfDitqUwxcMOTRSg==", + "dependencies": { + "@firebase/component": "0.6.5", + "@firebase/storage": "0.12.1", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.4", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.4.tgz", + "integrity": "sha512-WLonYmS1FGHT97TsUmRN3qnTh5TeeoJp1Gg5fithzuAgdZOUtsYECfy7/noQ3llaguios8r5BuXSEiK82+UrxQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.5.tgz", + "integrity": "sha512-eSkJsnhBWv5kCTSU1tSUVl9mpFu+5NXXunZc83le8GMjMlsWwQArSc7cJJ4yl+aDFY0NGLi0AjZWMn1axOrkRg==" + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz", + "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.14.tgz", + "integrity": "sha512-nOpuzZ2G3IuMFN+UPPpKrC6NsLmWsTqSsm66IRfnBt1D4pwTqE27lmbpcPM+l2Ua4gE7PfjRHI6uedAy7hoXUw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "peer": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "peer": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "dev": true + }, + "node_modules/@mdx-js/react": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz", + "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==", + "dev": true, + "dependencies": { + "@types/mdx": "^2.0.0", + "@types/react": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@mui/base": { "version": "5.0.0-beta.34", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.34.tgz", "integrity": "sha512-e2mbTGTtReD/y5RFwnhkl1Tgl3XwgJhY040IlfkTVaU9f5LWrVhEnpRsYXu3B1CtLrwiWs4cu7aMHV9yRd4jpw==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.7", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.7", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.15.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.7.tgz", + "integrity": "sha512-AuF+Wo2Mp/edaO6vJnWjg+gj4tzEz5ChMZnAQpc22DXpSvM8ddgGcZvM7D7F99pIBoSv8ub+Iz0viL+yuGVmhg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.15.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.7" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "5.0.0-alpha.163", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.163.tgz", + "integrity": "sha512-ieOX3LFBln78jgNsBca0JUX+zAC2p6/u2P9b7rU9eZIr0AK44b5Qr8gDOWI1JfJtib4kxLGd1Msasrbxy5cMSQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.34", + "@mui/system": "^5.15.7", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.7", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": ">=5.15.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.15.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.7.tgz", + "integrity": "sha512-l6+AiKZH3iOJmZCnlpel8ghYQe9Lq0BEuKP8fGj3g5xz4arO9GydqYAtLPMvuHKtArj8lJGNuT2yHYxmejincA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.34", + "@mui/core-downloads-tracker": "^5.15.7", + "@mui/system": "^5.15.7", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.7", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material-nextjs": { + "version": "5.15.5", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/cache": "^11.11.0", + "@emotion/server": "^11.11.0", + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "next": "^13.0.0 || ^14.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/cache": { + "optional": true + }, + "@emotion/server": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.15.7", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.7.tgz", + "integrity": "sha512-bcEeeXm7GyQCQvN9dwo8htGv8/6tP05p0i02Z7GXm5EoDPlBcqTNGugsjNLoGq6B0SsdyanjJGw0Jw00o1yAOA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.7", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.15.7", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.7.tgz", + "integrity": "sha512-ixSdslOjK1kzdGcxqj7O3d14By/LPQ7EWknsViQ8RaeT863EAQemS+zvUJDTcOpkfJh6q6gPnYMIb2TJCs9eWA==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.15.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.7.tgz", + "integrity": "sha512-9alZ4/dLxsTwUOdqakgzxiL5YW6ntqj0CfzWImgWnBMTZhgGcPsbYpBLniNkkk7/jptma4/bykWXHwju/ls/pg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.7", + "@mui/styled-engine": "^5.15.7", + "@mui/types": "^7.2.13", + "@mui/utils": "^5.15.7", + "clsx": "^2.1.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.13", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.15.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.7.tgz", + "integrity": "sha512-8qhsxQRNV6aEOjjSk6YQIYJxkF5klhj8oG1FEEU4z6HV78TjNqRxMP08QGcdsibEbez+nihAaz6vu83b4XqbAg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "6.19.2", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.2.tgz", + "integrity": "sha512-/bdWZabexuz+1rKG15XryxiMGb5D0XVx65NU7CZYKm/1+HuUzc0FX9smKEa/YVZnLSNsAp6SULIyPZtAKE+3AA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0 || ^3.2.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@ndelangen/get-tarball": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", + "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", + "dev": true, + "dependencies": { + "gunzip-maybe": "^1.4.2", + "pump": "^3.0.0", + "tar-fs": "^2.1.1" + } + }, + "node_modules/@ndelangen/get-tarball/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/@ndelangen/get-tarball/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/@ndelangen/get-tarball/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@next/env": { + "version": "13.5.6", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "13.5.6", + "license": "MIT", + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.5.6", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", + "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", + "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", + "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", + "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", + "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", + "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", + "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.5.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", + "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@panva/hkdf": { + "version": "1.1.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", + "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", + "dev": true, + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@radix-ui/number": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", + "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", + "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz", + "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz", + "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", + "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz", + "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz", + "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-escape-keydown": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", + "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz", + "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", + "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz", + "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-rect": "1.0.1", + "@radix-ui/react-use-size": "1.0.1", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz", + "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz", + "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.1", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-collection": "1.0.3", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.4", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.3", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.2", + "@radix-ui/react-portal": "1.0.3", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-callback-ref": "1.0.1", + "@radix-ui/react-use-controllable-state": "1.0.1", + "@radix-ui/react-use-layout-effect": "1.0.1", + "@radix-ui/react-use-previous": "1.0.1", + "@radix-ui/react-visually-hidden": "1.0.3", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz", + "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz", + "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz", + "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-toggle": "1.0.3", + "@radix-ui/react-use-controllable-state": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz", + "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-direction": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-roving-focus": "1.0.4", + "@radix-ui/react-separator": "1.0.3", + "@radix-ui/react-toggle-group": "1.0.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", + "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", + "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", + "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-callback-ref": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", + "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz", + "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz", + "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/rect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz", + "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-use-layout-effect": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz", + "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz", + "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@react-native-community/cli": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.2.tgz", + "integrity": "sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-clean": "12.3.2", + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-doctor": "12.3.2", + "@react-native-community/cli-hermes": "12.3.2", + "@react-native-community/cli-plugin-metro": "12.3.2", + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native-community/cli-types": "12.3.2", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "react-native": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz", + "integrity": "sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "execa": "^5.0.0" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.2.tgz", + "integrity": "sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "cosmiconfig": "^5.1.0", + "deepmerge": "^4.3.0", + "glob": "^7.1.3", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "peer": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "peer": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "peer": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-config/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.2.tgz", + "integrity": "sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q==", + "peer": true, + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.2.tgz", + "integrity": "sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg==", + "peer": true, + "dependencies": { + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.10.0", + "execa": "^5.0.0", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.2.tgz", + "integrity": "sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA==", + "peer": true, + "dependencies": { + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "hermes-profile-transformer": "^0.0.6", + "ip": "^1.1.5" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.2.tgz", + "integrity": "sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.2.4", + "glob": "^7.1.3", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.2.tgz", + "integrity": "sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg==", + "peer": true, + "dependencies": { + "@react-native-community/cli-tools": "12.3.2", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.0.12", + "glob": "^7.1.3", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-plugin-metro": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.2.tgz", + "integrity": "sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g==", + "peer": true + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.2.tgz", + "integrity": "sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q==", + "peer": true, + "dependencies": { + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^7.5.1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "peer": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { + "version": "15.0.19", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", + "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "peer": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "peer": true, + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "peer": true + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.2.tgz", + "integrity": "sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ==", + "peer": true, + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.2.tgz", + "integrity": "sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog==", + "peer": true, + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.73.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", + "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", + "peer": true, + "dependencies": { + "@react-native/codegen": "0.73.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.73.21", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", + "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.73.4", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.20.0", + "flow-parser": "^0.206.0", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.73.16", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.16.tgz", + "integrity": "sha512-eNH3v3qJJF6f0n/Dck90qfC9gVOR4coAXMTdYECO33GfgjTi+73vf/SBqlXw9HICH/RNZYGPM3wca4FRF7TYeQ==", + "peer": true, + "dependencies": { + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native/dev-middleware": "0.73.7", + "@react-native/metro-babel-transformer": "0.73.15", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz", + "integrity": "sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.73.7", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz", + "integrity": "sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==", + "peer": true, + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.73.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^1.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "open": "^7.0.3", + "serve-static": "^1.13.1", + "temp-dir": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "peer": true + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.73.4", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.73.1", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.73.15", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz", + "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==", + "peer": true, + "dependencies": { + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.73.21", + "hermes-parser": "0.15.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.73.2", + "license": "MIT", + "peer": true + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.73.4", + "license": "MIT", + "peer": true, + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/@react-spring/animated": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/core": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-spring/donate" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/konva": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "konva": ">=2.6", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-konva": "^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0" + } + }, + "node_modules/@react-spring/native": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || >=17.0.0 || >=18.0.0", + "react-native": ">=0.58" + } + }, + "node_modules/@react-spring/shared": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/three": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "@react-three/fiber": ">=6.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "three": ">=0.126" + } + }, + "node_modules/@react-spring/types": { + "version": "9.7.3", + "license": "MIT" + }, + "node_modules/@react-spring/web": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@react-spring/zdog": { + "version": "9.7.3", + "license": "MIT", + "dependencies": { + "@react-spring/animated": "~9.7.3", + "@react-spring/core": "~9.7.3", + "@react-spring/shared": "~9.7.3", + "@react-spring/types": "~9.7.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-zdog": ">=1.0", + "zdog": ">=1.0" + } + }, + "node_modules/@react-three/fiber": { + "version": "8.15.13", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/react-reconciler": "^0.26.7", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^1.0.6", + "react-reconciler": "^0.27.0", + "react-use-measure": "^2.1.1", + "scheduler": "^0.21.0", + "suspend-react": "^0.1.3", + "zustand": "^3.7.1" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=18.0", + "react-dom": ">=18.0", + "react-native": ">=0.64", + "three": ">=0.133" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/scheduler": { + "version": "0.21.0", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "3.7.2", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@restart/hooks": { + "version": "0.4.15", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.6.1", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "peer": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "peer": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "peer": true + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "license": "MIT" + }, + "node_modules/@storybook/addon-actions": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.15.tgz", + "integrity": "sha512-2Jfvbahe/tmq1iNnNxmcP0JnX0rqCuijjXXai9yMDV3koIMawn6t88MPVrdcso5ch/fxE45522nZqA3SZJbM4g==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.15", + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-actions/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.15.tgz", + "integrity": "sha512-t0wWZiLHUoxP1GqSR44Zt+mI6cq17dAtpX/aC9I1xGl4xKUizmZjjX9GcH2EjcIiuKBER0ouQtQcDNyV939VvA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-controls": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.15.tgz", + "integrity": "sha512-HXcG/Lr4ri7WUFz14Y5lEBTA1XmKy0E/DepW88XVy6YNsTpERVWEBcvjKoLAU1smKrfhVto96hK2AVFL3A8EBQ==", + "dev": true, + "dependencies": { + "@storybook/blocks": "7.6.15", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.15.tgz", + "integrity": "sha512-UPODqO+mrYaKyTSAtfRslxOFgSP/v/5vfDx896pbNTC4Sf8xLytoudw4I14hzkHmRdXiOnd21FqXJfmF/Onsvw==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.3.1", + "@mdx-js/react": "^2.1.5", + "@storybook/blocks": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/components": "7.6.15", + "@storybook/csf-plugin": "7.6.15", + "@storybook/csf-tools": "7.6.15", + "@storybook/global": "^5.0.0", + "@storybook/mdx2-csf": "^1.0.0", + "@storybook/node-logger": "7.6.15", + "@storybook/postinstall": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@storybook/react-dom-shim": "7.6.15", + "@storybook/theming": "7.6.15", + "@storybook/types": "7.6.15", + "fs-extra": "^11.1.0", + "remark-external-links": "^8.0.0", + "remark-slug": "^6.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-docs/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@storybook/addon-docs/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/addon-docs/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.15.tgz", + "integrity": "sha512-m8OJtRG1/DEbFCQ1S6y/yKN3uWl9bsEn2ZsX5WcYmEt501BUbTPwpGOPyP57Q7nYYXKmWT2375Uq1qauwcD6NA==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "7.6.15", + "@storybook/addon-backgrounds": "7.6.15", + "@storybook/addon-controls": "7.6.15", + "@storybook/addon-docs": "7.6.15", + "@storybook/addon-highlight": "7.6.15", + "@storybook/addon-measure": "7.6.15", + "@storybook/addon-outline": "7.6.15", + "@storybook/addon-toolbars": "7.6.15", + "@storybook/addon-viewport": "7.6.15", + "@storybook/core-common": "7.6.15", + "@storybook/manager-api": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/preview-api": "7.6.15", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.15.tgz", + "integrity": "sha512-ptidWZJJcEM83YsxCjf+m1q8Rr9sN8piJ4PJlM2vyc4MLZY4q6htb1JJFeq3ov1Iz6SY9KjKc/zOkWo4L54nxw==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.15.tgz", + "integrity": "sha512-wg8daQcxVjfC+OtZdgWE6YVnySzYhpA7SWf+rkUugkX/fwMmsxmJ1WwAr7zW5KYY4W6uhszCVPjgwvFgpd2MTg==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.15", + "jest-mock": "^27.0.6", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@storybook/addon-links": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.15.tgz", + "integrity": "sha512-DEBlut3ofpggbm8N7n3f/Xdi6KkjKps2hnL5blz5aQ7iSJJPT683GDP2CKjhtrlrL6+uJyEHWDLoECVq2kveaQ==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-mdx-gfm": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-mdx-gfm/-/addon-mdx-gfm-7.6.15.tgz", + "integrity": "sha512-hUx1g3eVLxCbOMoZ7DxclQjqvHYEsuhA/aTF/AUaJUp8CMyM1cG2GbtlgOxURYAYhSy66VIljMxeNf9Kxxz2mA==", + "dev": true, + "dependencies": { + "@storybook/node-logger": "7.6.15", + "remark-gfm": "^3.0.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-measure": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.15.tgz", + "integrity": "sha512-3csc8Vu/wDkgpuHprl9fbKKym/+nR8HBvcALPLlH2MWnlU3DEURrj/ykRKWlp7G3F5eqDIcaIEjq6xiBZyWg7Q==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-onboarding": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@storybook/addon-onboarding/-/addon-onboarding-1.0.11.tgz", + "integrity": "sha512-0Sa7PJDsM6AANOWZX7vq3kgCbS9AZFjr3tfr3bLGfXviwIBKjoZDDdIErJkS3D4mNcDa78lYQvp3PTCKwLIJ9A==", + "dev": true, + "dependencies": { + "@storybook/telemetry": "^7.1.0", + "react-confetti": "^6.1.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/addon-outline": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.15.tgz", + "integrity": "sha512-5zYDWO0OIlFchYqSjRDmQv2mPMwAwIDTocc00FMiQAaNqPZ+3ZP9L6kOng8YgwYWpPBecoHdLvSW6rTmcufHtw==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.15.tgz", + "integrity": "sha512-QougKS2eABB5Jd332i9tBpKgh2lN4aaqXkvmVC5egT5dOuJ9IeuZbGwiALef/uf1f3IuyUP41So9l2dI4u19aw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.15.tgz", + "integrity": "sha512-0esg0+onJftU2prD3n/sbxBTrTOIGQnZhbrKPP+/S26dVHuYaR/65XdwpRgXNY5PHK2yjU78HxiJP+Kyu75ntw==", + "dev": true, + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/blocks": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.15.tgz", + "integrity": "sha512-ODP7AVh2iIGblI5WKGokWSHbp9YQHc+Uce7JCGcnDbNavoy64Z6R6G+wXzF5jfl7xQlbhQ8yQCuSSL4GNdYTeA==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/components": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/csf": "^0.1.2", + "@storybook/docs-tools": "7.6.15", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@storybook/theming": "7.6.15", + "@storybook/types": "7.6.15", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.1.8", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", + "telejson": "^7.2.0", + "tocbot": "^4.20.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@storybook/builder-manager": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.15.tgz", + "integrity": "sha512-vfpfCywiasyP7vtbgLJhjssBEwUjZhBsRsubDAzumgOochPiKKPNwsSc5NU/4ZIGaC5zRO26kUaUqFIbJdTEUQ==", + "dev": true, + "dependencies": { + "@fal-works/esbuild-plugin-global-externals": "^2.1.2", + "@storybook/core-common": "7.6.15", + "@storybook/manager": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@types/ejs": "^3.1.1", + "@types/find-cache-dir": "^3.2.1", + "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", + "browser-assert": "^1.2.1", + "ejs": "^3.1.8", + "esbuild": "^0.18.0", + "esbuild-plugin-alias": "^0.2.1", + "express": "^4.17.3", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "process": "^0.11.10", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/builder-manager/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/@storybook/builder-manager/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-manager/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@storybook/builder-manager/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/builder-manager/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-manager/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-manager/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/builder-manager/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-manager/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/builder-manager/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/builder-manager/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/builder-webpack5": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.15.tgz", + "integrity": "sha512-HF+TSK/eU2ld8uQ8VWgcAIzOQ2hjnEkzup363vGZkYUfsHsVbjMpZgf+foDjI4LZNfQ/RjcVEZxqJqIbpM0Sjg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@storybook/channels": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/core-common": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/core-webpack": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/preview": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@swc/core": "^1.3.82", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "babel-loader": "^9.0.0", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.4.1", + "express": "^4.17.3", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "swc-loader": "^0.2.3", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.1", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "node": ">=14.14" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/magic-string": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=12" } }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.7.tgz", - "integrity": "sha512-AuF+Wo2Mp/edaO6vJnWjg+gj4tzEz5ChMZnAQpc22DXpSvM8ddgGcZvM7D7F99pIBoSv8ub+Iz0viL+yuGVmhg==", + "node_modules/@storybook/builder-webpack5/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/channels": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.15.tgz", + "integrity": "sha512-UPDYRzGkygYFa8QUpEiumWrvZm4u4RKVzgiBt9C4RmHORqkkZzL9LXhaZJp2SmIz1ND5gx6KR5ze8ZnAdwxxoQ==", + "dev": true, + "dependencies": { + "@storybook/client-logger": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/global": "^5.0.0", + "qs": "^6.10.0", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1" + }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://opencollective.com/storybook" } }, - "node_modules/@mui/icons-material": { - "version": "5.15.4", - "license": "MIT", + "node_modules/@storybook/cli": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.15.tgz", + "integrity": "sha512-2QRqCyVGDSkraHxX2JPYkkFccbu5Uo+JYFaFJo4vmMXzDurjWON+Ga2B8FCTd4A8P4C02Ca/79jgQoyBB3xoew==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.23.7" + "@babel/core": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/types": "^7.23.0", + "@ndelangen/get-tarball": "^3.0.7", + "@storybook/codemod": "7.6.15", + "@storybook/core-common": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/core-server": "7.6.15", + "@storybook/csf-tools": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/telemetry": "7.6.15", + "@storybook/types": "7.6.15", + "@types/semver": "^7.3.4", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "express": "^4.17.3", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "get-npm-tarball-url": "^2.0.3", + "get-port": "^5.1.1", + "giget": "^1.0.0", + "globby": "^11.0.2", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "ora": "^5.4.1", + "prettier": "^2.8.0", + "prompts": "^2.4.0", + "puppeteer-core": "^2.1.1", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "strip-json-comments": "^3.0.1", + "tempy": "^1.0.1", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, - "engines": { - "node": ">=12.0.0" + "bin": { + "getstorybook": "bin/index.js", + "sb": "bin/index.js" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/cli/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=4" } }, - "node_modules/@mui/lab": { - "version": "5.0.0-alpha.163", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.163.tgz", - "integrity": "sha512-ieOX3LFBln78jgNsBca0JUX+zAC2p6/u2P9b7rU9eZIr0AK44b5Qr8gDOWI1JfJtib4kxLGd1Msasrbxy5cMSQ==", + "node_modules/@storybook/cli/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@storybook/cli/node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.34", - "@mui/system": "^5.15.7", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.7", - "clsx": "^2.1.0", - "prop-types": "^15.8.1" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/cli/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@storybook/cli/node_modules/jscodeshift": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.1.tgz", + "integrity": "sha512-hIJfxUy8Rt4HkJn/zZPU9ChKfKZM1342waJ1QC2e2YsPcWhM+3BJ4dcfQCzArTrk1jJeNLB341H+qOcEHRxJZg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.23.3", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" }, "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": ">=5.15.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@babel/preset-env": "^7.1.6" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { + "@babel/preset-env": { "optional": true } } }, - "node_modules/@mui/material": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.7.tgz", - "integrity": "sha512-l6+AiKZH3iOJmZCnlpel8ghYQe9Lq0BEuKP8fGj3g5xz4arO9GydqYAtLPMvuHKtArj8lJGNuT2yHYxmejincA==", + "node_modules/@storybook/cli/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.34", - "@mui/core-downloads-tracker": "^5.15.7", - "@mui/system": "^5.15.7", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.7", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@storybook/cli/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@mui/material-nextjs": { - "version": "5.15.5", - "license": "MIT", + "node_modules/@storybook/cli/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">=12.0.0" + "node": ">=10.13.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@storybook/cli/node_modules/recast": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" }, - "peerDependencies": { - "@emotion/cache": "^11.11.0", - "@emotion/server": "^11.11.0", - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "next": "^13.0.0 || ^14.0.0", - "react": "^17.0.0 || ^18.0.0" + "engines": { + "node": ">= 4" + } + }, + "node_modules/@storybook/cli/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" }, - "peerDependenciesMeta": { - "@emotion/cache": { - "optional": true - }, - "@emotion/server": { - "optional": true - }, - "@types/react": { - "optional": true - } + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@mui/private-theming": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.7.tgz", - "integrity": "sha512-bcEeeXm7GyQCQvN9dwo8htGv8/6tP05p0i02Z7GXm5EoDPlBcqTNGugsjNLoGq6B0SsdyanjJGw0Jw00o1yAOA==", + "node_modules/@storybook/cli/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/cli/node_modules/tempy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", + "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.7", - "prop-types": "^15.8.1" + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@mui/styled-engine": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.7.tgz", - "integrity": "sha512-ixSdslOjK1kzdGcxqj7O3d14By/LPQ7EWknsViQ8RaeT863EAQemS+zvUJDTcOpkfJh6q6gPnYMIb2TJCs9eWA==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/cache": "^11.11.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" + "node_modules/@storybook/cli/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@storybook/cli/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=12.0.0" + "node": ">= 10.0.0" + } + }, + "node_modules/@storybook/client-logger": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.15.tgz", + "integrity": "sha512-n+K8IqnombqiQNnywVovS+lK61tvv/XSfgPt0cgvoF/hJZB0VDOMRjWsV+v9qQpj1TQEl1lLWeJwZMthTWupJA==", + "dev": true, + "dependencies": { + "@storybook/global": "^5.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } + "url": "https://opencollective.com/storybook" } }, - "node_modules/@mui/system": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.7.tgz", - "integrity": "sha512-9alZ4/dLxsTwUOdqakgzxiL5YW6ntqj0CfzWImgWnBMTZhgGcPsbYpBLniNkkk7/jptma4/bykWXHwju/ls/pg==", + "node_modules/@storybook/codemod": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.15.tgz", + "integrity": "sha512-NiEbTLCdacj6TMxC7G49IImXeMzkG8wpPr8Ayxm9HeG6q5UkiF5/DiZdqbJm2zaosOsOKWwvXg1t6Pq6Nivytg==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.7", - "@mui/styled-engine": "^5.15.7", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.7", - "clsx": "^2.1.0", - "csstype": "^3.1.2", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=12.0.0" + "@babel/core": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.2", + "@storybook/csf-tools": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/types": "7.6.15", + "@types/cross-spawn": "^6.0.2", + "cross-spawn": "^7.0.3", + "globby": "^11.0.2", + "jscodeshift": "^0.15.1", + "lodash": "^4.17.21", + "prettier": "^2.8.0", + "recast": "^0.23.1" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/codemod/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } + "engines": { + "node": ">=4" } }, - "node_modules/@mui/types": { - "version": "7.2.13", - "license": "MIT", + "node_modules/@storybook/codemod/node_modules/jscodeshift": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.1.tgz", + "integrity": "sha512-hIJfxUy8Rt4HkJn/zZPU9ChKfKZM1342waJ1QC2e2YsPcWhM+3BJ4dcfQCzArTrk1jJeNLB341H+qOcEHRxJZg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/preset-flow": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@babel/register": "^7.22.15", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.23.3", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@babel/preset-env": "^7.1.6" }, "peerDependenciesMeta": { - "@types/react": { + "@babel/preset-env": { "optional": true } } }, - "node_modules/@mui/utils": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.7.tgz", - "integrity": "sha512-8qhsxQRNV6aEOjjSk6YQIYJxkF5klhj8oG1FEEU4z6HV78TjNqRxMP08QGcdsibEbez+nihAaz6vu83b4XqbAg==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "node_modules/@storybook/codemod/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=10.13.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@mui/x-date-pickers": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.19.2.tgz", - "integrity": "sha512-/bdWZabexuz+1rKG15XryxiMGb5D0XVx65NU7CZYKm/1+HuUzc0FX9smKEa/YVZnLSNsAp6SULIyPZtAKE+3AA==", + "node_modules/@storybook/codemod/node_modules/recast": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.23.2", - "@mui/base": "^5.0.0-beta.22", - "@mui/utils": "^5.14.16", - "@types/react-transition-group": "^4.4.8", - "clsx": "^2.0.0", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" + "assert": "^2.0.0", + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" }, "engines": { - "node": ">=14.0.0" + "node": ">= 4" + } + }, + "node_modules/@storybook/codemod/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@storybook/components": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.15.tgz", + "integrity": "sha512-xD+maP7+C9HeZXi2vJ+uK9hXN4S4spP4uDj9pyZ9yViKb+ztEO6WpovUMT8WRQ0mMegWyLXkx3zqu43hZvXM1g==", + "dev": true, + "dependencies": { + "@radix-ui/react-select": "^1.2.2", + "@radix-ui/react-toolbar": "^1.0.4", + "@storybook/client-logger": "7.6.15", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/theming": "7.6.15", + "@storybook/types": "7.6.15", + "memoizerific": "^1.11.3", + "use-resize-observer": "^9.1.0", + "util-deprecate": "^1.0.2" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.8.6", - "@mui/system": "^5.8.0", - "date-fns": "^2.25.0 || ^3.2.0", - "date-fns-jalali": "^2.13.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - }, - "moment-hijri": { - "optional": true - }, - "moment-jalaali": { - "optional": true - } + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@next/env": { - "version": "13.5.6", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.5.6", - "license": "MIT", + "node_modules/@storybook/core-client": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.15.tgz", + "integrity": "sha512-jwWol+zo+ItKBzPm9i80bEL6seHMsV0wKSaViVMQ4TqHtEbNeFE8sFEc2NTr18VNBnQOdlQPnEWmdboXBUrGcA==", + "dev": true, "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.6", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "@storybook/client-logger": "7.6.15", + "@storybook/preview-api": "7.6.15" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@next/swc-darwin-x64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", - "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" + "node_modules/@storybook/core-common": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.15.tgz", + "integrity": "sha512-VGmcLJ5U1r1s8/YnLbKcyB4GnNL+/sZIPqwlcSKzDXO76HoVFv1kywf7PbASote7P3gdhLSxBdg95LH2bdIbmw==", + "dev": true, + "dependencies": { + "@storybook/core-events": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/types": "7.6.15", + "@types/find-cache-dir": "^3.2.1", + "@types/node": "^18.0.0", + "@types/node-fetch": "^2.6.4", + "@types/pretty-hrtime": "^1.0.0", + "chalk": "^4.1.0", + "esbuild": "^0.18.0", + "esbuild-register": "^3.5.0", + "file-system-cache": "2.3.0", + "find-cache-dir": "^3.0.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "glob": "^10.0.0", + "handlebars": "^4.7.7", + "lazy-universal-dotenv": "^4.0.0", + "node-fetch": "^2.0.0", + "picomatch": "^2.3.0", + "pkg-dir": "^5.0.0", + "pretty-hrtime": "^1.0.3", + "resolve-from": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", - "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" + "node_modules/@storybook/core-common/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", - "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@storybook/core-common/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", - "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", - "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=8" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", - "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/@storybook/core-common/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=14.14" } }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", - "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/@storybook/core-common/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "engines": { - "node": ">= 10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", - "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@storybook/core-common/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "license": "MIT", + "node_modules/@storybook/core-common/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "license": "MIT", + "node_modules/@storybook/core-common/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", + "node_modules/@storybook/core-common/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/@panva/hkdf": { - "version": "1.1.1", - "license": "MIT", + "node": ">=6" + }, "funding": { - "url": "https://github.com/sponsors/panva" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "node_modules/@storybook/core-common/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@react-native-community/cli": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-common/node_modules/pkg-dir": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, "dependencies": { - "@react-native-community/cli-clean": "12.3.0", - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-doctor": "12.3.0", - "@react-native-community/cli-hermes": "12.3.0", - "@react-native-community/cli-plugin-metro": "12.3.0", - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native-community/cli-types": "12.3.0", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" + "find-up": "^5.0.0" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@storybook/core-common/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/core-common/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { - "react-native": "build/bin.js" - }, + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/core-common/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=18" + "node": ">= 10.0.0" } }, - "node_modules/@react-native-community/cli-clean": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-events": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.15.tgz", + "integrity": "sha512-i4YnjGecbpGyrFe0340sPhQ9QjZZEBqvMy6kF4XWt6DYLHxZmsTj1HEdvxVl4Ej7V49Vw0Dm8MepJ1d4Y8MKrQ==", + "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "execa": "^5.0.0" + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-community/cli-config": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-server": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.15.tgz", + "integrity": "sha512-iIlxEAkrmKTSA3iGNqt/4QG7hf5suxBGYIB3DZAOfBo8EdZogMYaEmuCm5dbuaJr0mcVwlqwdhQiWb1VsR/NhA==", + "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "glob": "^7.1.3", - "joi": "^17.2.1" + "@aw-web-design/x-default-browser": "1.4.126", + "@discoveryjs/json-ext": "^0.5.3", + "@storybook/builder-manager": "7.6.15", + "@storybook/channels": "7.6.15", + "@storybook/core-common": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/csf": "^0.1.2", + "@storybook/csf-tools": "7.6.15", + "@storybook/docs-mdx": "^0.1.0", + "@storybook/global": "^5.0.0", + "@storybook/manager": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@storybook/telemetry": "7.6.15", + "@storybook/types": "7.6.15", + "@types/detect-port": "^1.3.0", + "@types/node": "^18.0.0", + "@types/pretty-hrtime": "^1.0.0", + "@types/semver": "^7.3.4", + "better-opn": "^3.0.2", + "chalk": "^4.1.0", + "cli-table3": "^0.6.1", + "compression": "^1.7.4", + "detect-port": "^1.3.0", + "express": "^4.17.3", + "fs-extra": "^11.1.0", + "globby": "^11.0.2", + "ip": "^2.0.0", + "lodash": "^4.17.21", + "open": "^8.4.0", + "pretty-hrtime": "^1.0.3", + "prompts": "^2.4.0", + "read-pkg-up": "^7.0.1", + "semver": "^7.3.7", + "telejson": "^7.2.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "watchpack": "^2.2.0", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-community/cli-config/node_modules/argparse": { - "version": "1.0.10", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-server/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, "dependencies": { - "sprintf-js": "~1.0.2" + "undici-types": "~5.26.4" } }, - "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": { - "version": "5.2.1", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-server/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=14.14" } }, - "node_modules/@react-native-community/cli-config/node_modules/import-fresh": { + "node_modules/@storybook/core-server/node_modules/ip": { "version": "2.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/@storybook/core-server/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "universalify": "^2.0.0" }, - "engines": { - "node": ">=4" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@react-native-community/cli-config/node_modules/js-yaml": { - "version": "3.14.1", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-server/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli-config/node_modules/parse-json": { - "version": "4.0.0", - "license": "MIT", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, + "node_modules/@storybook/core-server/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=4" + "node": ">= 10.0.0" } }, - "node_modules/@react-native-community/cli-config/node_modules/resolve-from": { - "version": "3.0.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-webpack": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.15.tgz", + "integrity": "sha512-6Qk/kc7OKcy4jNowQFz6TFLWM2NYeLoJ73dIbFnN2o8DYS5WwmQLZhZ+MRvr92M+w1nlnc268kaqooYmAj8Mnw==", + "dev": true, "dependencies": { - "serve-static": "^1.13.1" + "@storybook/core-common": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/types": "7.6.15", + "@types/node": "^18.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-community/cli-doctor": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/core-webpack/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, "dependencies": { - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" + "undici-types": "~5.26.4" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/ansi-regex": { - "version": "4.1.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "node_modules/@storybook/csf": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz", + "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==", + "dev": true, + "dependencies": { + "type-fest": "^2.19.0" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/strip-ansi": { - "version": "5.2.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/csf-plugin": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.15.tgz", + "integrity": "sha512-5Pm2B8XKNdG3fHyItWKbWnXHSRDFSvetlML+sMWGWYIjwOsnvPqt+gAvLksWhv/uJgDujGxNcPEh+/Y5C8ZAjQ==", + "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "@storybook/csf-tools": "7.6.15", + "unplugin": "^1.3.1" }, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/yaml": { - "version": "2.3.4", - "license": "ISC", - "peer": true, + "node_modules/@storybook/csf-tools": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.15.tgz", + "integrity": "sha512-8iKgg2cmbFTpVhRRJOqouhPcEh0c8ywabG4S8ICZvnJooSXUI9mD9p3tYCS7MYuSiHj0epa1Kkn9DtXJRo9o6g==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "@storybook/csf": "^0.1.2", + "@storybook/types": "7.6.15", + "fs-extra": "^11.1.0", + "recast": "^0.23.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/csf-tools/node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, "engines": { - "node": ">= 14" + "node": ">=4" } }, - "node_modules/@react-native-community/cli-hermes": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/csf-tools/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6", - "ip": "^1.1.5" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/csf-tools/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.2.4", - "glob": "^7.1.3", - "logkitty": "^0.7.1" + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/csf-tools/node_modules/recast": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", + "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-xml-parser": "^4.0.12", - "glob": "^7.1.3", - "ora": "^5.4.1" + "assert": "^2.0.0", + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" } }, - "node_modules/@react-native-community/cli-plugin-metro": { - "version": "12.3.0", - "license": "MIT", - "peer": true + "node_modules/@storybook/csf-tools/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@react-native-community/cli-server-api": { - "version": "12.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^7.5.1" + "node_modules/@storybook/csf-tools/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "version": "26.6.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, + "node_modules/@storybook/csf/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "engines": { - "node": ">= 10.14.2" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "version": "15.0.19", - "license": "MIT", - "peer": true, + "node_modules/@storybook/docs-mdx": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", + "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==", + "dev": true + }, + "node_modules/@storybook/docs-tools": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.15.tgz", + "integrity": "sha512-npZEaI9Wpn9uJcRXFElqyiRw8bSxt95mLywPiEEGMT2kE5FfXM8d5Uj5O64kzoXdRI9IhRPEEZZidOtA/UInfQ==", + "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "@storybook/core-common": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@storybook/types": "7.6.15", + "@types/doctrine": "^0.0.3", + "assert": "^2.1.0", + "doctrine": "^3.0.0", + "lodash": "^4.17.21" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "version": "26.6.2", - "license": "MIT", - "peer": true, + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", + "dev": true + }, + "node_modules/@storybook/instrumenter": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-7.6.15.tgz", + "integrity": "sha512-m9T0Ym4QCAzPBGjUFMXNbBjWfkEzUVKFzlU7bI9D5KcpjXEFUbaOZaaBFIhyZcRPlsAsEmb3lVlPOU5X4Z9P7g==", + "dev": true, "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "@storybook/channels": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "7.6.15", + "@vitest/utils": "^0.34.6", + "util": "^0.12.4" }, - "engines": { - "node": ">= 10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "version": "17.0.2", - "license": "MIT", - "peer": true + "node_modules/@storybook/manager": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.15.tgz", + "integrity": "sha512-GGV2ElV5AOIApy/FSDzoSlLUbyd2VhQVD3TdNGRxNauYRjEO8ulXHw2tNbT6ludtpYpDTAILzI6zT/iag8hmPQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/manager-api": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.15.tgz", + "integrity": "sha512-cPBsXcnJiaO3QyaEum2JgdihYea3cI03FeV35JdrBYLIelT4oqbYFnzjznsFg9+Ia9iAbz7aOBNyyRsWnC/UKw==", + "dev": true, + "dependencies": { + "@storybook/channels": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/router": "7.6.15", + "@storybook/theming": "7.6.15", + "@storybook/types": "7.6.15", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "store2": "^2.14.2", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "7.5.9", - "license": "MIT", - "peer": true, + "node_modules/@storybook/mdx2-csf": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz", + "integrity": "sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==", + "dev": true + }, + "node_modules/@storybook/nextjs": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/nextjs/-/nextjs-7.6.15.tgz", + "integrity": "sha512-TeZctQvtkuuaabqurwAuBMs8LIVrdazXTTmjsjHNkv/0JV3ORqKk91gf2phfXiOeXQMCyhSYqx6Hl1aRJE3hfQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.2", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-runtime": "^7.23.2", + "@babel/preset-env": "^7.23.2", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.2", + "@babel/runtime": "^7.23.2", + "@storybook/addon-actions": "7.6.15", + "@storybook/builder-webpack5": "7.6.15", + "@storybook/core-common": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/preset-react-webpack": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@storybook/react": "7.6.15", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "css-loader": "^6.7.3", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "image-size": "^1.0.0", + "loader-utils": "^3.2.1", + "node-polyfill-webpack-plugin": "^2.0.1", + "pnp-webpack-plugin": "^1.7.0", + "postcss": "^8.4.21", + "postcss-loader": "^7.0.2", + "resolve-url-loader": "^5.0.0", + "sass-loader": "^12.4.0", + "semver": "^7.3.5", + "sharp": "^0.32.6", + "style-loader": "^3.3.1", + "styled-jsx": "5.1.1", + "ts-dedent": "^2.0.0", + "tsconfig-paths": "^4.0.0", + "tsconfig-paths-webpack-plugin": "^4.0.1" + }, "engines": { - "node": ">=8.3.0" + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "@next/font": "^13.0.0|| ^14.0.0", + "next": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "bufferutil": { + "@next/font": { "optional": true }, - "utf-8-validate": { + "typescript": { + "optional": true + }, + "webpack": { "optional": true } } }, - "node_modules/@react-native-community/cli-tools": { - "version": "12.3.0", - "license": "MIT", - "peer": true, - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" - } - }, - "node_modules/@react-native-community/cli-types": { - "version": "12.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/nextjs/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, "dependencies": { - "joi": "^17.2.1" + "undici-types": "~5.26.4" } }, - "node_modules/@react-native-community/cli/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/nextjs/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.14" } }, - "node_modules/@react-native-community/cli/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/nextjs/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "universalify": "^2.0.0" }, - "engines": { - "node": ">=8" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@react-native-community/cli/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "peer": true, + "node_modules/@storybook/nextjs/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, "dependencies": { - "p-try": "^2.0.0" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "node_modules/@storybook/nextjs/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=8" + "node": ">= 10.0.0" } }, - "node_modules/@react-native/assets-registry": { - "version": "0.73.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "node_modules/@storybook/node-logger": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.15.tgz", + "integrity": "sha512-C+sCvRjR+5uVU3VTrfyv7/RlPBxesAjIucUAK0keGyIZ7sFQYCPdkm4m/C4s+TcubgAzVvuoUHlRrSppdA7WzQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.73.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native/codegen": "0.73.2" - }, - "engines": { - "node": ">=18" + "node_modules/@storybook/postinstall": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.15.tgz", + "integrity": "sha512-DXQQ4kjAbQ7BSd9M4lDI/12vEEciYMP8uYFDlrPFjwD9LezsxtRiORkazjNRRX4730faO5zZsnWhXxCVkxck0g==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/babel-preset": { - "version": "0.73.19", - "license": "MIT", - "peer": true, + "node_modules/@storybook/preset-react-webpack": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.15.tgz", + "integrity": "sha512-Oo3J7RKO/tFUVnRXs16tZGcX6n90gTpHdlT2Z1fZ+y8wEd9o+VvvKFEIIeMcRxf3hHa49R6Kbc4AQaE9FAuDlw==", + "dev": true, "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.73.2", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" + "@babel/preset-flow": "^7.22.15", + "@babel/preset-react": "^7.22.15", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@storybook/core-webpack": "7.6.15", + "@storybook/docs-tools": "7.6.15", + "@storybook/node-logger": "7.6.15", + "@storybook/react": "7.6.15", + "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0", + "@types/node": "^18.0.0", + "@types/semver": "^7.3.4", + "babel-plugin-add-react-displayname": "^0.0.5", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.5", + "react-docgen": "^7.0.0", + "react-refresh": "^0.14.0", + "semver": "^7.3.7", + "webpack": "5" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.73.2", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.0", - "flow-parser": "^0.206.0", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.73.12", - "license": "MIT", - "peer": true, - "dependencies": { - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native/dev-middleware": "0.73.7", - "@react-native/metro-babel-transformer": "0.73.13", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" + "@babel/core": "^7.22.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.73.3", - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=18" + "node_modules/@storybook/preset-react-webpack/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" } }, - "node_modules/@react-native/dev-middleware": { - "version": "0.73.7", - "license": "MIT", - "peer": true, + "node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.73.3", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^1.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "open": "^7.0.3", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=18" + "node": ">=14.14" } }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, + "node_modules/@storybook/preset-react-webpack/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "license": "MIT", - "peer": true, + "node_modules/@storybook/preset-react-webpack/node_modules/magic-string": { + "version": "0.30.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz", + "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==", + "dev": true, "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.73.4", - "license": "MIT", - "peer": true, + "node_modules/@storybook/preset-react-webpack/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">=18" + "node": ">= 10.0.0" } }, - "node_modules/@react-native/js-polyfills": { - "version": "0.73.1", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" + "node_modules/@storybook/preview": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.15.tgz", + "integrity": "sha512-q8d9v0+Bo/DHLV68OyV3Klep4knf2GAbrlHhLW1X4jlPccuEDUojIfqfK7m48ayeIxJzO48fcO0JdKM1XABx7g==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.73.13", - "license": "MIT", - "peer": true, + "node_modules/@storybook/preview-api": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz", + "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==", + "dev": true, "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.73.19", - "hermes-parser": "0.15.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" + "@storybook/channels": "7.6.15", + "@storybook/client-logger": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/csf": "^0.1.2", + "@storybook/global": "^5.0.0", + "@storybook/types": "7.6.15", + "@types/qs": "^6.9.5", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "memoizerific": "^1.11.3", + "qs": "^6.10.0", + "synchronous-promise": "^2.0.15", + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, - "peerDependencies": { - "@babel/core": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@react-native/normalize-colors": { - "version": "0.73.2", - "license": "MIT", - "peer": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.73.4", - "license": "MIT", - "peer": true, + "node_modules/@storybook/react": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.15.tgz", + "integrity": "sha512-oJMSh4iTGu6OqCmj0LhkuPyMkxGMTCoohN4HcDpXd96jCSyWotVebRsg9xm5ddB7f54e6DY4XDoGH0WnVoR23g==", + "dev": true, "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" + "@storybook/client-logger": "7.6.15", + "@storybook/core-client": "7.6.15", + "@storybook/docs-tools": "7.6.15", + "@storybook/global": "^5.0.0", + "@storybook/preview-api": "7.6.15", + "@storybook/react-dom-shim": "7.6.15", + "@storybook/types": "7.6.15", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^18.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.21", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react-native": "*" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@react-spring/animated": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin": { + "version": "1.0.6--canary.9.0c3f3b7.0", + "resolved": "https://registry.npmjs.org/@storybook/react-docgen-typescript-plugin/-/react-docgen-typescript-plugin-1.0.6--canary.9.0c3f3b7.0.tgz", + "integrity": "sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==", + "dev": true, "dependencies": { - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "debug": "^4.1.1", + "endent": "^2.0.1", + "find-cache-dir": "^3.3.1", + "flat-cache": "^3.0.4", + "micromatch": "^4.0.2", + "react-docgen-typescript": "^2.2.2", + "tslib": "^2.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "typescript": ">= 4.x", + "webpack": ">= 4" } }, - "node_modules/@react-spring/core": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" + "engines": { + "node": ">=8" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@react-spring/konva": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "peerDependencies": { - "konva": ">=2.6", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-konva": "^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0" + "engines": { + "node": ">=8" } }, - "node_modules/@react-spring/native": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "p-locate": "^4.1.0" }, - "peerDependencies": { - "react": "^16.8.0 || >=17.0.0 || >=18.0.0", - "react-native": ">=0.58" + "engines": { + "node": ">=8" } }, - "node_modules/@react-spring/shared": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { - "@react-spring/types": "~9.7.3" + "semver": "^6.0.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-spring/three": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "p-try": "^2.0.0" }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-spring/types": { - "version": "9.7.3", - "license": "MIT" - }, - "node_modules/@react-spring/web": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "p-limit": "^2.2.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=8" } }, - "node_modules/@react-spring/zdog": { - "version": "9.7.3", - "license": "MIT", + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { - "@react-spring/animated": "~9.7.3", - "@react-spring/core": "~9.7.3", - "@react-spring/shared": "~9.7.3", - "@react-spring/types": "~9.7.3" + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@storybook/react-docgen-typescript-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.15.tgz", + "integrity": "sha512-2+X0HIxIyvjfSKVyGGjSJJLEFJ2ox7Rr8FjlMiRo5QfoOJhohZuWH7p4Lw7JMwm5PotnjrwlfsZI3cCilYJeYA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-zdog": ">=1.0", - "zdog": ">=1.0" + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@react-three/fiber": { - "version": "8.15.13", - "license": "MIT", - "peer": true, + "node_modules/@storybook/react/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@storybook/react/node_modules/@types/node": { + "version": "18.19.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.15.tgz", + "integrity": "sha512-AMZ2UWx+woHNfM11PyAEQmfSxi05jm9OlkxczuHeEqmvwPkYj6MWv44gbzDPefYOLysTOFyI3ziiy2ONmUZfpA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "react-use-measure": "^2.1.1", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } + "undici-types": "~5.26.4" } }, - "node_modules/@react-three/fiber/node_modules/scheduler": { - "version": "0.21.0", - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" + "node_modules/@storybook/react/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@react-three/fiber/node_modules/zustand": { - "version": "3.7.2", - "license": "MIT", - "peer": true, + "node_modules/@storybook/react/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" + "node": ">=12.20" }, - "peerDependenciesMeta": { - "react": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@restart/hooks": { - "version": "0.4.15", - "license": "MIT", + "node_modules/@storybook/router": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.15.tgz", + "integrity": "sha512-5yhXXoVZ1iKUgeZoO8PGqBclrLgoJisxIYVK/Y1iJMXZ2ZvwUiTswLALT6lu97tSrcoBVxmqSghg0+U0YEU4Fg==", + "dev": true, "dependencies": { - "dequal": "^2.0.3" + "@storybook/client-logger": "7.6.15", + "memoizerific": "^1.11.3", + "qs": "^6.10.0" }, - "peerDependencies": { - "react": ">=16.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "license": "MIT", + "node_modules/@storybook/telemetry": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.15.tgz", + "integrity": "sha512-klhKXLUS3OXozGEtMbbhKZLDfm+m3nNk2jvGwD6kkBenzFUzb0P2m8awxU7h1pBcKZKH/27U9t3KVzNFzWoWPw==", + "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" + "@storybook/client-logger": "7.6.15", + "@storybook/core-common": "7.6.15", + "@storybook/csf-tools": "7.6.15", + "chalk": "^4.1.0", + "detect-package-manager": "^2.0.1", + "fetch-retry": "^5.0.2", + "fs-extra": "^11.1.0", + "read-pkg-up": "^7.0.1" }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "license": "MIT", + "node_modules/@storybook/telemetry/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "node": ">=14.14" } }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "license": "MIT", + "node_modules/@storybook/telemetry/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" + "universalify": "^2.0.0" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, + "node_modules/@storybook/telemetry/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "license": "MIT" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.6.1", - "license": "MIT" - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/@storybook/test": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-7.6.15.tgz", + "integrity": "sha512-g72wXIO413tAGuvOhCHeBEpzbRc0TB8koJ/tDNVQa3k05RNA+R5cZLXguXOD6f4PUK7+pD0m79tQGRl7JdFNKA==", + "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0" + "@storybook/client-logger": "7.6.15", + "@storybook/core-events": "7.6.15", + "@storybook/instrumenter": "7.6.15", + "@storybook/preview-api": "7.6.15", + "@testing-library/dom": "^9.3.1", + "@testing-library/jest-dom": "^6.1.3", + "@testing-library/user-event": "14.3.0", + "@types/chai": "^4", + "@vitest/expect": "^0.34.2", + "@vitest/spy": "^0.34.1", + "chai": "^4.3.7", + "util": "^0.12.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "license": "MIT", - "peer": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/@storybook/theming": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.15.tgz", + "integrity": "sha512-9PpsHAbUf6o0w33/P3mnb7QheTmfGlTYCismj5HMM1O2/zY0kQK9XcG9W+Cyvu56D/lFC19fz9YHQY8W4AbfnQ==", + "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@storybook/client-logger": "7.6.15", + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/@storybook/types": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.15.tgz", + "integrity": "sha512-tLH0lK6SXECSfMpKin9bge+7XiHZII17n6jc9ZI1TfSBZJyq3M6VzWh2r1C2lC97FlkcKXjIwM3n8h1xNjnI+A==", + "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@storybook/channels": "7.6.15", + "@types/babel__core": "^7.0.0", + "@types/express": "^4.7.0", + "file-system-cache": "2.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "license": "MIT" - }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "license": "Apache-2.0", @@ -4091,45 +8628,166 @@ "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", "dev": true, "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, "engines": { "node": ">=14" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, "engines": { "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "node_modules/@svgr/plugin-jsx": { "version": "8.1.0", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, "engines": { "node": ">=14" }, @@ -4138,59 +8796,67 @@ "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@svgr/core": "*" } }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", "dev": true, "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@svgr/core": "*" } }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.3.6", "dev": true, "license": "MIT", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { "node": ">=14" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@svgr/core": { + "node_modules/@svgr/webpack": { "version": "8.1.0", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { "node": ">=14" @@ -4200,140 +8866,358 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", + "node_modules/@swc/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz", + "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==", "dev": true, - "license": "MIT", + "hasInstallScript": true, "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.4.1", + "@swc/core-darwin-x64": "1.4.1", + "@swc/core-linux-arm-gnueabihf": "1.4.1", + "@swc/core-linux-arm64-gnu": "1.4.1", + "@swc/core-linux-arm64-musl": "1.4.1", + "@swc/core-linux-x64-gnu": "1.4.1", + "@swc/core-linux-x64-musl": "1.4.1", + "@swc/core-win32-arm64-msvc": "1.4.1", + "@swc/core-win32-ia32-msvc": "1.4.1", + "@swc/core-win32-x64-msvc": "1.4.1" }, "peerDependencies": { - "typescript": ">=4.9.5" + "@swc/helpers": "^0.5.0" }, "peerDependenciesMeta": { - "typescript": { + "@swc/helpers": { "optional": true } } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", + "node_modules/@swc/core-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz", + "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.2", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, "engines": { "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, "engines": { - "node": ">=14" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, - "license": "MIT", "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "8.3.6", + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", + "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", "dev": true, - "license": "MIT", "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" + "@adobe/css-tools": "^4.3.2", + "@babel/runtime": "^7.9.2", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.15", + "redent": "^3.0.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" }, "peerDependencies": { - "typescript": ">=4.9.5" + "@jest/globals": ">= 28", + "@types/bun": "latest", + "@types/jest": ">= 28", + "jest": ">= 28", + "vitest": ">= 0.32" }, "peerDependenciesMeta": { - "typescript": { + "@jest/globals": { + "optional": true + }, + "@types/bun": { + "optional": true + }, + "@types/jest": { + "optional": true + }, + "jest": { + "optional": true + }, + "vitest": { "optional": true } } }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8" } }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.4.0" + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/@testing-library/user-event": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.3.0.tgz", + "integrity": "sha512-P02xtBBa8yMaLhK8CzJCIns8rqwnF6FxhR9zs810flHOBXUYCFjLd8Io1rQrAkQRWEmW2PGdZIEdMxf/KLsqFA==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, "node_modules/@toast-ui/editor": { @@ -4358,10 +9242,91 @@ "node": ">=10.13.0" } }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "devOptional": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "devOptional": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "license": "MIT" }, + "node_modules/@types/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/date-arithmetic": { "version": "4.1.4", "dev": true, @@ -4374,10 +9339,39 @@ "@types/ms": "*" } }, + "node_modules/@types/detect-port": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", + "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", + "dev": true + }, + "node_modules/@types/doctrine": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", + "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", + "dev": true + }, + "node_modules/@types/ejs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", + "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", + "dev": true + }, + "node_modules/@types/emscripten": { + "version": "1.39.10", + "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz", + "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==", + "dev": true + }, + "node_modules/@types/escodegen": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz", + "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==", + "dev": true + }, "node_modules/@types/eslint": { "version": "8.56.2", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -4386,7 +9380,6 @@ "node_modules/@types/eslint-scope": { "version": "3.7.7", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -4394,8 +9387,37 @@ }, "node_modules/@types/estree": { "version": "1.0.5", - "license": "MIT", - "peer": true + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/find-cache-dir": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz", + "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==", + "dev": true }, "node_modules/@types/glob": { "version": "7.2.0", @@ -4405,6 +9427,15 @@ "@types/node": "*" } }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/hast": { "version": "2.3.9", "license": "MIT", @@ -4420,15 +9451,25 @@ "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "license": "MIT", - "peer": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } @@ -4436,7 +9477,6 @@ "node_modules/@types/istanbul-reports": { "version": "3.0.4", "license": "MIT", - "peer": true, "dependencies": { "@types/istanbul-lib-report": "*" } @@ -4461,6 +9501,24 @@ "@types/unist": "^2" } }, + "node_modules/@types/mdx": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", + "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/mime-types": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", + "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", + "dev": true + }, "node_modules/@types/minimatch": { "version": "5.1.2", "license": "MIT" @@ -4473,6 +9531,22 @@ "version": "20.5.3", "license": "MIT" }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.2", "license": "MIT" @@ -4481,6 +9555,12 @@ "version": "6.0.3", "license": "MIT" }, + "node_modules/@types/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==", + "dev": true + }, "node_modules/@types/prismjs": { "version": "1.26.3", "license": "MIT" @@ -4489,6 +9569,18 @@ "version": "15.7.11", "license": "MIT" }, + "node_modules/@types/qs": { + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, "node_modules/@types/react": { "version": "18.2.21", "license": "MIT", @@ -4562,6 +9654,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "license": "MIT", @@ -4575,6 +9688,12 @@ "version": "2.0.10", "license": "MIT" }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, "node_modules/@types/warning": { "version": "3.0.3", "license": "MIT" @@ -4599,15 +9718,13 @@ "node_modules/@types/yargs": { "version": "17.0.32", "license": "MIT", - "peer": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.18.1", @@ -4830,10 +9947,75 @@ "version": "1.2.0", "license": "ISC" }, + "node_modules/@vitest/expect": { + "version": "0.34.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.7.tgz", + "integrity": "sha512-G9iEtwrD6ZQ4MVHZufif9Iqz3eLtuwBBNx971fNAGPaugM7ftAWjQN+ob2zWhtzURp8RK3zGXOxVb01mFo3zAQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.7", + "@vitest/utils": "0.34.7", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.34.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.7.tgz", + "integrity": "sha512-NMMSzOY2d8L0mcOt4XcliDOS1ISyGlAXuQtERWVOoVHnKwmG+kKhinAiGw3dTtMQWybfa89FG8Ucg9tiC/FhTQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.7.tgz", + "integrity": "sha512-ziAavQLpCYS9sLOorGrFFKmy2gnfiNU0ZJ15TsMz/K92NAPS/rp9K4z6AJQQk5Y8adCy4Iwpxy7pQumQ/psnRg==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4841,23 +10023,19 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4866,13 +10044,11 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4883,7 +10059,6 @@ "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4891,20 +10066,17 @@ "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", "license": "Apache-2.0", - "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4919,7 +10091,6 @@ "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -4931,7 +10102,6 @@ "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4942,7 +10112,6 @@ "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4955,7 +10124,6 @@ "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", "license": "MIT", - "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -4963,18 +10131,68 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/esbuild-plugin-pnp": { + "version": "3.0.0-rc.15", + "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz", + "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==", + "dev": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "esbuild": ">=0.10.0" + } + }, + "node_modules/@yarnpkg/fslib": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", + "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==", + "dev": true, + "dependencies": { + "@yarnpkg/libzip": "^2.3.0", + "tslib": "^1.13.0" + }, + "engines": { + "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + } + }, + "node_modules/@yarnpkg/fslib/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@yarnpkg/libzip": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", + "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", + "dev": true, + "dependencies": { + "@types/emscripten": "^1.39.6", + "tslib": "^1.13.0" + }, + "engines": { + "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + } + }, + "node_modules/@yarnpkg/libzip/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/abort-controller": { "version": "3.0.0", "license": "MIT", - "peer": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -4984,8 +10202,8 @@ }, "node_modules/accepts": { "version": "1.3.8", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5007,7 +10225,6 @@ "node_modules/acorn-import-assertions": { "version": "1.9.0", "license": "MIT", - "peer": true, "peerDependencies": { "acorn": "^8" } @@ -5019,6 +10236,51 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/agent-base": { "version": "7.1.0", "license": "MIT", @@ -5029,6 +10291,19 @@ "node": ">= 14" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ajv": { "version": "6.12.6", "license": "MIT", @@ -5043,6 +10318,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/ajv-keywords": { "version": "3.5.2", "license": "MIT", @@ -5057,7 +10371,8 @@ }, "node_modules/ansi-fragments": { "version": "0.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", "peer": true, "dependencies": { "colorette": "^1.0.7", @@ -5067,7 +10382,8 @@ }, "node_modules/ansi-fragments/node_modules/ansi-regex": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "peer": true, "engines": { "node": ">=6" @@ -5075,7 +10391,8 @@ }, "node_modules/ansi-fragments/node_modules/strip-ansi": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -5084,6 +10401,18 @@ "node": ">=6" } }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -5115,15 +10444,34 @@ "node": ">= 8" } }, + "node_modules/app-root-dir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", + "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", + "dev": true + }, "node_modules/appdirsjs": { "version": "1.2.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", "peer": true }, "node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/aria-query": { "version": "5.3.0", "license": "Apache-2.0", @@ -5142,6 +10490,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, "node_modules/array-includes": { "version": "3.1.7", "license": "MIT", @@ -5267,9 +10621,32 @@ "safer-buffer": "^2.1.0" } }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/ast-types": { "version": "0.15.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", "peer": true, "dependencies": { "tslib": "^2.0.1" @@ -5284,7 +10661,8 @@ }, "node_modules/astral-regex": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "peer": true, "engines": { "node": ">=4" @@ -5296,8 +10674,7 @@ }, "node_modules/async-limiter": { "version": "1.0.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", @@ -5314,48 +10691,259 @@ "version": "1.0.0", "license": "ISC", "engines": { - "node": ">= 4.0.0" + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.0", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.6.5", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-loader/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "license": "MIT", + "node_modules/babel-loader/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/axe-core": { - "version": "4.7.0", - "license": "MPL-2.0", + "node_modules/babel-loader/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/axios": { - "version": "1.6.5", - "license": "MIT", + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/axobject-query": { - "version": "3.2.1", - "license": "Apache-2.0", + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, "dependencies": { - "dequal": "^2.0.3" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "license": "MIT", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/babel-loader/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/babel-plugin-add-react-displayname": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz", + "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==", + "dev": true + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/babel-plugin-macros": { @@ -5372,17 +10960,33 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.7", - "license": "MIT", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.4", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", "license": "ISC", @@ -5402,10 +11006,26 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "license": "MIT", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -5413,7 +11033,8 @@ }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", "peer": true, "dependencies": { "@babel/plugin-syntax-flow": "^7.12.1" @@ -5431,6 +11052,43 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", + "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.1.5.tgz", + "integrity": "sha512-5t0nlecX+N2uJqdxe9d18A98cp2u9BETelbjKpiVgQqzzmVNFYWEAjQHqS+2Khgto1vcwhik9cXucaj5ve2WWA==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "node_modules/bare-os": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.1.3.tgz", + "integrity": "sha512-YMKOQzoMouGCrYgJ0rassKvmbTz+TYDOKKmu4JkfNXS/qKn+If1ODCMEXnmknQXfnB1PS8bR+uHu6xBgwAQXew==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", + "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "funding": [ @@ -5447,37 +11105,312 @@ "url": "https://feross.org/support" } ], + "license": "MIT" + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", "license": "MIT", - "peer": true + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "dev": true, + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } }, - "node_modules/bcp-47-match": { - "version": "2.0.3", + "node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "devOptional": true, + "node_modules/braces": { + "version": "3.0.2", "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/bl": { + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-assert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { "version": "4.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, "dependencies": { - "buffer": "^5.5.0", + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/browserify-sign": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", + "dev": true, + "dependencies": { + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -5491,37 +11424,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } + ] }, - "node_modules/braces": { - "version": "3.0.2", - "license": "MIT", + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" + "pako": "~1.0.5" } }, "node_modules/browserslist": { @@ -5556,8 +11467,8 @@ }, "node_modules/bser": { "version": "2.1.1", - "license": "Apache-2.0", - "peer": true, + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dependencies": { "node-int64": "^0.4.0" } @@ -5579,12 +11490,20 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "license": "BSD-3-Clause" @@ -5593,6 +11512,12 @@ "version": "1.1.2", "license": "MIT" }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, "node_modules/bufferutil": { "version": "4.0.8", "hasInstallScript": true, @@ -5614,6 +11539,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, "node_modules/builtins": { "version": "5.0.1", "dev": true, @@ -5633,8 +11564,8 @@ }, "node_modules/bytes": { "version": "3.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } @@ -5653,7 +11584,8 @@ }, "node_modules/caller-callsite": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "peer": true, "dependencies": { "callsites": "^2.0.0" @@ -5664,7 +11596,8 @@ }, "node_modules/caller-callsite/node_modules/callsites": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "peer": true, "engines": { "node": ">=4" @@ -5672,7 +11605,8 @@ }, "node_modules/caller-path": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "peer": true, "dependencies": { "caller-callsite": "^2.0.0" @@ -5688,6 +11622,16 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase": { "version": "6.3.0", "license": "MIT", @@ -5716,6 +11660,15 @@ ], "license": "CC-BY-4.0" }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ccount": { "version": "2.0.1", "license": "MIT", @@ -5724,6 +11677,24 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.2", "license": "MIT", @@ -5770,6 +11741,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.5.3", "devOptional": true, @@ -5807,9 +11790,19 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/chrome-launcher": { "version": "0.15.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", "peer": true, "dependencies": { "@types/node": "*", @@ -5827,14 +11820,14 @@ "node_modules/chrome-trace-event": { "version": "1.0.3", "license": "MIT", - "peer": true, "engines": { "node": ">=6.0" } }, "node_modules/chromium-edge-launcher": { "version": "1.0.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", + "integrity": "sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==", "peer": true, "dependencies": { "@types/node": "*", @@ -5847,7 +11840,8 @@ }, "node_modules/chromium-edge-launcher/node_modules/mkdirp": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "peer": true, "bin": { "mkdirp": "bin/cmd.js" @@ -5858,7 +11852,8 @@ }, "node_modules/chromium-edge-launcher/node_modules/rimraf": { "version": "3.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -5879,15 +11874,69 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=8" } }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/citty": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz", + "integrity": "sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ==", + "dev": true, + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, "node_modules/classnames": { "version": "2.5.1", "license": "MIT" }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/clean-webpack-plugin": { "version": "4.0.0", "license": "MIT", @@ -5903,8 +11952,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5914,8 +11963,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "engines": { "node": ">=6" }, @@ -5923,6 +11972,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, "node_modules/client-only": { "version": "0.0.1", "license": "MIT" @@ -5930,7 +11994,6 @@ "node_modules/cliui": { "version": "8.0.1", "license": "ISC", - "peer": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -5942,16 +12005,16 @@ }, "node_modules/clone": { "version": "1.0.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5968,6 +12031,19 @@ "node": ">=6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "license": "MIT", @@ -5982,9 +12058,20 @@ "version": "1.1.4", "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/colorette": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "peer": true }, "node_modules/combined-stream": { @@ -6007,17 +12094,25 @@ }, "node_modules/command-exists": { "version": "1.2.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", "peer": true }, "node_modules/commander": { "version": "9.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "peer": true, "engines": { "node": "^12.20.0 || >=14" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "node_modules/common-tags": { "version": "1.8.2", "license": "MIT", @@ -6027,13 +12122,13 @@ }, "node_modules/commondir": { "version": "1.0.1", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compressible": { "version": "2.0.18", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -6043,8 +12138,8 @@ }, "node_modules/compression": { "version": "1.7.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -6058,23 +12153,68 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "peer": true, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "license": "MIT", - "peer": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "dev": true, @@ -6082,7 +12222,8 @@ }, "node_modules/connect": { "version": "3.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "peer": true, "dependencies": { "debug": "2.6.9", @@ -6096,7 +12237,8 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "peer": true, "dependencies": { "ms": "2.0.0" @@ -6104,9 +12246,72 @@ }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "license": "MIT" @@ -6118,6 +12323,12 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, "node_modules/cookies-next": { "version": "4.1.0", "license": "MIT", @@ -6142,10 +12353,21 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-js-pure": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz", + "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "7.1.0", @@ -6161,6 +12383,43 @@ "node": ">=10" } }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, "node_modules/cropper": { "version": "4.1.0", "license": "MIT", @@ -6187,6 +12446,28 @@ "node": ">= 8" } }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "license": "MIT", @@ -6194,6 +12475,69 @@ "node": ">=8" } }, + "node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/css-select": { "version": "5.1.0", "dev": true, @@ -6236,6 +12580,24 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csso": { "version": "5.0.5", "dev": true, @@ -6316,7 +12678,8 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "peer": true, "engines": { "node": ">=0.10.0" @@ -6333,6 +12696,80 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "license": "MIT" @@ -6344,10 +12781,26 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { "version": "1.0.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dependencies": { "clone": "^1.0.2" }, @@ -6367,6 +12820,15 @@ "node": ">= 0.4" } }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/define-properties": { "version": "1.2.1", "license": "MIT", @@ -6382,6 +12844,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, "node_modules/del": { "version": "4.1.1", "license": "MIT", @@ -6438,13 +12906,14 @@ }, "node_modules/denodeify": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", "peer": true }, "node_modules/depd": { "version": "2.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } @@ -6469,13 +12938,73 @@ "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "dev": true + }, + "node_modules/detect-package-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", + "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "dev": true, + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" } }, "node_modules/diff": { @@ -6485,6 +13014,26 @@ "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "license": "MIT", @@ -6516,6 +13065,21 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, "node_modules/dom-helpers": { "version": "5.2.1", "license": "MIT", @@ -6537,6 +13101,18 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, + "node_modules/domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/domelementtype": { "version": "2.3.0", "dev": true, @@ -6588,6 +13164,75 @@ "tslib": "^2.0.3" } }, + "node_modules/dotenv": { + "version": "16.4.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.4.tgz", + "integrity": "sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "license": "Apache-2.0", @@ -6597,8 +13242,8 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { "version": "3.1.9", @@ -6617,18 +13262,62 @@ "version": "1.4.628", "license": "ISC" }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/encodeurl": { "version": "1.0.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/endent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/endent/-/endent-2.1.0.tgz", + "integrity": "sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==", + "dev": true, + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.5" + } + }, "node_modules/engine.io-client": { "version": "6.5.3", "license": "MIT", @@ -6693,9 +13382,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.0", - "license": "MIT", - "peer": true, + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", "bin": { "envinfo": "dist/cli.js" }, @@ -6712,15 +13401,16 @@ }, "node_modules/error-stack-parser": { "version": "2.1.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/errorhandler": { "version": "1.5.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", "peer": true, "dependencies": { "accepts": "~1.3.7", @@ -6781,6 +13471,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-iterator-helpers": { "version": "1.0.15", "license": "MIT", @@ -6803,8 +13513,7 @@ }, "node_modules/es-module-lexer": { "version": "1.4.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -6840,6 +13549,61 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/esbuild-plugin-alias": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", + "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==", + "dev": true + }, + "node_modules/esbuild-register": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", + "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, "node_modules/escalade": { "version": "3.1.1", "license": "MIT", @@ -6849,8 +13613,8 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -6862,6 +13626,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { "version": "8.56.0", "license": "MIT", @@ -7415,6 +14210,155 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-storybook": { + "version": "0.6.15", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.6.15.tgz", + "integrity": "sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.45.0", + "requireindex": "^1.1.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": "12.x || 14.x || >= 16" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "license": "BSD-2-Clause", @@ -7474,8 +14418,8 @@ }, "node_modules/esprima": { "version": "4.0.1", - "license": "BSD-2-Clause", - "peer": true, + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7524,8 +14468,8 @@ }, "node_modules/etag": { "version": "1.8.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } @@ -7533,7 +14477,6 @@ "node_modules/event-target-shim": { "version": "5.0.1", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -7541,15 +14484,24 @@ "node_modules/events": { "version": "3.3.0", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.x" } }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, "node_modules/execa": { "version": "5.1.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7568,10 +14520,189 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", "license": "MIT" }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/extract-zip/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -7580,6 +14711,12 @@ "version": "4.0.3", "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.1", "license": "MIT", @@ -7604,6 +14741,12 @@ "node": ">= 6" } }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==", + "dev": true + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "license": "MIT" @@ -7613,7 +14756,9 @@ "license": "MIT" }, "node_modules/fast-xml-parser": { - "version": "4.3.3", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", + "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", "funding": [ { "type": "github", @@ -7624,7 +14769,6 @@ "url": "https://paypal.me/naturalintelligence" } ], - "license": "MIT", "peer": true, "dependencies": { "strnum": "^1.0.5" @@ -7640,14 +14784,40 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", - "license": "Apache-2.0", - "peer": true, + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dependencies": { "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fetch-retry": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", + "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==", + "dev": true + }, "node_modules/file-entry-cache": { "version": "6.0.1", "license": "MIT", @@ -7658,6 +14828,51 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-system-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", + "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==", + "dev": true, + "dependencies": { + "fs-extra": "11.1.1", + "ramda": "0.29.0" + } + }, + "node_modules/file-system-cache/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/file-system-cache/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/file-system-cache/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/filelist": { "version": "1.0.4", "license": "Apache-2.0", @@ -7685,9 +14900,19 @@ "node": ">=8" } }, + "node_modules/filter-obj": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-2.0.2.tgz", + "integrity": "sha512-lO3ttPjHZRfjMcxWKb1j1eDhTFsu4meeR3lnMcnBFhk6RuLhvEiuALu2TlfL310ph4lCYYwgF/ElIjdP739tdg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "peer": true, "dependencies": { "debug": "2.6.9", @@ -7704,7 +14929,8 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "peer": true, "dependencies": { "ms": "2.0.0" @@ -7712,13 +14938,14 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, "node_modules/find-cache-dir": { "version": "2.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -7746,6 +14973,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "10.8.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.8.0.tgz", + "integrity": "sha512-UJpC24vw8JFuHEOQyArBGKTUd7+kohLISCzHyn0M/prP0KOTx2io1eyLliEid330QqnWI7FOlPxoU97qecCSfQ==", + "dependencies": { + "@firebase/analytics": "0.10.1", + "@firebase/analytics-compat": "0.2.7", + "@firebase/app": "0.9.27", + "@firebase/app-check": "0.8.2", + "@firebase/app-check-compat": "0.3.9", + "@firebase/app-compat": "0.2.27", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "1.6.0", + "@firebase/auth-compat": "0.5.2", + "@firebase/database": "1.0.3", + "@firebase/database-compat": "1.0.3", + "@firebase/firestore": "4.4.2", + "@firebase/firestore-compat": "0.3.25", + "@firebase/functions": "0.11.1", + "@firebase/functions-compat": "0.3.7", + "@firebase/installations": "0.6.5", + "@firebase/installations-compat": "0.2.5", + "@firebase/messaging": "0.12.6", + "@firebase/messaging-compat": "0.2.6", + "@firebase/performance": "0.6.5", + "@firebase/performance-compat": "0.2.5", + "@firebase/remote-config": "0.4.5", + "@firebase/remote-config-compat": "0.2.5", + "@firebase/storage": "0.12.1", + "@firebase/storage-compat": "0.3.4", + "@firebase/util": "1.9.4" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "license": "MIT", @@ -7782,8 +15042,8 @@ }, "node_modules/flow-parser": { "version": "0.206.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", + "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", "engines": { "node": ">=0.4.0" } @@ -7806,11 +15066,124 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "license": "MIT", + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", + "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "fs-extra": "^10.0.0", + "memfs": "^3.4.1", + "minimatch": "^3.0.4", + "node-abort-controller": "^3.0.1", + "schema-utils": "^3.1.1", + "semver": "^7.3.5", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">=12.13.0", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "typescript": ">3.6.0", + "webpack": "^5.11.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" } }, "node_modules/form-data": { @@ -7825,6 +15198,15 @@ "node": ">= 6" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/framer-motion": { "version": "10.18.0", "license": "MIT", @@ -7862,15 +15244,22 @@ }, "node_modules/fresh": { "version": "0.5.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "node_modules/fs-extra": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -7881,6 +15270,36 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "dev": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "license": "ISC" @@ -7936,11 +15355,19 @@ "node_modules/get-caller-file": { "version": "2.0.5", "license": "ISC", - "peer": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.2", "license": "MIT", @@ -7954,14 +15381,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-npm-tarball-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz", + "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==", + "dev": true, + "engines": { + "node": ">=12.17" + } + }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "license": "ISC" }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { "node": ">=10" }, @@ -7993,6 +15459,31 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/giget": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.1.tgz", + "integrity": "sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==", + "dev": true, + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "defu": "^6.1.3", + "node-fetch-native": "^1.6.1", + "nypm": "^0.3.3", + "ohash": "^1.1.3", + "pathe": "^1.1.1", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "node_modules/github-slugger": { "version": "2.0.0", "license": "ISC" @@ -8112,6 +15603,68 @@ "version": "1.4.0", "license": "MIT" }, + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/gunzip-maybe/node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/gunzip-maybe/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "license": "MIT", @@ -8169,6 +15722,50 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, "node_modules/hasown": { "version": "2.0.0", "license": "MIT", @@ -8332,78 +15929,269 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-whitespace": { + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hermes-estree": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz", + "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==", + "peer": true + }, + "node_modules/hermes-parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.15.0.tgz", + "integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==", + "peer": true, + "dependencies": { + "hermes-estree": "0.15.0" + } + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "peer": true, + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hermes-profile-transformer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { "version": "2.0.1", "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/hastscript": { - "version": "7.2.0", - "license": "MIT", + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "dev": true, "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/hermes-estree": { - "version": "0.15.0", - "license": "MIT", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.15.0", - "license": "MIT", - "peer": true, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "hermes-estree": "0.15.0" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "license": "MIT", - "peer": true, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, "dependencies": { - "source-map": "^0.7.3" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/hermes-profile-transformer/node_modules/source-map": { - "version": "0.7.4", - "license": "BSD-3-Clause", - "peer": true, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, "engines": { - "node": ">= 8" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, "dependencies": { - "react-is": "^16.7.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "license": "MIT", + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http_ece": { @@ -8418,8 +16206,8 @@ }, "node_modules/http-errors": { "version": "2.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -8433,12 +16221,23 @@ }, "node_modules/http-errors/node_modules/statuses": { "version": "2.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, "node_modules/https-proxy-agent": { "version": "7.0.2", "license": "MIT", @@ -8452,12 +16251,36 @@ }, "node_modules/human-signals": { "version": "2.1.0", - "license": "Apache-2.0", - "peer": true, + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "engines": { "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/idb": { "version": "7.1.1", "license": "ISC" @@ -8478,8 +16301,7 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.0", @@ -8490,8 +16312,8 @@ }, "node_modules/image-size": { "version": "1.1.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dependencies": { "queue": "6.0.2" }, @@ -8528,6 +16350,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "license": "ISC", @@ -8540,6 +16371,12 @@ "version": "2.0.4", "license": "ISC" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, "node_modules/inline-style-parser": { "version": "0.1.1", "license": "MIT" @@ -8565,9 +16402,28 @@ }, "node_modules/ip": { "version": "1.1.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "peer": true }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-alphabetical": { "version": "2.0.1", "license": "MIT", @@ -8588,6 +16444,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "license": "MIT", @@ -8728,9 +16600,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true + }, "node_modules/is-directory": { "version": "0.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "peer": true, "engines": { "node": ">=0.10.0" @@ -8738,8 +16617,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "bin": { "is-docker": "cli.js" }, @@ -8769,7 +16648,8 @@ }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "peer": true, "engines": { "node": ">=4" @@ -8798,6 +16678,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-hexadecimal": { "version": "2.0.1", "license": "MIT", @@ -8808,8 +16697,8 @@ }, "node_modules/is-interactive": { "version": "1.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "engines": { "node": ">=8" } @@ -8825,6 +16714,22 @@ "version": "1.0.0", "license": "MIT" }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "license": "MIT", @@ -8908,8 +16813,8 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dependencies": { "isobject": "^3.0.1" }, @@ -9006,8 +16911,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { "node": ">=10" }, @@ -9045,8 +16950,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dependencies": { "is-docker": "^2.0.0" }, @@ -9064,12 +16969,46 @@ }, "node_modules/isobject": { "version": "3.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/iterator.prototype": { "version": "1.1.2", "license": "MIT", @@ -9100,6 +17039,24 @@ "@types/react": "*" } }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.8.7", "license": "Apache-2.0", @@ -9152,12 +17109,38 @@ }, "node_modules/jest-get-type": { "version": "29.6.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "peer": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, "node_modules/jest-message-util": { "version": "29.7.0", "license": "MIT", @@ -9214,10 +17197,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/jest-util": { "version": "29.7.0", "license": "MIT", - "peer": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9232,7 +17223,8 @@ }, "node_modules/jest-validate": { "version": "29.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "peer": true, "dependencies": { "@jest/types": "^29.6.3", @@ -9248,7 +17240,8 @@ }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "peer": true, "engines": { "node": ">=10" @@ -9259,7 +17252,8 @@ }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "29.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "peer": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -9272,8 +17266,8 @@ }, "node_modules/jest-worker": { "version": "29.7.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", @@ -9286,8 +17280,8 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, @@ -9298,14 +17292,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/joi": { - "version": "17.11.0", - "license": "BSD-3-Clause", + "version": "17.12.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", + "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", "peer": true, "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -9344,12 +17348,14 @@ }, "node_modules/jsc-safe-url": { "version": "0.2.4", - "license": "0BSD", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", "peer": true }, "node_modules/jscodeshift": { "version": "0.14.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", "peer": true, "dependencies": { "@babel/core": "^7.13.16", @@ -9395,7 +17401,8 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "peer": true }, "node_modules/json-parse-even-better-errors": { @@ -9433,7 +17440,8 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -9485,20 +17493,29 @@ }, "node_modules/kind-of": { "version": "6.0.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { "node": ">=6" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/konva": { "version": "9.3.0", "funding": [ @@ -9532,6 +17549,20 @@ "node": ">=0.10" } }, + "node_modules/lazy-universal-dotenv": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", + "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", + "dev": true, + "dependencies": { + "app-root-dir": "^1.0.2", + "dotenv": "^16.0.0", + "dotenv-expand": "^10.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/leven": { "version": "3.1.0", "license": "MIT", @@ -9552,7 +17583,8 @@ }, "node_modules/lighthouse-logger": { "version": "1.4.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", "peer": true, "dependencies": { "debug": "^2.6.9", @@ -9561,7 +17593,8 @@ }, "node_modules/lighthouse-logger/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "peer": true, "dependencies": { "ms": "2.0.0" @@ -9569,7 +17602,8 @@ }, "node_modules/lighthouse-logger/node_modules/ms": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, "node_modules/lines-and-columns": { @@ -9579,11 +17613,19 @@ "node_modules/loader-runner": { "version": "4.3.0", "license": "MIT", - "peer": true, "engines": { "node": ">=6.11.5" } }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "license": "MIT", @@ -9605,6 +17647,11 @@ "version": "4.17.21", "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "license": "MIT" @@ -9619,13 +17666,14 @@ }, "node_modules/lodash.throttle": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", "peer": true }, "node_modules/log-symbols": { "version": "4.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -9639,7 +17687,8 @@ }, "node_modules/logkitty": { "version": "0.7.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", "peer": true, "dependencies": { "ansi-fragments": "^0.2.1", @@ -9652,7 +17701,8 @@ }, "node_modules/logkitty/node_modules/camelcase": { "version": "5.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "peer": true, "engines": { "node": ">=6" @@ -9660,7 +17710,8 @@ }, "node_modules/logkitty/node_modules/cliui": { "version": "6.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "peer": true, "dependencies": { "string-width": "^4.2.0", @@ -9670,7 +17721,8 @@ }, "node_modules/logkitty/node_modules/find-up": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "peer": true, "dependencies": { "locate-path": "^5.0.0", @@ -9682,7 +17734,8 @@ }, "node_modules/logkitty/node_modules/locate-path": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "peer": true, "dependencies": { "p-locate": "^4.1.0" @@ -9693,7 +17746,8 @@ }, "node_modules/logkitty/node_modules/p-limit": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -9707,7 +17761,8 @@ }, "node_modules/logkitty/node_modules/p-locate": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "peer": true, "dependencies": { "p-limit": "^2.2.0" @@ -9718,7 +17773,8 @@ }, "node_modules/logkitty/node_modules/wrap-ansi": { "version": "6.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "peer": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -9731,12 +17787,14 @@ }, "node_modules/logkitty/node_modules/y18n": { "version": "4.0.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "peer": true }, "node_modules/logkitty/node_modules/yargs": { "version": "15.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "peer": true, "dependencies": { "cliui": "^6.0.0", @@ -9757,7 +17815,8 @@ }, "node_modules/logkitty/node_modules/yargs-parser": { "version": "18.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "peer": true, "dependencies": { "camelcase": "^5.0.0", @@ -9767,6 +17826,11 @@ "node": ">=6" } }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/longest-streak": { "version": "3.1.0", "license": "MIT", @@ -9785,6 +17849,15 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, "node_modules/lower-case": { "version": "2.0.2", "dev": true, @@ -9810,6 +17883,15 @@ "node": ">=12" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.25.9", "license": "MIT", @@ -9819,8 +17901,8 @@ }, "node_modules/make-dir": { "version": "2.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -9831,20 +17913,26 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.2", - "license": "ISC", - "peer": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } }, "node_modules/makeerror": { "version": "1.0.12", - "license": "BSD-3-Clause", - "peer": true, + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dependencies": { "tmpl": "1.0.5" } }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true + }, "node_modules/markdown-table": { "version": "3.0.3", "license": "MIT", @@ -9853,11 +17941,35 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/markdown-to-jsx": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", + "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, "node_modules/marky": { "version": "1.2.5", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "peer": true }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "node_modules/mdast-util-definitions": { "version": "5.1.2", "license": "MIT", @@ -10063,10 +18175,46 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/memoize-one": { "version": "6.0.0", "license": "MIT" }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, "node_modules/merge-stream": { "version": "2.0.0", "license": "MIT" @@ -10078,9 +18226,19 @@ "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/metro": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.5.tgz", + "integrity": "sha512-OE/CGbOgbi8BlTN1QqJgKOBaC27dS0JBQw473JcivrpgVnqIsluROA7AavEaTVUrB9wPUZvoNVDROn5uiM2jfw==", "peer": true, "dependencies": { "@babel/code-frame": "^7.0.0", @@ -10104,19 +18262,18 @@ "jest-worker": "^29.6.3", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.4", - "metro-cache": "0.80.4", - "metro-cache-key": "0.80.4", - "metro-config": "0.80.4", - "metro-core": "0.80.4", - "metro-file-map": "0.80.4", - "metro-minify-terser": "0.80.4", - "metro-resolver": "0.80.4", - "metro-runtime": "0.80.4", - "metro-source-map": "0.80.4", - "metro-symbolicate": "0.80.4", - "metro-transform-plugins": "0.80.4", - "metro-transform-worker": "0.80.4", + "metro-babel-transformer": "0.80.5", + "metro-cache": "0.80.5", + "metro-cache-key": "0.80.5", + "metro-config": "0.80.5", + "metro-core": "0.80.5", + "metro-file-map": "0.80.5", + "metro-resolver": "0.80.5", + "metro-runtime": "0.80.5", + "metro-source-map": "0.80.5", + "metro-symbolicate": "0.80.5", + "metro-transform-plugins": "0.80.5", + "metro-transform-worker": "0.80.5", "mime-types": "^2.1.27", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", @@ -10136,8 +18293,9 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.5.tgz", + "integrity": "sha512-sxH6hcWCorhTbk4kaShCWsadzu99WBL4Nvq4m/sDTbp32//iGuxtAnUK+ZV+6IEygr2u9Z0/4XoZ8Sbcl71MpA==", "peer": true, "dependencies": { "@babel/core": "^7.20.0", @@ -10150,23 +18308,26 @@ }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { "version": "0.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.2.tgz", + "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==", "peer": true }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { "version": "0.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.2.tgz", + "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", "peer": true, "dependencies": { "hermes-estree": "0.18.2" } }, "node_modules/metro-cache": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.5.tgz", + "integrity": "sha512-2u+dQ4PZwmC7eZo9uMBNhQQMig9f+w4QWBZwXCdVy/RYOHM0eObgGdMEOwODo73uxie82T9lWzxr3aZOZ+Nqtw==", "peer": true, "dependencies": { - "metro-core": "0.80.4", + "metro-core": "0.80.5", "rimraf": "^3.0.2" }, "engines": { @@ -10174,8 +18335,9 @@ } }, "node_modules/metro-cache-key": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.5.tgz", + "integrity": "sha512-fr3QLZUarsB3tRbVcmr34kCBsTHk0Sh9JXGvBY/w3b2lbre+Lq5gtgLyFElHPecGF7o4z1eK9r3ubxtScHWcbA==", "peer": true, "engines": { "node": ">=18" @@ -10183,7 +18345,8 @@ }, "node_modules/metro-cache/node_modules/rimraf": { "version": "3.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -10196,17 +18359,18 @@ } }, "node_modules/metro-config": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.5.tgz", + "integrity": "sha512-elqo/lwvF+VjZ1OPyvmW/9hSiGlmcqu+rQvDKw5F5WMX48ZC+ySTD1WcaD7e97pkgAlJHVYqZ98FCjRAYOAFRQ==", "peer": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "jest-validate": "^29.6.3", - "metro": "0.80.4", - "metro-cache": "0.80.4", - "metro-core": "0.80.4", - "metro-runtime": "0.80.4" + "metro": "0.80.5", + "metro-cache": "0.80.5", + "metro-core": "0.80.5", + "metro-runtime": "0.80.5" }, "engines": { "node": ">=18" @@ -10214,7 +18378,8 @@ }, "node_modules/metro-config/node_modules/argparse": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "peer": true, "dependencies": { "sprintf-js": "~1.0.2" @@ -10222,7 +18387,8 @@ }, "node_modules/metro-config/node_modules/cosmiconfig": { "version": "5.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "peer": true, "dependencies": { "import-fresh": "^2.0.0", @@ -10236,7 +18402,8 @@ }, "node_modules/metro-config/node_modules/import-fresh": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "peer": true, "dependencies": { "caller-path": "^2.0.0", @@ -10248,7 +18415,8 @@ }, "node_modules/metro-config/node_modules/js-yaml": { "version": "3.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -10260,7 +18428,8 @@ }, "node_modules/metro-config/node_modules/parse-json": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "peer": true, "dependencies": { "error-ex": "^1.3.1", @@ -10272,27 +18441,30 @@ }, "node_modules/metro-config/node_modules/resolve-from": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "peer": true, "engines": { "node": ">=4" } }, "node_modules/metro-core": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.5.tgz", + "integrity": "sha512-vkLuaBhnZxTVpaZO8ZJVEHzjaqSXpOdpAiztSZ+NDaYM6jEFgle3/XIbLW91jTSf2+T8Pj5yB1G7KuOX+BcVwg==", "peer": true, "dependencies": { "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.4" + "metro-resolver": "0.80.5" }, "engines": { "node": ">=18" } }, "node_modules/metro-file-map": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.5.tgz", + "integrity": "sha512-bKCvJ05drjq6QhQxnDUt3I8x7bTcHo3IIKVobEr14BK++nmxFGn/BmFLRzVBlghM6an3gqwpNEYxS5qNc+VKcg==", "peer": true, "dependencies": { "anymatch": "^3.0.3", @@ -10315,7 +18487,8 @@ }, "node_modules/metro-file-map/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "peer": true, "dependencies": { "ms": "2.0.0" @@ -10323,12 +18496,14 @@ }, "node_modules/metro-file-map/node_modules/ms": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, "node_modules/metro-minify-terser": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.5.tgz", + "integrity": "sha512-S7oZLLcab6YXUT6jYFX/ZDMN7Fq6xBGGAG8liMFU1UljX6cTcEC2u+UIafYgCLrdVexp/+ClxrIetVPZ5LtL/g==", "peer": true, "dependencies": { "terser": "^5.15.0" @@ -10338,16 +18513,18 @@ } }, "node_modules/metro-resolver": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.5.tgz", + "integrity": "sha512-haJ/Hveio3zv/Fr4eXVdKzjUeHHDogYok7OpRqPSXGhTXisNXB+sLN7CpcUrCddFRUDLnVaqQOYwhYsFndgUwA==", "peer": true, "engines": { "node": ">=18" } }, "node_modules/metro-runtime": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.5.tgz", + "integrity": "sha512-L0syTWJUdWzfUmKgkScr6fSBVTh6QDr8eKEkRtn40OBd8LPagrJGySBboWSgbyn9eIb4ayW3Y347HxgXBSAjmg==", "peer": true, "dependencies": { "@babel/runtime": "^7.0.0" @@ -10357,16 +18534,17 @@ } }, "node_modules/metro-source-map": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.5.tgz", + "integrity": "sha512-DwSF4l03mKPNqCtyQ6K23I43qzU1BViAXnuH81eYWdHglP+sDlPpY+/7rUahXEo6qXEHXfAJgVoo1sirbXbmsQ==", "peer": true, "dependencies": { "@babel/traverse": "^7.20.0", "@babel/types": "^7.20.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.80.4", + "metro-symbolicate": "0.80.5", "nullthrows": "^1.1.1", - "ob1": "0.80.4", + "ob1": "0.80.5", "source-map": "^0.5.6", "vlq": "^1.0.0" }, @@ -10375,12 +18553,13 @@ } }, "node_modules/metro-symbolicate": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.5.tgz", + "integrity": "sha512-IsM4mTYvmo9JvIqwEkCZ5+YeDVPST78Q17ZgljfLdHLSpIivOHp9oVoiwQ/YGbLx0xRHRIS/tKiXueWBnj3UWA==", "peer": true, "dependencies": { "invariant": "^2.2.4", - "metro-source-map": "0.80.4", + "metro-source-map": "0.80.5", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", @@ -10394,8 +18573,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.5.tgz", + "integrity": "sha512-7IdlTqK/k5+qE3RvIU5QdCJUPk4tHWEqgVuYZu8exeW+s6qOJ66hGIJjXY/P7ccucqF+D4nsbAAW5unkoUdS6g==", "peer": true, "dependencies": { "@babel/core": "^7.20.0", @@ -10409,20 +18589,22 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.5.tgz", + "integrity": "sha512-Q1oM7hfP+RBgAtzRFBDjPhArELUJF8iRCZ8OidqCpYzQJVGuJZ7InSnIf3hn1JyqiUQwv2f1LXBO78i2rAjzyA==", "peer": true, "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "metro": "0.80.4", - "metro-babel-transformer": "0.80.4", - "metro-cache": "0.80.4", - "metro-cache-key": "0.80.4", - "metro-source-map": "0.80.4", - "metro-transform-plugins": "0.80.4", + "metro": "0.80.5", + "metro-babel-transformer": "0.80.5", + "metro-cache": "0.80.5", + "metro-cache-key": "0.80.5", + "metro-minify-terser": "0.80.5", + "metro-source-map": "0.80.5", + "metro-transform-plugins": "0.80.5", "nullthrows": "^1.1.1" }, "engines": { @@ -10431,12 +18613,14 @@ }, "node_modules/metro/node_modules/ci-info": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "peer": true }, "node_modules/metro/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "peer": true, "dependencies": { "ms": "2.0.0" @@ -10444,12 +18628,14 @@ }, "node_modules/metro/node_modules/hermes-estree": { "version": "0.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.2.tgz", + "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==", "peer": true }, "node_modules/metro/node_modules/hermes-parser": { "version": "0.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.2.tgz", + "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", "peer": true, "dependencies": { "hermes-estree": "0.18.2" @@ -10457,12 +18643,14 @@ }, "node_modules/metro/node_modules/ms": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "peer": true }, "node_modules/metro/node_modules/rimraf": { "version": "3.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "peer": true, "dependencies": { "glob": "^7.1.3" @@ -10476,7 +18664,8 @@ }, "node_modules/metro/node_modules/ws": { "version": "7.5.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "peer": true, "engines": { "node": ">=8.3.0" @@ -11012,10 +19201,23 @@ "node": ">=8.6" } }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, "node_modules/mime": { "version": "2.6.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "bin": { "mime": "cli.js" }, @@ -11042,16 +19244,43 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "license": "ISC" }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, "node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -11072,10 +19301,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.6", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, @@ -11083,6 +19346,12 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "node_modules/moment": { "version": "2.30.1", "license": "MIT", @@ -11127,22 +19396,27 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "node_modules/natural-compare": { "version": "1.4.0", "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/net": { "version": "1.0.2", @@ -11251,21 +19525,40 @@ }, "node_modules/nocache": { "version": "3.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", "peer": true, "engines": { "node": ">=12.0.0" } }, + "node_modules/node-abi": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", + "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true }, "node_modules/node-dir": { "version": "0.1.17", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", "dependencies": { "minimatch": "^3.0.2" }, @@ -11275,8 +19568,8 @@ }, "node_modules/node-dir/node_modules/brace-expansion": { "version": "1.1.11", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11284,8 +19577,8 @@ }, "node_modules/node-dir/node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", - "peer": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -11295,8 +19588,8 @@ }, "node_modules/node-fetch": { "version": "2.7.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -11306,33 +19599,107 @@ "peerDependencies": { "encoding": "^0.1.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz", + "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==", + "dev": true + }, + "node_modules/node-gyp-build": { + "version": "4.8.0", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-polyfill-webpack-plugin": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-polyfill-webpack-plugin/-/node-polyfill-webpack-plugin-2.0.1.tgz", + "integrity": "sha512-ZUMiCnZkP1LF0Th2caY6J/eKKoA0TefpoVa68m/LQU1I/mE8rGt4fNYGgNuCcK+aG8P8P43nbeJ2RqJMOL/Y1A==", + "dev": true, + "dependencies": { + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^6.0.3", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.22.0", + "events": "^3.3.0", + "filter-obj": "^2.0.2", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "punycode": "^2.1.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^4.0.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "^0.0.1", + "type-fest": "^2.14.0", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": ">=5" + } + }, + "node_modules/node-polyfill-webpack-plugin/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/node-polyfill-webpack-plugin/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "license": "MIT", - "peer": true - }, "node_modules/node-releases": { "version": "2.0.14", "license": "MIT" }, "node_modules/node-stream-zip": { "version": "1.15.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", "peer": true, "engines": { "node": ">=0.12.0" @@ -11342,6 +19709,27 @@ "url": "https://github.com/sponsors/antelle" } }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "license": "MIT", @@ -11354,8 +19742,8 @@ }, "node_modules/npm-run-path": { "version": "4.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dependencies": { "path-key": "^3.0.0" }, @@ -11378,13 +19766,166 @@ "license": "MIT", "peer": true }, + "node_modules/nypm": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz", + "integrity": "sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==", + "dev": true, + "dependencies": { + "citty": "^0.1.5", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "ufo": "^1.3.2" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/nypm/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/nypm/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/npm-run-path": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nypm/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/oauth": { "version": "0.9.15", "license": "MIT" }, "node_modules/ob1": { - "version": "0.80.4", - "license": "MIT", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.5.tgz", + "integrity": "sha512-zYDMnnNrFi/1Tqh0vo3PE4p97Tpl9/4MP2k2ECvkbLOZzQuAYZJLTUYVLZb7hJhbhjT+JJxAwBGS8iu5hCSd1w==", "peer": true, "engines": { "node": ">=18" @@ -11411,6 +19952,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "license": "MIT", @@ -11497,6 +20054,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/objectorarray": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz", + "integrity": "sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==", + "dev": true + }, + "node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "dev": true + }, "node_modules/oidc-token-hash": { "version": "5.0.3", "license": "MIT", @@ -11506,7 +20075,8 @@ }, "node_modules/on-finished": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "peer": true, "dependencies": { "ee-first": "1.1.1" @@ -11517,8 +20087,8 @@ }, "node_modules/on-headers": { "version": "1.0.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { "node": ">= 0.8" } @@ -11532,8 +20102,8 @@ }, "node_modules/onetime": { "version": "5.1.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -11546,7 +20116,8 @@ }, "node_modules/open": { "version": "6.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "peer": true, "dependencies": { "is-wsl": "^1.1.0" @@ -11557,7 +20128,8 @@ }, "node_modules/open/node_modules/is-wsl": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", "peer": true, "engines": { "node": ">=4" @@ -11601,8 +20173,8 @@ }, "node_modules/ora": { "version": "5.4.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -11625,6 +20197,12 @@ "version": "2.1.1", "license": "MIT" }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, "node_modules/p-limit": { "version": "3.1.0", "license": "MIT", @@ -11660,12 +20238,28 @@ }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "license": "MIT", @@ -11676,6 +20270,19 @@ "node": ">=6" } }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, "node_modules/parse-entities": { "version": "4.0.1", "license": "MIT", @@ -11720,12 +20327,28 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "license": "MIT", @@ -11755,6 +20378,37 @@ "version": "1.0.7", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", "license": "MIT", @@ -11762,6 +20416,54 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "license": "ISC" @@ -11802,16 +20504,16 @@ }, "node_modules/pirates": { "version": "4.0.6", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "3.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dependencies": { "find-up": "^3.0.0" }, @@ -11821,8 +20523,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "3.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { "locate-path": "^3.0.0" }, @@ -11832,8 +20534,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "3.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -11844,8 +20546,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, @@ -11858,21 +20560,45 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "3.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "ts-pnp": "^1.1.6" }, "engines": { "node": ">=6" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", - "peer": true, + "node_modules/polished": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.17.8" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, "node_modules/postcss": { @@ -11901,6 +20627,132 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "dev": true, + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/preact": { "version": "10.19.3", "license": "MIT", @@ -11919,6 +20771,66 @@ "preact": ">=10" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/prebuild-install/node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/prebuild-install/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "license": "MIT", @@ -11954,14 +20866,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, "node_modules/pretty-format": { "version": "3.8.0", "license": "MIT" }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/promise": { "version": "8.3.0", @@ -11973,8 +20922,8 @@ }, "node_modules/prompts": { "version": "2.4.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -12071,10 +21020,91 @@ "prosemirror-transform": "^1.1.0" } }, + "node_modules/protobufjs": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "license": "MIT" }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "license": "MIT", @@ -12082,10 +21112,77 @@ "node": ">=6" } }, + "node_modules/puppeteer-core": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz", + "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==", + "dev": true, + "dependencies": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "dependencies": { + "agent-base": "5", + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/queue": { "version": "6.0.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "dependencies": { "inherits": "~2.0.3" } @@ -12108,6 +21205,22 @@ ], "license": "MIT" }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/ramda": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", + "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, "node_modules/randombytes": { "version": "2.1.0", "license": "MIT", @@ -12115,12 +21228,70 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "license": "MIT", - "peer": true, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, "node_modules/react": { @@ -12171,6 +21342,31 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "dev": true, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/react-confetti": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-confetti/-/react-confetti-6.1.0.tgz", + "integrity": "sha512-7Ypx4vz0+g8ECVxr88W9zhcQpbeujJAVqL14ZnXJ3I23mOI9/oBVTQ3dkJhUmB0D6XOtCZEM6N0Gm9PMngkORw==", + "dev": true, + "dependencies": { + "tween-functions": "^1.2.0" + }, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.1 || ^18.0.0" + } + }, "node_modules/react-cookie": { "version": "6.1.3", "license": "MIT", @@ -12242,6 +21438,48 @@ } } }, + "node_modules/react-docgen": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz", + "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", + "dev": true, + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-docgen/node_modules/@types/doctrine": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", + "dev": true + }, + "node_modules/react-docgen/node_modules/@types/resolve": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", + "dev": true + }, "node_modules/react-dom": { "version": "18.2.0", "license": "MIT", @@ -12272,6 +21510,36 @@ "node": ">=6" } }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", + "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", + "dev": true, + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "dev": true + }, "node_modules/react-grid-layout": { "version": "1.4.4", "license": "MIT", @@ -12394,17 +21662,18 @@ } }, "node_modules/react-native": { - "version": "0.73.2", - "license": "MIT", + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.4.tgz", + "integrity": "sha512-VtS+Yr6OOTIuJGDECIYWzNU8QpJjASQYvMtfa/Hvm/2/h5GdB6W9H9TOmh13x07Lj4AOhNMx3XSsz6TdrO4jIg==", "peer": true, "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", + "@react-native-community/cli": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", "@react-native/assets-registry": "0.73.1", - "@react-native/codegen": "0.73.2", - "@react-native/community-cli-plugin": "0.73.12", + "@react-native/codegen": "0.73.3", + "@react-native/community-cli-plugin": "0.73.16", "@react-native/gradle-plugin": "0.73.4", "@react-native/js-polyfills": "0.73.1", "@react-native/normalize-colors": "0.73.2", @@ -12413,6 +21682,7 @@ "anser": "^1.4.9", "ansi-regex": "^5.0.0", "base64-js": "^1.5.1", + "chalk": "^4.0.0", "deprecated-react-native-prop-types": "^5.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", @@ -12549,12 +21819,59 @@ }, "node_modules/react-refresh": { "version": "0.14.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "engines": { "node": ">=0.10.0" } }, + "node_modules/react-remove-scroll": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", + "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", + "dev": true, + "dependencies": { + "react-remove-scroll-bar": "^2.3.3", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dev": true, + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-resizable": { "version": "3.0.5", "license": "MIT", @@ -12609,6 +21926,29 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dev": true, + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "license": "BSD-3-Clause", @@ -12656,10 +21996,112 @@ "resize-observer-polyfill": "^1.5.1" } }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12682,12 +22124,14 @@ }, "node_modules/readline": { "version": "1.3.0", - "license": "BSD", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", "peer": true }, "node_modules/recast": { "version": "0.21.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", "peer": true, "dependencies": { "ast-types": "0.15.2", @@ -12701,12 +22145,38 @@ }, "node_modules/recast/node_modules/source-map": { "version": "0.6.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "peer": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "license": "MIT", @@ -12764,6 +22234,12 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "dev": true + }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "license": "MIT", @@ -12932,13 +22408,101 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/rehype-stringify": { - "version": "9.0.4", - "license": "MIT", + "node_modules/rehype-stringify": { + "version": "9.0.4", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-external-links": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", + "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "is-absolute-url": "^3.0.0", + "mdast-util-definitions": "^4.0.0", + "space-separated-tokens": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-external-links/node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dev": true, + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-external-links/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-external-links/node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-external-links/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-external-links/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-to-html": "^8.0.0", - "unified": "^10.0.0" + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" }, "funding": { "type": "opencollective", @@ -12986,10 +22550,160 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-slug": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", + "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", + "dev": true, + "dependencies": { + "github-slugger": "^1.0.0", + "mdast-util-to-string": "^1.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug/node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "dev": true + }, + "node_modules/remark-slug/node_modules/mdast-util-to-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", + "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug/node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug/node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-slug/node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/require-directory": { "version": "2.1.1", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -13003,9 +22717,19 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "peer": true }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "dev": true, + "engines": { + "node": ">=0.10.5" + } + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "license": "MIT" @@ -13039,10 +22763,49 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -13069,6 +22832,16 @@ "rimraf": "bin.js" } }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, "node_modules/rollup": { "version": "2.79.1", "license": "MIT", @@ -13204,6 +22977,44 @@ "node": ">=14.0.0" } }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, "node_modules/scheduler": { "version": "0.23.0", "license": "MIT", @@ -13242,8 +23053,8 @@ }, "node_modules/send": { "version": "0.18.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13265,21 +23076,21 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/mime": { "version": "1.6.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, @@ -13289,13 +23100,13 @@ }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/send/node_modules/on-finished": { "version": "2.4.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -13305,15 +23116,16 @@ }, "node_modules/send/node_modules/statuses": { "version": "2.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, "node_modules/serialize-error": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", "peer": true, "engines": { "node": ">=0.10.0" @@ -13328,8 +23140,8 @@ }, "node_modules/serve-static": { "version": "1.15.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -13342,7 +23154,8 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "peer": true }, "node_modules/set-function-length": { @@ -13370,15 +23183,34 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, "node_modules/setprototypeof": { "version": "1.2.0", - "license": "ISC", - "peer": true + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } }, "node_modules/shallow-clone": { "version": "3.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dependencies": { "kind-of": "^6.0.2" }, @@ -13386,6 +23218,29 @@ "node": ">=8" } }, + "node_modules/sharp": { + "version": "0.32.6", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", + "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.2", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.4", + "simple-get": "^4.0.1", + "tar-fs": "^3.0.4", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -13425,13 +23280,73 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "license": "ISC", - "peer": true + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", @@ -13442,7 +23357,8 @@ }, "node_modules/slice-ansi": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "peer": true, "dependencies": { "ansi-styles": "^3.2.0", @@ -13455,7 +23371,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "peer": true, "dependencies": { "color-convert": "^1.9.0" @@ -13466,7 +23383,8 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "1.9.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "peer": true, "dependencies": { "color-name": "1.1.3" @@ -13474,7 +23392,8 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "peer": true }, "node_modules/slick-carousel": { @@ -13562,10 +23481,42 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz", + "integrity": "sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==", + "dev": true + }, "node_modules/sprintf-js": { "version": "1.0.3", - "license": "BSD-3-Clause", - "peer": true + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/stack-utils": { "version": "2.0.6", @@ -13588,8 +23539,8 @@ }, "node_modules/stackframe": { "version": "1.3.4", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" }, "node_modules/stacktrace-parser": { "version": "0.1.10", @@ -13612,28 +23563,107 @@ }, "node_modules/statuses": { "version": "1.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "peer": true, "engines": { "node": ">= 0.6" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/store2": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz", + "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==", + "dev": true + }, + "node_modules/storybook": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.15.tgz", + "integrity": "sha512-Ybezq9JRk5CBhzjgzZ/oT7mnU45UwhyVSGKW+PUKZGGUG9VH2hCrTEES9f/zEF82kj/5COVPyqR/5vlXuuS39A==", + "dev": true, + "dependencies": { + "@storybook/cli": "7.6.15" + }, + "bin": { + "sb": "index.js", + "storybook": "index.js" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, "node_modules/streamsearch": { "version": "1.1.0", "engines": { "node": ">=10.0.0" } }, + "node_modules/streamx": { + "version": "2.15.8", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.8.tgz", + "integrity": "sha512-6pwMeMY/SuISiRsuS8TeIrAzyFbG5gGPHFQsYjUr/pbBadaL1PCWmzKw+CHZSwainfvcF6Si6cVLq4XTEwswFQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -13647,9 +23677,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT", - "peer": true + ] }, "node_modules/string-convert": { "version": "0.2.1", @@ -13658,7 +23686,6 @@ "node_modules/string-width": { "version": "4.2.3", "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13668,15 +23695,43 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -13772,6 +23827,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "license": "MIT", @@ -13788,12 +23856,27 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "engines": { "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "license": "MIT", @@ -13806,9 +23889,26 @@ }, "node_modules/strnum": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "peer": true }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, "node_modules/style-to-object": { "version": "0.4.4", "license": "MIT", @@ -13843,7 +23943,8 @@ }, "node_modules/sudo-prompt": { "version": "9.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", "peer": true }, "node_modules/supports-color": { @@ -13911,6 +24012,19 @@ "node": ">= 10" } }, + "node_modules/swc-loader": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", + "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + }, + "peerDependencies": { + "@swc/core": "^1.2.147", + "webpack": ">=2" + } + }, "node_modules/swr": { "version": "2.2.4", "license": "MIT", @@ -13922,6 +24036,12 @@ "react": "^16.11.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/synchronous-promise": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", + "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "license": "MIT", @@ -13929,10 +24049,73 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dev": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/telejson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", + "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", + "dev": true, + "dependencies": { + "memoizerific": "^1.11.3" + } + }, "node_modules/temp": { "version": "0.8.4", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", "dependencies": { "rimraf": "~2.6.2" }, @@ -13949,8 +24132,8 @@ }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", - "license": "ISC", - "peer": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dependencies": { "glob": "^7.1.3" }, @@ -14061,6 +24244,42 @@ "version": "2.20.3", "license": "MIT" }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", "license": "MIT" @@ -14072,13 +24291,14 @@ }, "node_modules/throat": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "peer": true }, "node_modules/through2": { "version": "2.0.5", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -14086,13 +24306,13 @@ }, "node_modules/through2/node_modules/isarray": { "version": "1.0.0", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -14105,19 +24325,46 @@ }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { "safe-buffer": "~5.1.0" } }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tls": { "version": "0.0.1" }, "node_modules/tmpl": { "version": "1.0.5", - "license": "BSD-3-Clause", - "peer": true + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -14136,18 +24383,24 @@ "node": ">=8.0" } }, + "node_modules/tocbot": { + "version": "4.25.0", + "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.25.0.tgz", + "integrity": "sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==", + "dev": true + }, "node_modules/toidentifier": { "version": "1.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } }, "node_modules/tr46": { "version": "0.0.3", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-lines": { "version": "3.0.1", @@ -14171,18 +24424,69 @@ "engines": { "node": ">=16.13.0" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths-webpack-plugin": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.7.0", + "tsconfig-paths": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "license": "MIT", + "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/json5": { @@ -14199,6 +24503,51 @@ "version": "2.6.2", "license": "0BSD" }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tween-functions": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", + "integrity": "sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "license": "MIT", @@ -14212,7 +24561,6 @@ "node_modules/type-detect": { "version": "4.0.8", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -14227,6 +24575,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.0", "license": "MIT", @@ -14284,6 +24645,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, "node_modules/typescript": { "version": "5.3.3", "license": "Apache-2.0", @@ -14316,6 +24683,25 @@ "node": "*" } }, + "node_modules/ufo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", + "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "license": "MIT", @@ -14342,6 +24728,23 @@ "react": ">=15.0.0" } }, + "node_modules/undici": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.5.tgz", + "integrity": "sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "license": "MIT", @@ -14490,7 +24893,8 @@ }, "node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "peer": true, "engines": { "node": ">= 4.0.0" @@ -14498,12 +24902,39 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, + "node_modules/unplugin": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.7.1.tgz", + "integrity": "sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.1" + } + }, + "node_modules/unplugin/node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/upath": { "version": "1.2.0", "license": "MIT", @@ -14547,9 +24978,81 @@ "punycode": "^2.1.0" } }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/urlsafe-base64": { "version": "1.0.0" }, + "node_modules/use-callback-ref": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz", + "integrity": "sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-resize-observer": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", + "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", + "dev": true, + "dependencies": { + "@juggle/resize-observer": "^3.3.1" + }, + "peerDependencies": { + "react": "16.8.0 - 18", + "react-dom": "16.8.0 - 18" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dev": true, + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/use-sync-external-store": { "version": "1.2.0", "license": "MIT", @@ -14568,15 +25071,34 @@ "node": ">=6.14.2" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } @@ -14611,10 +25133,20 @@ "node": ">=6" } }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } @@ -14659,17 +25191,24 @@ }, "node_modules/vlq": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", "peer": true }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, "node_modules/w3c-keyname": { "version": "2.2.8", "license": "MIT" }, "node_modules/walker": { "version": "1.0.8", - "license": "Apache-2.0", - "peer": true, + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dependencies": { "makeerror": "1.0.12" } @@ -14694,8 +25233,8 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dependencies": { "defaults": "^1.0.3" } @@ -14727,13 +25266,12 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause", - "peer": true + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { "version": "5.89.0", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -14776,18 +25314,120 @@ } } }, + "node_modules/webpack-dev-middleware": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz", + "integrity": "sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.26.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", + "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", + "dev": true, + "dependencies": { + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", + "strip-ansi": "^6.0.0" + } + }, "node_modules/webpack-sources": { "version": "3.2.3", "license": "MIT", - "peer": true, "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -14799,11 +25439,31 @@ "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/whatwg-fetch": { "version": "3.6.20", "license": "MIT", @@ -14811,8 +25471,8 @@ }, "node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14884,7 +25544,8 @@ }, "node_modules/which-module": { "version": "2.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "peer": true }, "node_modules/which-typed-array": { @@ -14904,6 +25565,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/workbox-background-sync": { "version": "7.0.0", "license": "MIT", @@ -15150,7 +25817,8 @@ }, "node_modules/workbox-webpack-plugin": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-7.0.0.tgz", + "integrity": "sha512-R1ZzCHPfzeJjLK2/TpKUhxSQ3fFDCxlWxgRhhSjMQLz3G2MlBnyw/XeYb34e7SGgSv0qG22zEhMIzjMNqNeKbw==", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", @@ -15191,7 +25859,24 @@ "node_modules/wrap-ansi": { "version": "7.0.0", "license": "MIT", - "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -15210,8 +25895,8 @@ }, "node_modules/write-file-atomic": { "version": "2.4.3", - "license": "ISC", - "peer": true, + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -15221,7 +25906,6 @@ "node_modules/ws": { "version": "6.2.2", "license": "MIT", - "peer": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -15234,8 +25918,8 @@ }, "node_modules/xtend": { "version": "4.0.2", - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } @@ -15243,7 +25927,6 @@ "node_modules/y18n": { "version": "5.0.8", "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -15262,7 +25945,6 @@ "node_modules/yargs": { "version": "17.7.2", "license": "MIT", - "peer": true, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -15279,11 +25961,20 @@ "node_modules/yargs-parser": { "version": "21.1.1", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "license": "MIT", diff --git a/package.json b/package.json index 7f97b125d..04bef6cc7 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "build": "next build", "start": "next start", "lint": "next lint", - "format": "prettier --write '**/*.{js,ts,tsx,jsx}'" + "format": "prettier --write '**/*.{js,ts,tsx,jsx}'", + "storybook": "storybook dev -p 6006", + "build-storybook": "storybook build" }, "dependencies": { "@ducanh2912/next-pwa": "^9.7.2", @@ -35,6 +37,7 @@ "dayjs": "^1.11.5", "eslint-config-next": "13.4.19", "eslint-config-prettier": "^9.0.0", + "firebase": "^10.8.0", "framer-motion": "^10.16.5", "jose": "^5.2.0", "lodash": "^4.17.21", @@ -60,9 +63,19 @@ "tls": "^0.0.1", "utf-8-validate": "^5.0.10", "web-push": "^3.6.6", + "workbox-webpack-plugin": "^7.0.0", "zustand": "^4.4.1" }, "devDependencies": { + "@storybook/addon-essentials": "^7.6.13", + "@storybook/addon-interactions": "^7.6.13", + "@storybook/addon-links": "^7.6.13", + "@storybook/addon-mdx-gfm": "^7.6.15", + "@storybook/addon-onboarding": "^1.0.11", + "@storybook/blocks": "^7.6.13", + "@storybook/nextjs": "^7.6.13", + "@storybook/react": "^7.6.13", + "@storybook/test": "^7.6.13", "@svgr/webpack": "^8.1.0", "@types/lodash": "^4.14.199", "@types/react-big-calendar": "^1.8.4", @@ -81,9 +94,11 @@ "eslint-plugin-promise": "^6.1.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-storybook": "^0.6.15", "lodash": "^4.17.21", "prettier": "^3.0.2", "sass": "^1.69.5", + "storybook": "^7.6.13", "typescript": "^5.1.6" } } diff --git a/public/icons/android/android-launchericon-144-144.png b/public/icons/android/android-launchericon-144-144.png index d57d2b044..978f83665 100644 Binary files a/public/icons/android/android-launchericon-144-144.png and b/public/icons/android/android-launchericon-144-144.png differ diff --git a/public/icons/android/android-launchericon-192-192.png b/public/icons/android/android-launchericon-192-192.png index 2afa69428..fe0af72e0 100644 Binary files a/public/icons/android/android-launchericon-192-192.png and b/public/icons/android/android-launchericon-192-192.png differ diff --git a/public/icons/android/android-launchericon-48-48.png b/public/icons/android/android-launchericon-48-48.png index ca38bebc1..09e2187e4 100644 Binary files a/public/icons/android/android-launchericon-48-48.png and b/public/icons/android/android-launchericon-48-48.png differ diff --git a/public/icons/android/android-launchericon-512-512.png b/public/icons/android/android-launchericon-512-512.png index c6d67fe96..e14a0d362 100644 Binary files a/public/icons/android/android-launchericon-512-512.png and b/public/icons/android/android-launchericon-512-512.png differ diff --git a/public/icons/android/android-launchericon-72-72.png b/public/icons/android/android-launchericon-72-72.png index fde394b2d..7af2a2044 100644 Binary files a/public/icons/android/android-launchericon-72-72.png and b/public/icons/android/android-launchericon-72-72.png differ diff --git a/public/icons/android/android-launchericon-96-96.png b/public/icons/android/android-launchericon-96-96.png index 958c21cb4..5b46beced 100644 Binary files a/public/icons/android/android-launchericon-96-96.png and b/public/icons/android/android-launchericon-96-96.png differ diff --git a/public/icons/favicon.ico b/public/icons/favicon.ico index 3ee455499..7be42d0a8 100644 Binary files a/public/icons/favicon.ico and b/public/icons/favicon.ico differ diff --git a/public/icons/icons.json b/public/icons/icons.json index 9d9dbbfc0..423f5fc94 100644 --- a/public/icons/icons.json +++ b/public/icons/icons.json @@ -1,452 +1,452 @@ { "icons": [ { - "src": "windows11/SmallTile.scale-100.png", + "src": "icons/windows11/SmallTile.scale-100.png", "sizes": "71x71" }, { - "src": "windows11/SmallTile.scale-125.png", + "src": "icons/windows11/SmallTile.scale-125.png", "sizes": "89x89" }, { - "src": "windows11/SmallTile.scale-150.png", + "src": "icons/windows11/SmallTile.scale-150.png", "sizes": "107x107" }, { - "src": "windows11/SmallTile.scale-200.png", + "src": "icons/windows11/SmallTile.scale-200.png", "sizes": "142x142" }, { - "src": "windows11/SmallTile.scale-400.png", + "src": "icons/windows11/SmallTile.scale-400.png", "sizes": "284x284" }, { - "src": "windows11/Square150x150Logo.scale-100.png", + "src": "icons/windows11/Square150x150Logo.scale-100.png", "sizes": "150x150" }, { - "src": "windows11/Square150x150Logo.scale-125.png", + "src": "icons/windows11/Square150x150Logo.scale-125.png", "sizes": "188x188" }, { - "src": "windows11/Square150x150Logo.scale-150.png", + "src": "icons/windows11/Square150x150Logo.scale-150.png", "sizes": "225x225" }, { - "src": "windows11/Square150x150Logo.scale-200.png", + "src": "icons/windows11/Square150x150Logo.scale-200.png", "sizes": "300x300" }, { - "src": "windows11/Square150x150Logo.scale-400.png", + "src": "icons/windows11/Square150x150Logo.scale-400.png", "sizes": "600x600" }, { - "src": "windows11/Wide310x150Logo.scale-100.png", + "src": "icons/windows11/Wide310x150Logo.scale-100.png", "sizes": "310x150" }, { - "src": "windows11/Wide310x150Logo.scale-125.png", + "src": "icons/windows11/Wide310x150Logo.scale-125.png", "sizes": "388x188" }, { - "src": "windows11/Wide310x150Logo.scale-150.png", + "src": "icons/windows11/Wide310x150Logo.scale-150.png", "sizes": "465x225" }, { - "src": "windows11/Wide310x150Logo.scale-200.png", + "src": "icons/windows11/Wide310x150Logo.scale-200.png", "sizes": "620x300" }, { - "src": "windows11/Wide310x150Logo.scale-400.png", + "src": "icons/windows11/Wide310x150Logo.scale-400.png", "sizes": "1240x600" }, { - "src": "windows11/LargeTile.scale-100.png", + "src": "icons/windows11/LargeTile.scale-100.png", "sizes": "310x310" }, { - "src": "windows11/LargeTile.scale-125.png", + "src": "icons/windows11/LargeTile.scale-125.png", "sizes": "388x388" }, { - "src": "windows11/LargeTile.scale-150.png", + "src": "icons/windows11/LargeTile.scale-150.png", "sizes": "465x465" }, { - "src": "windows11/LargeTile.scale-200.png", + "src": "icons/windows11/LargeTile.scale-200.png", "sizes": "620x620" }, { - "src": "windows11/LargeTile.scale-400.png", + "src": "icons/windows11/LargeTile.scale-400.png", "sizes": "1240x1240" }, { - "src": "windows11/Square44x44Logo.scale-100.png", + "src": "icons/windows11/Square44x44Logo.scale-100.png", "sizes": "44x44" }, { - "src": "windows11/Square44x44Logo.scale-125.png", + "src": "icons/windows11/Square44x44Logo.scale-125.png", "sizes": "55x55" }, { - "src": "windows11/Square44x44Logo.scale-150.png", + "src": "icons/windows11/Square44x44Logo.scale-150.png", "sizes": "66x66" }, { - "src": "windows11/Square44x44Logo.scale-200.png", + "src": "icons/windows11/Square44x44Logo.scale-200.png", "sizes": "88x88" }, { - "src": "windows11/Square44x44Logo.scale-400.png", + "src": "icons/windows11/Square44x44Logo.scale-400.png", "sizes": "176x176" }, { - "src": "windows11/StoreLogo.scale-100.png", + "src": "icons/windows11/StoreLogo.scale-100.png", "sizes": "50x50" }, { - "src": "windows11/StoreLogo.scale-125.png", + "src": "icons/windows11/StoreLogo.scale-125.png", "sizes": "63x63" }, { - "src": "windows11/StoreLogo.scale-150.png", + "src": "icons/windows11/StoreLogo.scale-150.png", "sizes": "75x75" }, { - "src": "windows11/StoreLogo.scale-200.png", + "src": "icons/windows11/StoreLogo.scale-200.png", "sizes": "100x100" }, { - "src": "windows11/StoreLogo.scale-400.png", + "src": "icons/windows11/StoreLogo.scale-400.png", "sizes": "200x200" }, { - "src": "windows11/SplashScreen.scale-100.png", + "src": "icons/windows11/SplashScreen.scale-100.png", "sizes": "620x300" }, { - "src": "windows11/SplashScreen.scale-125.png", + "src": "icons/windows11/SplashScreen.scale-125.png", "sizes": "775x375" }, { - "src": "windows11/SplashScreen.scale-150.png", + "src": "icons/windows11/SplashScreen.scale-150.png", "sizes": "930x450" }, { - "src": "windows11/SplashScreen.scale-200.png", + "src": "icons/windows11/SplashScreen.scale-200.png", "sizes": "1240x600" }, { - "src": "windows11/SplashScreen.scale-400.png", + "src": "icons/windows11/SplashScreen.scale-400.png", "sizes": "2480x1200" }, { - "src": "windows11/Square44x44Logo.targetsize-16.png", + "src": "icons/windows11/Square44x44Logo.targetsize-16.png", "sizes": "16x16" }, { - "src": "windows11/Square44x44Logo.targetsize-20.png", + "src": "icons/windows11/Square44x44Logo.targetsize-20.png", "sizes": "20x20" }, { - "src": "windows11/Square44x44Logo.targetsize-24.png", + "src": "icons/windows11/Square44x44Logo.targetsize-24.png", "sizes": "24x24" }, { - "src": "windows11/Square44x44Logo.targetsize-30.png", + "src": "icons/windows11/Square44x44Logo.targetsize-30.png", "sizes": "30x30" }, { - "src": "windows11/Square44x44Logo.targetsize-32.png", + "src": "icons/windows11/Square44x44Logo.targetsize-32.png", "sizes": "32x32" }, { - "src": "windows11/Square44x44Logo.targetsize-36.png", + "src": "icons/windows11/Square44x44Logo.targetsize-36.png", "sizes": "36x36" }, { - "src": "windows11/Square44x44Logo.targetsize-40.png", + "src": "icons/windows11/Square44x44Logo.targetsize-40.png", "sizes": "40x40" }, { - "src": "windows11/Square44x44Logo.targetsize-44.png", + "src": "icons/windows11/Square44x44Logo.targetsize-44.png", "sizes": "44x44" }, { - "src": "windows11/Square44x44Logo.targetsize-48.png", + "src": "icons/windows11/Square44x44Logo.targetsize-48.png", "sizes": "48x48" }, { - "src": "windows11/Square44x44Logo.targetsize-60.png", + "src": "icons/windows11/Square44x44Logo.targetsize-60.png", "sizes": "60x60" }, { - "src": "windows11/Square44x44Logo.targetsize-64.png", + "src": "icons/windows11/Square44x44Logo.targetsize-64.png", "sizes": "64x64" }, { - "src": "windows11/Square44x44Logo.targetsize-72.png", + "src": "icons/windows11/Square44x44Logo.targetsize-72.png", "sizes": "72x72" }, { - "src": "windows11/Square44x44Logo.targetsize-80.png", + "src": "icons/windows11/Square44x44Logo.targetsize-80.png", "sizes": "80x80" }, { - "src": "windows11/Square44x44Logo.targetsize-96.png", + "src": "icons/windows11/Square44x44Logo.targetsize-96.png", "sizes": "96x96" }, { - "src": "windows11/Square44x44Logo.targetsize-256.png", + "src": "icons/windows11/Square44x44Logo.targetsize-256.png", "sizes": "256x256" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-16.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png", "sizes": "16x16" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-20.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png", "sizes": "20x20" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-24.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png", "sizes": "24x24" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-30.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png", "sizes": "30x30" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-32.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png", "sizes": "32x32" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-36.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png", "sizes": "36x36" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-40.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png", "sizes": "40x40" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-44.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png", "sizes": "44x44" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-48.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png", "sizes": "48x48" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-60.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png", "sizes": "60x60" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-64.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png", "sizes": "64x64" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-72.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png", "sizes": "72x72" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-80.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png", "sizes": "80x80" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-96.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png", "sizes": "96x96" }, { - "src": "windows11/Square44x44Logo.altform-unplated_targetsize-256.png", + "src": "icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png", "sizes": "256x256" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png", "sizes": "16x16" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png", "sizes": "20x20" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png", "sizes": "24x24" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png", "sizes": "30x30" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png", "sizes": "32x32" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png", "sizes": "36x36" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png", "sizes": "40x40" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png", "sizes": "44x44" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png", "sizes": "48x48" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png", "sizes": "60x60" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png", "sizes": "64x64" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png", "sizes": "72x72" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png", "sizes": "80x80" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png", "sizes": "96x96" }, { - "src": "windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png", + "src": "icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png", "sizes": "256x256" }, { - "src": "android/android-launchericon-512-512.png", + "src": "icons/android/android-launchericon-512-512.png", "sizes": "512x512" }, { - "src": "android/android-launchericon-192-192.png", + "src": "icons/android/android-launchericon-192-192.png", "sizes": "192x192" }, { - "src": "android/android-launchericon-144-144.png", + "src": "icons/android/android-launchericon-144-144.png", "sizes": "144x144" }, { - "src": "android/android-launchericon-96-96.png", + "src": "icons/android/android-launchericon-96-96.png", "sizes": "96x96" }, { - "src": "android/android-launchericon-72-72.png", + "src": "icons/android/android-launchericon-72-72.png", "sizes": "72x72" }, { - "src": "android/android-launchericon-48-48.png", + "src": "icons/android/android-launchericon-48-48.png", "sizes": "48x48" }, { - "src": "ios/16.png", + "src": "icons/ios/16.png", "sizes": "16x16" }, { - "src": "ios/20.png", + "src": "icons/ios/20.png", "sizes": "20x20" }, { - "src": "ios/29.png", + "src": "icons/ios/29.png", "sizes": "29x29" }, { - "src": "ios/32.png", + "src": "icons/ios/32.png", "sizes": "32x32" }, { - "src": "ios/40.png", + "src": "icons/ios/40.png", "sizes": "40x40" }, { - "src": "ios/50.png", + "src": "icons/ios/50.png", "sizes": "50x50" }, { - "src": "ios/57.png", + "src": "icons/ios/57.png", "sizes": "57x57" }, { - "src": "ios/58.png", + "src": "icons/ios/58.png", "sizes": "58x58" }, { - "src": "ios/60.png", + "src": "icons/ios/60.png", "sizes": "60x60" }, { - "src": "ios/64.png", + "src": "icons/ios/64.png", "sizes": "64x64" }, { - "src": "ios/72.png", + "src": "icons/ios/72.png", "sizes": "72x72" }, { - "src": "ios/76.png", + "src": "icons/ios/76.png", "sizes": "76x76" }, { - "src": "ios/80.png", + "src": "icons/ios/80.png", "sizes": "80x80" }, { - "src": "ios/87.png", + "src": "icons/ios/87.png", "sizes": "87x87" }, { - "src": "ios/100.png", + "src": "icons/ios/100.png", "sizes": "100x100" }, { - "src": "ios/114.png", + "src": "icons/ios/114.png", "sizes": "114x114" }, { - "src": "ios/120.png", + "src": "icons/ios/120.png", "sizes": "120x120" }, { - "src": "ios/128.png", + "src": "icons/ios/128.png", "sizes": "128x128" }, { - "src": "ios/144.png", + "src": "icons/ios/144.png", "sizes": "144x144" }, { - "src": "ios/152.png", + "src": "icons/ios/152.png", "sizes": "152x152" }, { - "src": "ios/167.png", + "src": "icons/ios/167.png", "sizes": "167x167" }, { - "src": "ios/180.png", + "src": "icons/ios/180.png", "sizes": "180x180" }, { - "src": "ios/192.png", + "src": "icons/ios/192.png", "sizes": "192x192" }, { - "src": "ios/256.png", + "src": "icons/ios/256.png", "sizes": "256x256" }, { - "src": "ios/512.png", + "src": "icons/ios/512.png", "sizes": "512x512" }, { - "src": "ios/1024.png", + "src": "icons/ios/1024.png", "sizes": "1024x1024" } ] -} \ No newline at end of file +} diff --git a/public/icons/ios/100.png b/public/icons/ios/100.png index c6639aaec..75400ca08 100644 Binary files a/public/icons/ios/100.png and b/public/icons/ios/100.png differ diff --git a/public/icons/ios/1024.png b/public/icons/ios/1024.png index b8829b9fe..689d079b7 100644 Binary files a/public/icons/ios/1024.png and b/public/icons/ios/1024.png differ diff --git a/public/icons/ios/114.png b/public/icons/ios/114.png index 36f2a8c07..35c10ecc4 100644 Binary files a/public/icons/ios/114.png and b/public/icons/ios/114.png differ diff --git a/public/icons/ios/120.png b/public/icons/ios/120.png index 44b5d427c..2db296b03 100644 Binary files a/public/icons/ios/120.png and b/public/icons/ios/120.png differ diff --git a/public/icons/ios/128.png b/public/icons/ios/128.png index 2fb8de360..1015bd285 100644 Binary files a/public/icons/ios/128.png and b/public/icons/ios/128.png differ diff --git a/public/icons/ios/144.png b/public/icons/ios/144.png index d57d2b044..978f83665 100644 Binary files a/public/icons/ios/144.png and b/public/icons/ios/144.png differ diff --git a/public/icons/ios/152.png b/public/icons/ios/152.png index b64feca7d..c7f0c9464 100644 Binary files a/public/icons/ios/152.png and b/public/icons/ios/152.png differ diff --git a/public/icons/ios/16.png b/public/icons/ios/16.png index 0d2c3f122..8a8f10dea 100644 Binary files a/public/icons/ios/16.png and b/public/icons/ios/16.png differ diff --git a/public/icons/ios/167.png b/public/icons/ios/167.png index 9dc61369c..3962fc348 100644 Binary files a/public/icons/ios/167.png and b/public/icons/ios/167.png differ diff --git a/public/icons/ios/180.png b/public/icons/ios/180.png index 28b8c2df8..0d2beb85d 100644 Binary files a/public/icons/ios/180.png and b/public/icons/ios/180.png differ diff --git a/public/icons/ios/192.png b/public/icons/ios/192.png index 2afa69428..fe0af72e0 100644 Binary files a/public/icons/ios/192.png and b/public/icons/ios/192.png differ diff --git a/public/icons/ios/20.png b/public/icons/ios/20.png index dc5ef9e25..3041697c3 100644 Binary files a/public/icons/ios/20.png and b/public/icons/ios/20.png differ diff --git a/public/icons/ios/256.png b/public/icons/ios/256.png index 9e1aa4426..e02cc05a4 100644 Binary files a/public/icons/ios/256.png and b/public/icons/ios/256.png differ diff --git a/public/icons/ios/29.png b/public/icons/ios/29.png index b50cb18c0..600a7bea1 100644 Binary files a/public/icons/ios/29.png and b/public/icons/ios/29.png differ diff --git a/public/icons/ios/32.png b/public/icons/ios/32.png index b5ea8640e..bf1b25c1b 100644 Binary files a/public/icons/ios/32.png and b/public/icons/ios/32.png differ diff --git a/public/icons/ios/40.png b/public/icons/ios/40.png index 854abdc8e..fa9a8745d 100644 Binary files a/public/icons/ios/40.png and b/public/icons/ios/40.png differ diff --git a/public/icons/ios/50.png b/public/icons/ios/50.png index 3ee455499..f75063f97 100644 Binary files a/public/icons/ios/50.png and b/public/icons/ios/50.png differ diff --git a/public/icons/ios/512.png b/public/icons/ios/512.png index c6d67fe96..e14a0d362 100644 Binary files a/public/icons/ios/512.png and b/public/icons/ios/512.png differ diff --git a/public/icons/ios/57.png b/public/icons/ios/57.png index ea36afaf0..1ad9737e0 100644 Binary files a/public/icons/ios/57.png and b/public/icons/ios/57.png differ diff --git a/public/icons/ios/58.png b/public/icons/ios/58.png index 007108f24..bc9c46d3f 100644 Binary files a/public/icons/ios/58.png and b/public/icons/ios/58.png differ diff --git a/public/icons/ios/60.png b/public/icons/ios/60.png index b9a53b752..db6027ae7 100644 Binary files a/public/icons/ios/60.png and b/public/icons/ios/60.png differ diff --git a/public/icons/ios/64.png b/public/icons/ios/64.png index 6945bf312..ac7e207ca 100644 Binary files a/public/icons/ios/64.png and b/public/icons/ios/64.png differ diff --git a/public/icons/ios/72.png b/public/icons/ios/72.png index fde394b2d..7af2a2044 100644 Binary files a/public/icons/ios/72.png and b/public/icons/ios/72.png differ diff --git a/public/icons/ios/76.png b/public/icons/ios/76.png index c9af44014..9cba536b7 100644 Binary files a/public/icons/ios/76.png and b/public/icons/ios/76.png differ diff --git a/public/icons/ios/80.png b/public/icons/ios/80.png index 0f77b9b44..98c9413c1 100644 Binary files a/public/icons/ios/80.png and b/public/icons/ios/80.png differ diff --git a/public/icons/ios/87.png b/public/icons/ios/87.png index 5b8eec43a..d3b317f15 100644 Binary files a/public/icons/ios/87.png and b/public/icons/ios/87.png differ diff --git a/public/icons/windows11/LargeTile.scale-100.png b/public/icons/windows11/LargeTile.scale-100.png index 8e6db12f2..0b1485ff5 100644 Binary files a/public/icons/windows11/LargeTile.scale-100.png and b/public/icons/windows11/LargeTile.scale-100.png differ diff --git a/public/icons/windows11/LargeTile.scale-125.png b/public/icons/windows11/LargeTile.scale-125.png index fa70589ee..b741c15b4 100644 Binary files a/public/icons/windows11/LargeTile.scale-125.png and b/public/icons/windows11/LargeTile.scale-125.png differ diff --git a/public/icons/windows11/LargeTile.scale-150.png b/public/icons/windows11/LargeTile.scale-150.png index 6b0bc1eff..aa89b92f1 100644 Binary files a/public/icons/windows11/LargeTile.scale-150.png and b/public/icons/windows11/LargeTile.scale-150.png differ diff --git a/public/icons/windows11/LargeTile.scale-200.png b/public/icons/windows11/LargeTile.scale-200.png index 5621557d4..80f6b9dae 100644 Binary files a/public/icons/windows11/LargeTile.scale-200.png and b/public/icons/windows11/LargeTile.scale-200.png differ diff --git a/public/icons/windows11/LargeTile.scale-400.png b/public/icons/windows11/LargeTile.scale-400.png index f20a2fe17..aff4319df 100644 Binary files a/public/icons/windows11/LargeTile.scale-400.png and b/public/icons/windows11/LargeTile.scale-400.png differ diff --git a/public/icons/windows11/SmallTile.scale-100.png b/public/icons/windows11/SmallTile.scale-100.png index 911a811db..d9670a426 100644 Binary files a/public/icons/windows11/SmallTile.scale-100.png and b/public/icons/windows11/SmallTile.scale-100.png differ diff --git a/public/icons/windows11/SmallTile.scale-125.png b/public/icons/windows11/SmallTile.scale-125.png index fb57c9f9a..6777daa38 100644 Binary files a/public/icons/windows11/SmallTile.scale-125.png and b/public/icons/windows11/SmallTile.scale-125.png differ diff --git a/public/icons/windows11/SmallTile.scale-150.png b/public/icons/windows11/SmallTile.scale-150.png index 945e8899e..c3bac1399 100644 Binary files a/public/icons/windows11/SmallTile.scale-150.png and b/public/icons/windows11/SmallTile.scale-150.png differ diff --git a/public/icons/windows11/SmallTile.scale-200.png b/public/icons/windows11/SmallTile.scale-200.png index 97eee39f1..8664d399e 100644 Binary files a/public/icons/windows11/SmallTile.scale-200.png and b/public/icons/windows11/SmallTile.scale-200.png differ diff --git a/public/icons/windows11/SmallTile.scale-400.png b/public/icons/windows11/SmallTile.scale-400.png index cfbf8e494..1021d7ed9 100644 Binary files a/public/icons/windows11/SmallTile.scale-400.png and b/public/icons/windows11/SmallTile.scale-400.png differ diff --git a/public/icons/windows11/SplashScreen.scale-100.png b/public/icons/windows11/SplashScreen.scale-100.png index 9bb07aae7..1ce52b0cc 100644 Binary files a/public/icons/windows11/SplashScreen.scale-100.png and b/public/icons/windows11/SplashScreen.scale-100.png differ diff --git a/public/icons/windows11/SplashScreen.scale-125.png b/public/icons/windows11/SplashScreen.scale-125.png index 0fb9dc2f7..b3ad6aeb1 100644 Binary files a/public/icons/windows11/SplashScreen.scale-125.png and b/public/icons/windows11/SplashScreen.scale-125.png differ diff --git a/public/icons/windows11/SplashScreen.scale-150.png b/public/icons/windows11/SplashScreen.scale-150.png index d4c292d43..d554ad017 100644 Binary files a/public/icons/windows11/SplashScreen.scale-150.png and b/public/icons/windows11/SplashScreen.scale-150.png differ diff --git a/public/icons/windows11/SplashScreen.scale-200.png b/public/icons/windows11/SplashScreen.scale-200.png index 53fbe9ed6..89d199ceb 100644 Binary files a/public/icons/windows11/SplashScreen.scale-200.png and b/public/icons/windows11/SplashScreen.scale-200.png differ diff --git a/public/icons/windows11/SplashScreen.scale-400.png b/public/icons/windows11/SplashScreen.scale-400.png index 724596262..b047eccb6 100644 Binary files a/public/icons/windows11/SplashScreen.scale-400.png and b/public/icons/windows11/SplashScreen.scale-400.png differ diff --git a/public/icons/windows11/Square150x150Logo.scale-100.png b/public/icons/windows11/Square150x150Logo.scale-100.png index 3d0760c52..b00abc5ba 100644 Binary files a/public/icons/windows11/Square150x150Logo.scale-100.png and b/public/icons/windows11/Square150x150Logo.scale-100.png differ diff --git a/public/icons/windows11/Square150x150Logo.scale-125.png b/public/icons/windows11/Square150x150Logo.scale-125.png index e95db2658..ff36f63b6 100644 Binary files a/public/icons/windows11/Square150x150Logo.scale-125.png and b/public/icons/windows11/Square150x150Logo.scale-125.png differ diff --git a/public/icons/windows11/Square150x150Logo.scale-150.png b/public/icons/windows11/Square150x150Logo.scale-150.png index afda4d5f0..5a97e6c29 100644 Binary files a/public/icons/windows11/Square150x150Logo.scale-150.png and b/public/icons/windows11/Square150x150Logo.scale-150.png differ diff --git a/public/icons/windows11/Square150x150Logo.scale-200.png b/public/icons/windows11/Square150x150Logo.scale-200.png index 26276014e..e18e8898d 100644 Binary files a/public/icons/windows11/Square150x150Logo.scale-200.png and b/public/icons/windows11/Square150x150Logo.scale-200.png differ diff --git a/public/icons/windows11/Square150x150Logo.scale-400.png b/public/icons/windows11/Square150x150Logo.scale-400.png index cfbc59bf8..a64695188 100644 Binary files a/public/icons/windows11/Square150x150Logo.scale-400.png and b/public/icons/windows11/Square150x150Logo.scale-400.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png index c492864f4..8a8f10dea 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-16.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png index f9154def8..3041697c3 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-20.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png index 115909723..0f6f4b9b6 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-24.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png index 023806572..e02cc05a4 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-256.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png index 5c817bd0c..d1916de31 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-30.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png index e2043a5c5..bf1b25c1b 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-32.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png index 0cc88a204..87963638a 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-36.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png index a9b3f251a..fa9a8745d 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-40.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png index 3b138f391..197ee4bf4 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-44.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png index 3cd7dc0d7..09e2187e4 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-48.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png index d3f32c5c8..db6027ae7 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-60.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png index e6b421c06..ac7e207ca 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-64.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png index 405347105..7af2a2044 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-72.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png index 90c9608a8..98c9413c1 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-80.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png index 53ef67bd3..5b46beced 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png and b/public/icons/windows11/Square44x44Logo.altform-lightunplated_targetsize-96.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png index c492864f4..8a8f10dea 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-16.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png index f9154def8..3041697c3 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-20.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png index 115909723..0f6f4b9b6 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-24.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png index 023806572..e02cc05a4 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-256.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png index 5c817bd0c..d1916de31 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-30.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png index e2043a5c5..bf1b25c1b 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-32.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png index 0cc88a204..87963638a 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-36.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png index a9b3f251a..fa9a8745d 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-40.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png index 3b138f391..197ee4bf4 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-44.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png index 3cd7dc0d7..09e2187e4 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-48.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png index d3f32c5c8..db6027ae7 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-60.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png index e6b421c06..ac7e207ca 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-64.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png index 405347105..7af2a2044 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-72.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png index 90c9608a8..98c9413c1 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-80.png differ diff --git a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png index 53ef67bd3..5b46beced 100644 Binary files a/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png and b/public/icons/windows11/Square44x44Logo.altform-unplated_targetsize-96.png differ diff --git a/public/icons/windows11/Square44x44Logo.scale-100.png b/public/icons/windows11/Square44x44Logo.scale-100.png index 3b138f391..197ee4bf4 100644 Binary files a/public/icons/windows11/Square44x44Logo.scale-100.png and b/public/icons/windows11/Square44x44Logo.scale-100.png differ diff --git a/public/icons/windows11/Square44x44Logo.scale-125.png b/public/icons/windows11/Square44x44Logo.scale-125.png index d0e4f1e56..e9b466d11 100644 Binary files a/public/icons/windows11/Square44x44Logo.scale-125.png and b/public/icons/windows11/Square44x44Logo.scale-125.png differ diff --git a/public/icons/windows11/Square44x44Logo.scale-150.png b/public/icons/windows11/Square44x44Logo.scale-150.png index 3a04c97c0..ebf04346e 100644 Binary files a/public/icons/windows11/Square44x44Logo.scale-150.png and b/public/icons/windows11/Square44x44Logo.scale-150.png differ diff --git a/public/icons/windows11/Square44x44Logo.scale-200.png b/public/icons/windows11/Square44x44Logo.scale-200.png index 70a717e3e..467684a31 100644 Binary files a/public/icons/windows11/Square44x44Logo.scale-200.png and b/public/icons/windows11/Square44x44Logo.scale-200.png differ diff --git a/public/icons/windows11/Square44x44Logo.scale-400.png b/public/icons/windows11/Square44x44Logo.scale-400.png index 8a90d5e3a..cf6e5d56d 100644 Binary files a/public/icons/windows11/Square44x44Logo.scale-400.png and b/public/icons/windows11/Square44x44Logo.scale-400.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-16.png b/public/icons/windows11/Square44x44Logo.targetsize-16.png index c492864f4..8a8f10dea 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-16.png and b/public/icons/windows11/Square44x44Logo.targetsize-16.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-20.png b/public/icons/windows11/Square44x44Logo.targetsize-20.png index f9154def8..3041697c3 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-20.png and b/public/icons/windows11/Square44x44Logo.targetsize-20.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-24.png b/public/icons/windows11/Square44x44Logo.targetsize-24.png index 115909723..0f6f4b9b6 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-24.png and b/public/icons/windows11/Square44x44Logo.targetsize-24.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-256.png b/public/icons/windows11/Square44x44Logo.targetsize-256.png index 023806572..e02cc05a4 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-256.png and b/public/icons/windows11/Square44x44Logo.targetsize-256.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-30.png b/public/icons/windows11/Square44x44Logo.targetsize-30.png index 5c817bd0c..d1916de31 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-30.png and b/public/icons/windows11/Square44x44Logo.targetsize-30.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-32.png b/public/icons/windows11/Square44x44Logo.targetsize-32.png index e2043a5c5..bf1b25c1b 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-32.png and b/public/icons/windows11/Square44x44Logo.targetsize-32.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-36.png b/public/icons/windows11/Square44x44Logo.targetsize-36.png index 0cc88a204..87963638a 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-36.png and b/public/icons/windows11/Square44x44Logo.targetsize-36.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-40.png b/public/icons/windows11/Square44x44Logo.targetsize-40.png index a9b3f251a..fa9a8745d 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-40.png and b/public/icons/windows11/Square44x44Logo.targetsize-40.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-44.png b/public/icons/windows11/Square44x44Logo.targetsize-44.png index 3b138f391..197ee4bf4 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-44.png and b/public/icons/windows11/Square44x44Logo.targetsize-44.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-48.png b/public/icons/windows11/Square44x44Logo.targetsize-48.png index 3cd7dc0d7..09e2187e4 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-48.png and b/public/icons/windows11/Square44x44Logo.targetsize-48.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-60.png b/public/icons/windows11/Square44x44Logo.targetsize-60.png index d3f32c5c8..db6027ae7 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-60.png and b/public/icons/windows11/Square44x44Logo.targetsize-60.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-64.png b/public/icons/windows11/Square44x44Logo.targetsize-64.png index e6b421c06..ac7e207ca 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-64.png and b/public/icons/windows11/Square44x44Logo.targetsize-64.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-72.png b/public/icons/windows11/Square44x44Logo.targetsize-72.png index 405347105..7af2a2044 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-72.png and b/public/icons/windows11/Square44x44Logo.targetsize-72.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-80.png b/public/icons/windows11/Square44x44Logo.targetsize-80.png index 90c9608a8..98c9413c1 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-80.png and b/public/icons/windows11/Square44x44Logo.targetsize-80.png differ diff --git a/public/icons/windows11/Square44x44Logo.targetsize-96.png b/public/icons/windows11/Square44x44Logo.targetsize-96.png index 53ef67bd3..5b46beced 100644 Binary files a/public/icons/windows11/Square44x44Logo.targetsize-96.png and b/public/icons/windows11/Square44x44Logo.targetsize-96.png differ diff --git a/public/icons/windows11/StoreLogo.scale-100.png b/public/icons/windows11/StoreLogo.scale-100.png index 3ee455499..b2fab5d5e 100644 Binary files a/public/icons/windows11/StoreLogo.scale-100.png and b/public/icons/windows11/StoreLogo.scale-100.png differ diff --git a/public/icons/windows11/StoreLogo.scale-125.png b/public/icons/windows11/StoreLogo.scale-125.png index 355398422..8fe44e150 100644 Binary files a/public/icons/windows11/StoreLogo.scale-125.png and b/public/icons/windows11/StoreLogo.scale-125.png differ diff --git a/public/icons/windows11/StoreLogo.scale-150.png b/public/icons/windows11/StoreLogo.scale-150.png index 3aec5fe10..9ee725f96 100644 Binary files a/public/icons/windows11/StoreLogo.scale-150.png and b/public/icons/windows11/StoreLogo.scale-150.png differ diff --git a/public/icons/windows11/StoreLogo.scale-200.png b/public/icons/windows11/StoreLogo.scale-200.png index c6639aaec..3038f0e44 100644 Binary files a/public/icons/windows11/StoreLogo.scale-200.png and b/public/icons/windows11/StoreLogo.scale-200.png differ diff --git a/public/icons/windows11/StoreLogo.scale-400.png b/public/icons/windows11/StoreLogo.scale-400.png index 08cde90ab..41ad5ea64 100644 Binary files a/public/icons/windows11/StoreLogo.scale-400.png and b/public/icons/windows11/StoreLogo.scale-400.png differ diff --git a/public/icons/windows11/Wide310x150Logo.scale-100.png b/public/icons/windows11/Wide310x150Logo.scale-100.png index 92278ba54..1973f0d9e 100644 Binary files a/public/icons/windows11/Wide310x150Logo.scale-100.png and b/public/icons/windows11/Wide310x150Logo.scale-100.png differ diff --git a/public/icons/windows11/Wide310x150Logo.scale-125.png b/public/icons/windows11/Wide310x150Logo.scale-125.png index 5ba037877..52e857f0d 100644 Binary files a/public/icons/windows11/Wide310x150Logo.scale-125.png and b/public/icons/windows11/Wide310x150Logo.scale-125.png differ diff --git a/public/icons/windows11/Wide310x150Logo.scale-150.png b/public/icons/windows11/Wide310x150Logo.scale-150.png index 4da95469e..c0bd49c49 100644 Binary files a/public/icons/windows11/Wide310x150Logo.scale-150.png and b/public/icons/windows11/Wide310x150Logo.scale-150.png differ diff --git a/public/icons/windows11/Wide310x150Logo.scale-200.png b/public/icons/windows11/Wide310x150Logo.scale-200.png index 9bb07aae7..1ce52b0cc 100644 Binary files a/public/icons/windows11/Wide310x150Logo.scale-200.png and b/public/icons/windows11/Wide310x150Logo.scale-200.png differ diff --git a/public/icons/windows11/Wide310x150Logo.scale-400.png b/public/icons/windows11/Wide310x150Logo.scale-400.png index 53fbe9ed6..89d199ceb 100644 Binary files a/public/icons/windows11/Wide310x150Logo.scale-400.png and b/public/icons/windows11/Wide310x150Logo.scale-400.png differ diff --git a/public/images/alert/alert-message.svg b/public/images/alert/alert-message.svg new file mode 100644 index 000000000..4ec537b3b --- /dev/null +++ b/public/images/alert/alert-message.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/alert/alert-system.svg b/public/images/alert/alert-system.svg new file mode 100644 index 000000000..b34441370 --- /dev/null +++ b/public/images/alert/alert-system.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/alert/alert-team.svg b/public/images/alert/alert-team.svg new file mode 100644 index 000000000..9d1be554f --- /dev/null +++ b/public/images/alert/alert-team.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/images/iPhoneMock.svg b/public/images/iPhoneMock.svg new file mode 100644 index 000000000..47d545d06 --- /dev/null +++ b/public/images/iPhoneMock.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/manifest.json b/public/manifest.json index 126db0621..6c8612571 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -9,6 +9,7 @@ "scope": "/", "theme_color": "#8936FF", "background_color": "#060625", + "icons": [ { "src": "icons/windows11/SmallTile.scale-100.png", diff --git a/public/worker/index.js b/public/worker/index.js index 48829236b..a1051dffc 100644 --- a/public/worker/index.js +++ b/public/worker/index.js @@ -1,3 +1,55 @@ +importScripts( + 'https://www.gstatic.com/firebasejs/9.14.0/firebase-app-compat.js', +) +importScripts( + 'https://www.gstatic.com/firebasejs/9.14.0/firebase-messaging-compat.js', +) +importScripts( + 'https://storage.googleapis.com/workbox-cdn/releases/6.2.0/workbox-sw.js', +) + +// 1. 서비스 워커 설치 및 등록 + +self.addEventListener('install', (event) => { + // 서비스 워커 설치 + console.log('[Service Worker] Install') + self.skipWaiting() +}) + +self.addEventListener('activate', (event) => { + // 서비스 워커 활성화 + console.log('[Service Worker] Activate') +}) + +// 2. 푸시 메시지 수신 및 알림 표시 + +const firebaseConfig = { + apiKey: 'AIzaSyCVBmOaZ34Loogn8Ig7SFXTfO10IEThLOw', + projectId: 'peer-web-application', + messagingSenderId: '620097618965', + appId: '1:620097618965:web:81ba270413fec5a173ba1c', +} + +firebase.initializeApp(firebaseConfig) + +const messaging = firebase.messaging() + +messaging.onBackgroundMessage((payload) => { + console.log( + '[firebase-messaging-sw.js] Received background message ', + payload, + ) + // Customize notification here + const notificationTitle = payload.notification.title + const notificationOptions = { + body: payload.notification.body, + icon: '/icons/ios/192.png', + link: '/', // 추후 변경 + } + + self.registration.showNotification(notificationTitle, notificationOptions) +}) + self.addEventListener('push', (event) => { // 알림 푸시 console.log('[Service Worker] Push Received.') @@ -7,7 +59,7 @@ self.addEventListener('push', (event) => { const title = data.title const options = { body: data.body, - icon: '/images/icons/icon-192x192.png', + icon: '/icons/ios/192.png', link: '/', // 추후 변경 } @@ -22,13 +74,4 @@ self.addEventListener('notificationclick', (event) => { event.waitUntil(clients.openWindow(event.notification.data.link)) }) -self.addEventListener('install', (event) => { - // 서비스 워커 설치 - console.log('[Service Worker] Install') - self.skipWaiting() -}) - -self.addEventListener('activate', (event) => { - // 서비스 워커 활성화 - console.log('[Service Worker] Activate') -}) +// 3. 프리 캐싱 diff --git a/src/api/config.ts b/src/api/config.ts index 433001e36..8e7343b7c 100644 --- a/src/api/config.ts +++ b/src/api/config.ts @@ -7,7 +7,7 @@ const useAxiosWithAuth = () => { const router = useRouter() const axiosInstance = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_URL, + baseURL: process.env.NEXT_PUBLIC_CSR_API, }) //무한 요청 방지 flag @@ -34,7 +34,7 @@ const useAxiosWithAuth = () => { if (error.response?.status === 401) { if (!accessToken || isRefreshing) { // 로그아웃 후 리디렉션 - useAuthStore.getState().logout() + useAuthStore.getState().logout(isRefreshing) router.push('/login?redirect=' + currentPageUrl) } else { isRefreshing = true @@ -51,7 +51,7 @@ const useAxiosWithAuth = () => { } catch (refreshError) { // 로그아웃 후 리디렉션 isRefreshing = true - useAuthStore.getState().logout() + useAuthStore.getState().logout(isRefreshing) router.push('/login?redirect=' + currentPageUrl) } } diff --git a/src/api/fetchers.ts b/src/api/fetchers.ts index 2b3fb8871..fc7d71b91 100644 --- a/src/api/fetchers.ts +++ b/src/api/fetchers.ts @@ -37,7 +37,7 @@ export const fetchServerData = async (url: string) => { }) return response.data } catch (e) { - console.error(e) + console.error('fetchServerData error') } } diff --git a/src/api/location.tsx b/src/api/location.tsx index ae730e9ee..cc4215a8b 100644 --- a/src/api/location.tsx +++ b/src/api/location.tsx @@ -6,40 +6,42 @@ export interface ILocation { export const locationData: ILocation[] = [ { name: '선택안함', + subArea: [], }, { name: '서울특별시', subArea: [ - '강남구', - '강동구', + '종로구', + '중구', + '용산구', + '성동구', + '광진구', + '동대문구', + '중랑구', + '성북구', '강북구', + '도봉구', + '노원구', + '은평구', + '서대문구', + '마포구', + '양천구', '강서구', - '관악구', - '광진구', '구로구', '금천구', - '노원구', - '도봉구', - '동대문구', + '영등포구', '동작구', - '마포구', - '서대문구', + '관악구', '서초구', - '성동구', - '성북구', + '강남구', '송파구', - '양천구', - '영등포구', - '용산구', - '은평구', - '종로구', - '중구', - '중랑구', + '강동구', ], }, { name: '경기도', subArea: [ + '가평군', '고양시', '과천시', '광명시', @@ -57,6 +59,9 @@ export const locationData: ILocation[] = [ '안성시', '안양시', '양주시', + '양평군', + '여주시', + '연천군', '오산시', '용인시', '의왕시', @@ -67,23 +72,19 @@ export const locationData: ILocation[] = [ '포천시', '하남시', '화성시', - '가평군', - '양평군', - '여주군', - '연천군', ], }, { name: '인천광역시', subArea: [ - '계양구', - '미추홀구', - '남동구', + '중구', '동구', + '남구', + '연수구', + '남동구', '부평구', + '계양구', '서구', - '연수구', - '중구', '강화군', '옹진군', ], @@ -95,234 +96,205 @@ export const locationData: ILocation[] = [ { name: '대구광역시', subArea: [ - '남구', - '달서구', + '중구', '동구', - '북구', '서구', + '남구', + '북구', '수성구', - '중구', + '달서구', '달성군', ], }, { name: '부산광역시', subArea: [ - '강서구', - '금정구', - '남구', + '중구', + '서구', '동구', - '동래구', + '영도구', '부산진구', + '동래구', + '남구', '북구', - '사상구', + '강서구', + '해운대구', '사하구', - '서구', - '수영구', + '금정구', '연제구', - '영도구', - '중구', - '해운대구', + '수영구', + '사상구', '기장군', ], }, { name: '울산광역시', - subArea: ['남구', '동구', '북구', '중구', '울주군'], + subArea: ['중구', '남구', '동구', '북구', '울주군'], }, { name: '광주광역시', - subArea: ['광산구', '남구', '동구', '북구', '서구'], + subArea: ['동구', '서구', '남구', '북구', '광산구'], }, { name: '강원도', subArea: [ + '원주시', + '춘천시', '강릉시', '동해시', - '삼척시', '속초시', - '원주시', - '춘천시', + '삼척시', + '홍천군', '태백시', - '고성군', - '양구군', - '양양군', - '영월군', - '인제군', - '정선군', '철원군', + '횡성군', '평창군', - '홍천군', + '영월군', + '정선군', + '인제군', + '고성군', + '양양군', '화천군', - '횡성군', + '양구군', ], }, { name: '충청북도', subArea: [ - '제천시', '청주시', '충주시', - '괴산군', - '단양군', + '제천시', '보은군', - '영동군', '옥천군', - '음성군', + '영동군', '증평군', '진천군', - '청원군', + '괴산군', + '음성군', + '단양군', ], }, { name: '충청남도', subArea: [ - '계룡시', + '천안시', '공주시', - '논산시', '보령시', - '서산시', '아산시', - '천안시', + '서산시', + '논산시', + '계룡시', + '당진시', '금산군', - '당진군', '부여군', '서천군', - '연기군', - '예산군', '청양군', - '태안군', '홍성군', + '예산군', + '태안군', ], }, { name: '경상북도', subArea: [ - '경산시', + '포항시', '경주시', - '구미시', '김천시', - '문경시', - '상주시', '안동시', + '구미시', '영주시', '영천시', - '포항시', - '고령군', + '상주시', + '문경시', + '경산시', '군위군', - '봉화군', - '성주군', - '영덕군', - '영양군', - '예천군', - '울릉군', - '울진군', '의성군', - '청도군', '청송군', + '영양군', + '영덕군', + '청도군', + '고령군', + '성주군', '칠곡군', + '예천군', + '봉화군', + '울진군', + '울릉군', ], }, { name: '경상남도', subArea: [ - '거제시', + '창원시', '김해시', - '마산시', - '밀양시', - '사천시', - '양산시', '진주시', - '진해시', - '창원시', + '양산시', + '거제시', '통영시', + '사천시', + '밀양시', + '함안군', '거창군', + '창녕군', '고성군', + '하동군', + '합천군', '남해군', + '함양군', '산청군', '의령군', - '창녕군', - '하동군', - '함안군', - '함양군', - '합천군', ], }, { name: '전라북도', subArea: [ + '전주시', + '익산시', '군산시', + '정읍시', + '완주군', '김제시', '남원시', - '익산시', - '전주시', - '정읍시', '고창군', - '무주군', '부안군', - '순창군', - '완주군', '임실군', - '장수군', + '순창군', '진안군', + '장수군', + '무주군', ], }, { name: '전라남도', subArea: [ + '여수시', + '순천시', + '목포시', '광양시', '나주시', - '목포시', - '순천시', - '여수시', - '강진군', - '고흥군', - '곡성군', - '구례군', - '담양군', '무안군', - '보성군', - '신안군', - '영광군', + '해남군', + '고흥군', + '화순군', '영암군', + '영광군', '완도군', + '담양군', '장성군', + '보성군', + '신안군', '장흥군', - '진도군', + '강진군', '함평군', - '해남군', - '화순군', + '진도군', + '곡성군', + '구례군', ], }, { name: '제주특별자치도', - subArea: ['서귀포시', '제주시'], - }, - { - name: '경상남도', - subArea: [ - '거제시', - '김해시', - '마산시', - '밀양시', - '사천시', - '양산시', - '진주시', - '진해시', - '창원시', - '통영시', - '거창군', - '고성군', - '남해군', - '산청군', - '의령군', - '창녕군', - '하동군', - '함안군', - '함양군', - '합천군', - ], + subArea: ['제주시', '서귀포시'], }, ] diff --git a/src/app/about/@announce/page.tsx b/src/app/about/@announce/page.tsx index 2623bd0d9..4613e6ef0 100644 --- a/src/app/about/@announce/page.tsx +++ b/src/app/about/@announce/page.tsx @@ -4,6 +4,7 @@ import { defaultGetFetcher } from '@/api/fetchers' import CuCircularProgress from '@/components/CuCircularProgress' import NoDataDolphin from '@/components/NoDataDolphin' import useMedia from '@/hook/useMedia' +import useAboutLayout from '@/states/useAboutLayout' import { IPagination } from '@/types/IPagination' import { Card, @@ -13,7 +14,6 @@ import { Stack, Typography, } from '@mui/material' -import { useRouter } from 'next/navigation' import { ChangeEvent, useState } from 'react' import useSWR from 'swr' @@ -43,17 +43,19 @@ function formatDate(dateStr: string | null) { } const AnnounceCard = ({ title, writer, date, id }: AnnounceCardProps) => { - const router = useRouter() + const { setAnnounceDetail } = useAboutLayout() + return ( router.push(`/about/detail/${id}`)} + onClick={() => setAnnounceDetail(id)} sx={{ '.MuiCardActionArea-focusHighlight': { background: 'transparent', @@ -74,7 +76,7 @@ const AnnouncePage = () => { const { isPc } = useMedia() const [page, setPage] = useState(1) const { data, isLoading, error } = useSWR>( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/about/announcement?page=${page}&size=5`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/about/announcement?page=${page}&size=5`, defaultGetFetcher, ) @@ -87,7 +89,7 @@ const AnnouncePage = () => { if (error) return return ( - + 공지사항 diff --git a/src/app/about/@contact/page.tsx b/src/app/about/@contact/page.tsx index fc8d3d116..1f74f22b7 100644 --- a/src/app/about/@contact/page.tsx +++ b/src/app/about/@contact/page.tsx @@ -26,7 +26,7 @@ const ContactPage = () => { const onSubmit = handleSubmit((data) => { axios - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/about/contact-us`, data) + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/about/contact-us`, data) .then((res) => { if (res.status === 200) { alert('문의사항이 성공적으로 전송되었습니다.') @@ -40,7 +40,7 @@ const ContactPage = () => { return ( - Contact us + Contact Us { type="text" error={errors.firstName?.message ? true : false} helperText={errors.firstName?.message} - sx={{ width: '100%' }} + sx={{ + width: '100%', + }} {...register('firstName', { required: '필수 입력 내용입니다.', maxLength: 20, @@ -107,7 +109,9 @@ const ContactPage = () => { type="text" error={errors.lastName?.message ? true : false} helperText={errors.lastName?.message} - sx={{ width: '100%' }} + sx={{ + width: '100%', + }} {...register('lastName', { required: '필수 입력 내용입니다.', maxLength: 10, @@ -124,7 +128,9 @@ const ContactPage = () => { autoComplete="off" placeholder="이메일 주소" variant="outlined" - sx={{ width: '100%' }} + sx={{ + width: '100%', + }} type="email" error={errors.email?.message ? true : false} helperText={errors.email?.message} @@ -141,7 +147,9 @@ const ContactPage = () => { autoComplete="off" placeholder="(선택사항) 조직명" variant="outlined" - sx={{ width: '100%' }} + sx={{ + width: '100%', + }} {...register('company', { maxLength: 20, })} @@ -150,25 +158,31 @@ const ContactPage = () => { autoComplete="off" placeholder="(선택사항) 조직 웹사이트" variant="outlined" - sx={{ width: '100%' }} + sx={{ + width: '100%', + }} {...register('companySite', { maxLength: 30, })} /> diff --git a/src/app/about/@announce/detail/[id]/page.tsx b/src/app/about/@detail/page.tsx similarity index 70% rename from src/app/about/@announce/detail/[id]/page.tsx rename to src/app/about/@detail/page.tsx index 5a691ae82..c33daeb52 100644 --- a/src/app/about/@announce/detail/[id]/page.tsx +++ b/src/app/about/@detail/page.tsx @@ -1,9 +1,10 @@ 'use client' import { defaultGetFetcher } from '@/api/fetchers' -import useMedia from '@/hook/useMedia' -import { Avatar, Card, Stack, Typography } from '@mui/material' -import Image from 'next/image' +import CuCircularProgress from '@/components/CuCircularProgress' +import DynamicToastViewer from '@/components/DynamicToastViewer' +import useAboutLayout from '@/states/useAboutLayout' +import { Avatar, Button, Card, Stack, Typography } from '@mui/material' import useSWR from 'swr' interface AnnounceDailProp { @@ -32,19 +33,27 @@ function formatDate(dateStr: string | null) { return formattedDate } -const DetailPage = ({ params }: { params: { id: string } }) => { - const { isPc } = useMedia() +const DetailPage = () => { + const { setBoard, announceDetailId } = useAboutLayout() const { data, isLoading, error } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/about/announcement/${params.id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/about/announcement/${announceDetailId}`, defaultGetFetcher, ) - if (isLoading) return 로딩중 + if (isLoading) return if (error || !data) return 에러 발생 return ( + + + {data.title} @@ -73,26 +82,12 @@ const DetailPage = ({ params }: { params: { id: string } }) => { 조회수 - {data.view} - - 이메일 - 이메일 - - 이미지 -
- {data.content} +
diff --git a/src/app/about/@dictionary/page.tsx b/src/app/about/@dictionary/page.tsx index 9699d4109..777a0c00f 100644 --- a/src/app/about/@dictionary/page.tsx +++ b/src/app/about/@dictionary/page.tsx @@ -1,7 +1,11 @@ +'use client' + +import useMedia from '@/hook/useMedia' import { Button, Card, Stack, Typography } from '@mui/material' import Image from 'next/image' const DictionaryPage = () => { + const { isPc } = useMedia() return ( @@ -18,15 +22,17 @@ const DictionaryPage = () => { > {/* peer */} - - + + + + Front, Back, Designer - 피어 개발백서 diff --git a/src/app/about/@peer/page.tsx b/src/app/about/@peer/page.tsx index 899b022e1..eefcf2d69 100644 --- a/src/app/about/@peer/page.tsx +++ b/src/app/about/@peer/page.tsx @@ -3,7 +3,7 @@ import { Card, Stack, Typography } from '@mui/material' const PeerPage = () => { const initialValue = ` -# (공지) peer 소개 +# peer 소개 ### 우리는 동료의 힘을 믿습니다. peer 는 42 seoul (école 42 seoul campus) 학생들이 모여서 만든 커뮤니티 입니다. 우리는 교재, 수업, 교수가 없는 곳에서 동료학습으로 동료들과 함께 토론하고, 문제를 해결하는 법을 배우며 성장해왔습니다. 동료들과 함께하면 더 빨리 배우고, 불가능해 보이던 문제도 해결할 수 있다는 걸 경험했습니다. @@ -16,7 +16,7 @@ peer 는 42 seoul (école 42 seoul campus) 학생들이 모여서 만든 커뮤 함께한 동료를 칭찬해주세요. 다른 사람들에게 동료를 추천해주세요. 여러분의 동료에 대한 긍정적인 피드백은 “피어레벨(추후 반영 예정)”으로 돌려드리고자 합니다. ### 동료들과 협업할 수 있는 편리한 도구를 제공합니다. -스터디/프로젝트 팀만을 위한 공간을 제공합니다. “팀페이지"에서 팀원들과 만나보세요. 팀 공지, 자료, 캘린더 일정관리 등을 한번에 모아서 관리할 수 있습니다. +스터디/프로젝트 팀만을 위한 공간을 제공합니다. “나의 팀"에서 팀원들과 만나보세요. 팀 공지, 자료, 캘린더 일정관리 등을 한번에 모아서 관리할 수 있습니다. ### peer는 여러분의 성장을 응원합니다. 여러분들이 더 많은 동료들과 연결되고, 다양한 지식과 배움을 나누고, 함께 성장할 수 있는 방향으로 peer는 계속 나아가고자 합니다. 여러분들의 성장을 늘 응원하겠습니다 diff --git a/src/app/about/layout.tsx b/src/app/about/layout.tsx index 7d7ea54c3..dcb98bb96 100644 --- a/src/app/about/layout.tsx +++ b/src/app/about/layout.tsx @@ -1,8 +1,9 @@ 'use client' import useMedia from '@/hook/useMedia' +import useAboutLayout from '@/states/useAboutLayout' import { Button, ButtonGroup, Stack, Typography, styled } from '@mui/material' -import { ReactNode, useState } from 'react' +import { ReactNode } from 'react' const StyledButtonGroup = styled(ButtonGroup)({ '& .MuiButtonGroup-grouped:not(:last-of-type)': { @@ -10,25 +11,25 @@ const StyledButtonGroup = styled(ButtonGroup)({ }, }) -interface SidebarProps { - handleSidebar: (number: number) => void -} - -const Sidebar = ({ handleSidebar }: SidebarProps) => { +const Sidebar = () => { const { isPc } = useMedia() + const { setBoard } = useAboutLayout() + return ( About Us - - - - - - - + + + + + + ) @@ -42,31 +43,29 @@ interface AboutPageProps { dictionary: ReactNode service: ReactNode peer: ReactNode + detail: ReactNode } const AboutPage = (props: AboutPageProps) => { - const [active, setActive] = useState(0) - const { isPc } = useMedia() - - const handleSidebar = (value: number) => { - setActive(value) - } + const { boardType } = useAboutLayout() + const { isPc, isTablet } = useMedia() if (isPc) { return ( - + - + - {active === 0 && props.peer} - {active === 1 && props.mind} - {active === 2 && props.announce} - {active === 3 && props.dictionary} - {active === 4 && props.contact} - {active === 5 && props.personal} - {active === 6 && props.service} + {boardType === 'PEER' && props.peer} + {boardType === 'MIND' && props.mind} + {boardType === 'ANNOUNCE' && props.announce} + {boardType === 'DICTIONARY' && props.dictionary} + {boardType === 'CONTACT' && props.contact} + {boardType === 'PERSONAL' && props.personal} + {boardType === 'SERVICE' && props.service} + {boardType === 'ANNOUNCE_DETAIL' && props.detail} @@ -76,15 +75,16 @@ const AboutPage = (props: AboutPageProps) => { return ( - {active === 0 && props.peer} - {active === 1 && props.mind} - {active === 2 && props.announce} - {active === 3 && props.dictionary} - {active === 4 && props.contact} - {active === 5 && props.personal} - {active === 6 && props.service} + {boardType === 'PEER' && props.peer} + {boardType === 'MIND' && props.mind} + {boardType === 'ANNOUNCE' && props.announce} + {boardType === 'DICTIONARY' && props.dictionary} + {boardType === 'CONTACT' && props.contact} + {boardType === 'PERSONAL' && props.personal} + {boardType === 'SERVICE' && props.service} + {boardType === 'ANNOUNCE_DETAIL' && props.detail} - + ) } diff --git a/src/app/about/template.tsx b/src/app/about/template.tsx new file mode 100644 index 000000000..8853ec867 --- /dev/null +++ b/src/app/about/template.tsx @@ -0,0 +1,7 @@ +import React from 'react' + +const Template = ({ children }: { children: React.ReactNode }) => { + return
{children}
+} + +export default Template diff --git a/src/app/admin/announce/Announce.tsx b/src/app/admin/announce/Announce.tsx index 2efbabc4e..f596b5629 100644 --- a/src/app/admin/announce/Announce.tsx +++ b/src/app/admin/announce/Announce.tsx @@ -13,22 +13,26 @@ import { } from '@mui/material' import PageButton from '../panel/PageButton' import axios from 'axios' -import ImageUploadButton from '@/components/ImageUploadButton' -import Image from 'next/image' +// import ImageUploadButton from '@/components/ImageUploadButton' +// import Image from 'next/image' import { Controller, useForm } from 'react-hook-form' import { Radio } from '@mui/material' import { DateTimePicker } from '@mui/x-date-pickers' import dayjs from 'dayjs' import CuModal from '@/components/CuModal' import { idStyle, statusStyle, titleStyle } from './AnnounceStyles' -import DynamicToastEditor from '@/components/DynamicToastEditor' +import DynamicToastEditorAdmin from '@/components/DynamicToastEditorAdmin' import { Editor } from '@toast-ui/editor' import DynamicToastViewer from '@/components/DynamicToastViewer' +import { config } from '../panel/AdminAxios' +import CuTextModal from '@/components/CuTextModal' +import useModal from '@/hook/useModal' +import useToast from '@/states/useToast' interface IAnnounceAllContent { announcementId: number - previewImage: string - image: string + // previewImage: string + // image: string title: string writer: string view: number @@ -41,8 +45,8 @@ interface IAnnounceAllContent { const defaultValues: IAnnounceAllContent = { announcementId: -1, - previewImage: '/images/defaultImage.png', - image: '', + // previewImage: '/images/defaultImage.png', + // image: '', title: '', writer: '', view: -1, @@ -56,7 +60,7 @@ const defaultValues: IAnnounceAllContent = { interface content { announcementId: number announcementStatus: string - image: string + // image: string title: string } @@ -81,7 +85,7 @@ interface content { // } interface IAnnounceContentWrite { - image: string + // image: string writer: string title: string announcementNoticeStatus: string // enum @@ -91,7 +95,7 @@ interface IAnnounceContentWrite { interface IAnnounceContentEdit { announcementId: number - image: string | null + // image: string | null writer: string title: string announcementNoticeStatus: string // enum @@ -100,7 +104,7 @@ interface IAnnounceContentEdit { } const Announce = () => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const [content, setContent] = useState([]) const [open, setOpen] = useState(false) @@ -108,7 +112,7 @@ const Announce = () => { register, handleSubmit, control, - watch, + // watch, setValue, reset, getValues, @@ -117,7 +121,7 @@ const Announce = () => { defaultValues: defaultValues, mode: 'onChange', }) - let previewImage = watch('previewImage') + // let previewImage = watch('previewImage') const editorRef = useRef(null) const [writeMode, setWriteMode] = useState('') @@ -131,7 +135,18 @@ const Announce = () => { } // 백엔드 API에서는 page가 0부터 시작하므로 page - 1로 설정 + const { openToast } = useToast() + + const currentId = useRef(-1) + const { + openModal: openRemoveModal, + closeModal: closeRemoveModal, + isOpen: isRemoveModalOpen, + } = useModal() + const [currentNoticeStatus, setCurrentNoticeStatus] = useState('없음') + const [currentContent, setCurrentContent] = useState('') + const [currentDate, setCurrentDate] = useState('') // 초기 페이지 진입시 공지사항 목록 불러오기 useEffect(() => { @@ -139,8 +154,7 @@ const Announce = () => { axios .get(`${API_URL}/api/v1/admin/announcement`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + ...config, }) .then((res) => { if (isMounted) { @@ -187,15 +201,20 @@ const Announce = () => { } const onSubmit = async (data: IAnnounceAllContent) => { - console.log('onSubmit', data) - if (data.previewImage === '') { - alert('이미지를 삽입해주세요') + if ( + editorRef.current?.getMarkdown()?.length && + editorRef.current?.getMarkdown()?.length > 10000 + ) { + alert('본문의 글이 너무 깁니다!') return } + // if (data.previewImage === '') { + // alert('이미지를 삽입해주세요') + // return + // } let DateFormed = '' if (data.announcementNoticeStatus === '예약') { if (data.reservationDate === null) { - console.log('there is no reservationDate therefore return') return } DateFormed = formatDate(new Date(data.reservationDate)) @@ -207,27 +226,30 @@ const Announce = () => { let submitData: IAnnounceContentWrite if ('announcementId' in data && 'reservationDate' in data) { submitData = { - image: data.previewImage.split(',')[1], + // image: data.previewImage.split(',')[1], writer: data.writer, title: data.title, announcementNoticeStatus: data.announcementNoticeStatus, // 'announcementStatus'를 'announcementNoticeStatus'로 매핑합니다. reservationDate: data.announcementNoticeStatus === '예약' ? DateFormed : null, - // content: data.content, content: editorRef.current ? editorRef.current.getMarkdown() : '', } } else return await axios - .post(`${API_URL}/api/v1/admin/announcement`, submitData) + .post(`${API_URL}/api/v1/admin/announcement`, submitData, { + withCredentials: true, + }) .then(() => { - console.log('submit success') setOpen(false) + openToast({ + message: '공지 글을 성공적으로 등록하였습니다.', + severity: 'success', + }) reset() axios .get(`${API_URL}/api/v1/admin/announcement`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { totalPageVar.current = res.data.totalPages @@ -235,19 +257,15 @@ const Announce = () => { }) }) .catch((err) => { - console.log('submit fail', submitData) alert('공지사항 등록 실패 \n사유 : ' + err) }) } const onSubmitEdit = async (data: IAnnounceAllContent) => { - console.log('onSubmitEdit, given data -> ', data, data.image) - let submitData: IAnnounceContentEdit let DateFormed = '' if (data.announcementNoticeStatus === '예약') { if (data.reservationDate === null) { - console.log('there is no reservationDate therefore return') return } DateFormed = formatDate(new Date(data.reservationDate)) @@ -259,28 +277,31 @@ const Announce = () => { if ('announcementId' in data && 'reservationDate' in data) { submitData = { announcementId: data.announcementId, - image: data.image === '' ? null : data.previewImage.split(',')[1], + // image: data.image === '' ? null : data.previewImage.split(',')[1], writer: data.writer, title: data.title, announcementNoticeStatus: data.announcementNoticeStatus, // 'announcementStatus'를 'announcementNoticeStatus'로 매핑합니다. reservationDate: data.announcementNoticeStatus === '예약' ? DateFormed : null, - // content: data.content, content: editorRef.current ? editorRef.current.getMarkdown() : '', } } else return await axios - .put(`${API_URL}/api/v1/admin/announcement`, submitData) + .put(`${API_URL}/api/v1/admin/announcement`, submitData, { + withCredentials: true, + }) .then(() => { - console.log('Edit submit success', submitData) + openToast({ + message: '공지 글이 성공적으로 수정되었습니다.', + severity: 'success', + }) setOpen(false) reset() axios .get(`${API_URL}/api/v1/admin/announcement`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { totalPageVar.current = res.data.totalPages @@ -288,32 +309,32 @@ const Announce = () => { }) }) .catch((err) => { - console.log('submit edit fail', submitData) alert('공지사항 수정 실패 \n사유 : ' + err) }) } const onHandleEdit = async () => { setWriteMode('edit') - console.log('edit vlaues ,', getValues()) } const onHandleView = async (id: number) => { setWriteMode('view') setOpen(true) await axios - .get(`${API_URL}/api/v1/admin/announcement/${id}`) + .get(`${API_URL}/api/v1/admin/announcement/${id}`, { + withCredentials: true, + }) .then((res) => { - console.log(res) setValue('announcementId', id) setValue('writer', res.data.writer) setValue('title', res.data.title) setValue('view', res.data.view) - setValue('previewImage', res.data.image) + // setValue('previewImage', res.data.image) setValue('content', res.data.content) setValue('date', res.data.date) setValue('announcementStatus', res.data.announcementStatus) - + setCurrentDate(res.data.date) + setCurrentContent(res.data.content) let noticeStatusValue = '없음' // 기본값 if ( res.data.announcementStatus === '게제' || @@ -326,32 +347,35 @@ const Announce = () => { setValue('announcementNoticeStatus', noticeStatusValue) }) .catch((err) => { - console.log(err) alert('공지사항 조회 실패 \n사유 : ' + err) }) } const onHandleHideOrUnHide = async (mode: string) => { - console.log('onHandleHide, ', getValues('announcementId')) const announcementId = getValues('announcementId') axios - .post(`${API_URL}/api/v1/admin/announcement/${mode}`, { announcementId }) + .post( + `${API_URL}/api/v1/admin/announcement/${mode}`, + { announcementId }, + { withCredentials: true }, + ) .then(() => { - console.log(`${mode} success`) setOpen(false) + openToast({ + message: `공지글이 ${mode}처리 되었습니다.`, + severity: 'success', + }) reset() axios .get(`${API_URL}/api/v1/admin/announcement`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { setContent(res.data.content) }) }) - .catch((err) => { - console.log(err) + .catch(() => { alert(`공지사항 ${mode} 처리 실패`) }) } @@ -360,20 +384,27 @@ const Announce = () => { axios .delete(`${API_URL}/api/v1/admin/announcement`, { data: { announcementId: announcementId }, + withCredentials: true, }) .then(() => { - console.log('delete success') setOpen(false) + openToast({ + message: `${announcementId}번 공지 글이 성공적으로 삭제되었습니다.`, + severity: 'success', + }) + closeRemoveModal() axios .get(`${API_URL}/api/v1/admin/announcement`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { setContent(res.data.content) }) }) + .catch((err) => { + alert('공지글 삭제 실패 \n 사유: ' + err) + }) } return ( @@ -381,7 +412,6 @@ const Announce = () => { style={{ display: 'flex', justifyContent: 'center', - // alignItems: 'center', width: '80rem', height: '30rem', paddingTop: '5rem', @@ -399,7 +429,7 @@ const Announce = () => { variant={'contained'} onClick={() => { setWriteMode('write') - previewImage = watch('previewImage') + // previewImage = watch('previewImage') setOpen(true) }} > @@ -432,24 +462,22 @@ const Announce = () => { {item.announcementStatus}
- + {/* Picture of the announcement - - {/* */} + */} - {/* */}
))}
@@ -467,32 +495,44 @@ const Announce = () => {
{/* 새글쓰기 모달 */} setOpen(false)} mobileFullSize={false} > - - {writeMode === 'write' - ? '새 공지글 쓰기' - : writeMode === 'edit' - ? '공지글 수정하기' - : '공지 글 보기'} - - setValue('previewImage', image)} - register={register('image')} - > + {/* {writeMode === 'view' ? ( Picture of the announcement - + ) : ( + + setValue('previewImage', image) + } + register={register('image')} + > + + Picture of the announcement + + + )} */} 제목 { message: '글쓴이는 10자 이내로 입력해주세요.', }, })} - error={!!errors.title} - helperText={errors.title?.message} + error={!!errors.writer} + helperText={errors.writer?.message} disabled={writeMode === 'view'} /> {writeMode === 'view' ? ( @@ -529,34 +569,25 @@ const Announce = () => { : '게제된 시간'} ) : null} - {/* 내용 - */} - {/*
*/} {writeMode === 'view' ? ( -
+ { overflowY: 'auto', }} /> -
+ ) : ( - <> - + - + )} 공지 예약 및 알림 @@ -637,17 +668,20 @@ const Announce = () => { {errors.announcementNoticeStatus.message} )} + {/* 예약 날짜 선택 */} ( { {writeMode === 'view' ? ( ) : null} {writeMode === 'view' ? ( - ) : writeMode === 'edit' ? ( @@ -708,6 +749,20 @@ const Announce = () => { )} + onHandleDelete(currentId.current), + }} + /> diff --git a/src/app/admin/banner/Banner.tsx b/src/app/admin/banner/Banner.tsx index 9859de608..2b4952214 100644 --- a/src/app/admin/banner/Banner.tsx +++ b/src/app/admin/banner/Banner.tsx @@ -21,6 +21,9 @@ import { DateTimePicker } from '@mui/x-date-pickers' import dayjs from 'dayjs' import CuModal from '@/components/CuModal' import { idStyle, statusStyle, titleStyle } from './BannerStyles' +import CuTextModal from '@/components/CuTextModal' +import useModal from '@/hook/useModal' +import useToast from '@/states/useToast' interface IBannerAllContent { bannerId: number @@ -92,7 +95,7 @@ interface IBannerContentEdit { } const Banner = () => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const [page, setPage] = useState(1) const totalPageVar = useRef(1) @@ -121,6 +124,15 @@ const Banner = () => { } // 백엔드 API에서는 page가 0부터 시작하므로 page - 1로 설정 + const { openToast } = useToast() + + const currentId = useRef(-1) + const { + openModal: openRemoveModal, + closeModal: closeRemoveModal, + isOpen: isRemoveModalOpen, + } = useModal() + const [currentReservationType, setCurrentReservationType] = useState('없음') const [currentBannerType, setCurrentBannerType] = useState('') @@ -130,14 +142,11 @@ const Banner = () => { axios .get(`${API_URL}/api/v1/admin/banner`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { if (isMounted) { - console.log('res : ', res) totalPageVar.current = res.data.totalPages - console.log(totalPageVar) setContent(res.data.content) } }) @@ -150,7 +159,6 @@ const Banner = () => { // 페이지가 바뀔 때마다 페이지 버튼의 활성화 여부를 결정 // fifthPage 는 4번째 페이지 버튼의 활성화 여부, fourthPage 는 5번째 페이지 버튼의 활성화 여부 useEffect(() => { - console.log('page render') if (page === totalPageVar.current) { setFourthPage(false) setFifthPage(false) @@ -182,19 +190,13 @@ const Banner = () => { } const onSubmit = async (data: IBannerAllContent) => { - console.log('onSubmit', data) if (data.previewImage === '') { alert('이미지를 삽입해주세요') return } let DateFormed = '' - console.log(data.reservationDate) if (data.bannerReservationType === '예약') { if (data.reservationDate === null) { - console.log( - 'there is no reservationDate therefore return', - data.reservationDate, - ) return } DateFormed = formatDate(new Date(data.reservationDate)) @@ -204,7 +206,6 @@ const Banner = () => { } } let submitData: IBannerContentWrite - // if ('announcementId' in data && 'reservationDate' in data) { submitData = { bannerType: data.bannerType, title: data.title, @@ -214,38 +215,37 @@ const Banner = () => { data.bannerReservationType === '예약' ? DateFormed : null, announcementUrl: data.announcementUrl, } - // } else return await axios - .post(`${API_URL}/api/v1/admin/banner`, submitData) + .post(`${API_URL}/api/v1/admin/banner`, submitData, { + withCredentials: true, + }) .then(() => { - console.log('submit success') setOpen(false) reset() axios .get(`${API_URL}/api/v1/admin/banner`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { totalPageVar.current = res.data.totalPages setContent(res.data.content) + openToast({ + message: '배너 글을 성공적으로 등록하였습니다.', + severity: 'success', + }) }) }) .catch((err) => { - console.log('submit fail', submitData) alert('공지사항 등록 실패 \n사유 : ' + err) }) } const onSubmitEdit = async (data: IBannerAllContent) => { - console.log('onSubmitEdit, given data -> ', data, data.image) - let submitData: IBannerContentEdit let DateFormed = '' if (data.bannerReservationType === '예약') { if (data.reservationDate === null) { - console.log('there is no reservationDate therefore return') return } DateFormed = formatDate(new Date(data.reservationDate)) @@ -269,40 +269,41 @@ const Banner = () => { } else return await axios - .put(`${API_URL}/api/v1/admin/banner`, submitData) + .put(`${API_URL}/api/v1/admin/banner`, submitData, { + withCredentials: true, + }) .then(() => { - console.log('Edit submit success', submitData) setOpen(false) reset() axios .get(`${API_URL}/api/v1/admin/banner`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { totalPageVar.current = res.data.totalPages setContent(res.data.content) + openToast({ + message: '배너 글을 성공적으로 수정하였습니다.', + severity: 'success', + }) }) }) .catch((err) => { - console.log('submit edit fail', submitData) alert('공지사항 수정 실패 \n사유 : ' + err) }) } const onHandleEdit = async () => { setWriteMode('edit') - console.log('edit vlaues ,', getValues()) } const onHandleView = async (id: number) => { setWriteMode('view') setOpen(true) await axios - .get(`${API_URL}/api/v1/admin/banner/${id}`) + .get(`${API_URL}/api/v1/admin/banner/${id}`, { withCredentials: true }) .then((res) => { - console.log(res) setValue('bannerId', id) setValue('bannerStatus', res.data.bannerStatus) setValue('bannerType', res.data.bannerType) @@ -324,32 +325,35 @@ const Banner = () => { setValue('bannerReservationType', reservationStatusValue) }) .catch((err) => { - console.log(err) alert('공지사항 조회 실패 \n사유 : ' + err) }) } const onHandleRunOrEnd = async (mode: string) => { - console.log('onHandleRunOrEnd, ', getValues('bannerId')) const bannerId = getValues('bannerId') axios - .post(`${API_URL}/api/v1/admin/banner/${mode}`, { bannerId }) + .post( + `${API_URL}/api/v1/admin/banner/${mode}`, + { bannerId }, + { withCredentials: true }, + ) .then(() => { - console.log(`${mode} success`) setOpen(false) reset() axios .get(`${API_URL}/api/v1/admin/banner`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { setContent(res.data.content) + openToast({ + message: `배너를 ${mode}처리 하였습니다.`, + severity: 'success', + }) }) }) - .catch((err) => { - console.log(err) + .catch(() => { alert(`공지사항 ${mode} 처리 실패`) }) } @@ -358,20 +362,28 @@ const Banner = () => { axios .delete(`${API_URL}/api/v1/admin/banner`, { data: { bannerId: bannerId }, + withCredentials: true, }) .then(() => { - console.log('delete success') setOpen(false) + alert(bannerId + '번 배너가 삭제되었습니다.') + closeRemoveModal() axios .get(`${API_URL}/api/v1/admin/banner`, { params, - // withCredentials: true, - // peer-test 도메인에서만 httpOnly sameSite 쿠키를 전달받을 수 있으므로 로컬에서 테스트 할 동안 임시로 주석처리 + withCredentials: true, }) .then((res) => { setContent(res.data.content) + openToast({ + message: '배너 글을 성공적으로 삭제하였습니다.', + severity: 'success', + }) }) }) + .catch((err) => { + alert('배너 삭제 실패 \n 사유: ' + err) + }) } return ( @@ -397,7 +409,6 @@ const Banner = () => { setWriteMode('write') previewImage = watch('previewImage') setOpen(true) - console.log('date : ', getValues('date')) setValue( 'reservationDate', formatDate(new Date(Date.now() + 3600000)), @@ -469,24 +480,19 @@ const Banner = () => {
{/* 새 글쓰기 모달 */} setOpen(false)} mobileFullSize={false} > - - {writeMode === 'write' - ? '새 배너 쓰기' - : writeMode === 'edit' - ? '배너 수정하기' - : '배너 보기'} - - {/* 배너 이미지 */} - setValue('previewImage', image)} - register={register('image')} - > + {writeMode === 'view' ? ( { alt="Picture of the announcement" /> - + ) : ( + + setValue('previewImage', image) + } + register={register('image')} + > + + Picture of the announcement + + + )} {/* 배너 유형 선택 */} 배너 유형 @@ -553,6 +575,10 @@ const Banner = () => { disabled={writeMode === 'view'} {...register('announcementUrl', { required: 'url은 필수 입력 항목입니다.', + maxLength: { + value: 1000, + message: 'URL은 1000자를 초과할 수 없습니다.', + }, pattern: { value: /^(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})$/, @@ -622,7 +648,7 @@ const Banner = () => { )} onChange={onChange} ampm={false} - format="YYYY-MM-DD hh:mm" + format="YYYY-MM-DD HH:mm" disabled={ writeMode === 'view' || currentReservationType !== '예약' } @@ -669,13 +695,22 @@ const Banner = () => { {writeMode === 'view' ? ( ) : null} {writeMode === 'view' ? ( - ) : writeMode === 'edit' ? ( @@ -691,6 +726,20 @@ const Banner = () => { )} + onHandleDelete(currentId.current), + }} + /> diff --git a/src/app/admin/login/LoginForm.tsx b/src/app/admin/login/LoginForm.tsx index e00f4806f..cf5321803 100644 --- a/src/app/admin/login/LoginForm.tsx +++ b/src/app/admin/login/LoginForm.tsx @@ -3,32 +3,16 @@ import React, { useState } from 'react' import { Button, TextField, Typography, Container, Stack } from '@mui/material' import axios from 'axios' -import { useRouter } from 'next/navigation' import useAdminStore from '@/states/useAdminStore' -// import { setCookie } from 'cookies-next' - -const sheetSytle = { - width: 'auto', - height: '80vh', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - padding: '2rem', -} +import { config } from '../panel/AdminAxios' const LoginForm = () => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const [id, setId] = useState('') const [pw, setPw] = useState('') - // const [token, setToken] = useState('') - const router = useRouter() const { login } = useAdminStore() - let date = new Date() - date.setTime(date.getTime() + 1 * 30 * 60 * 1000) // 현재 시간에서 0.5시간 뒤 - function onHandleLogin() { - console.log('login') axios .post( `${API_URL}/api/v1/signin/admin`, @@ -36,11 +20,10 @@ const LoginForm = () => { id: id, password: pw, }, - // { withCredentials: true }, + config, ) .then(() => { login() - router.push('/admin') }) .catch((err) => { if ( @@ -61,8 +44,21 @@ const LoginForm = () => { setPw(e.target.value) } + const onHandleKeyPress = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') onHandleLogin() + } + return ( - + { > ID - + { > PW - + - - - + + + + + + - - ) + + ) } -export default NewTag \ No newline at end of file +export default NewTag diff --git a/src/app/find-account/page.tsx b/src/app/find-account/page.tsx index e3cc3d43f..9bdb9119c 100644 --- a/src/app/find-account/page.tsx +++ b/src/app/find-account/page.tsx @@ -7,25 +7,7 @@ import { useRouter } from 'next/navigation' import useAuthStore from '@/states/useAuthStore' import FindComplete from './panel/FindComplete' import BoxBase from '@/components/BoxBase' - -const PCAccountBox = { - display: 'flex', - position: 'relative', - width: '544px', - padding: '40px 64px 140px 64px', - flexDirection: 'column', - alignItems: 'center', - gap: '48px', -} - -const MobileAccountBox = { - display: 'flex', - width: '100%', - flexDirection: 'column', - alignItems: 'center', - padding: '40px 16px', - gap: '24px', -} +import { MobileLoginBox, PCLoginBox } from '../login/login.style' const FindAccount = () => { const router = useRouter() @@ -38,7 +20,7 @@ const FindAccount = () => { }, [isLogin]) return ( - + {isCodeSuccessful ? ( ) : ( diff --git a/src/app/find-account/panel/SendCodeForm.tsx b/src/app/find-account/panel/SendCodeForm.tsx index c4fb38ceb..fea307d93 100644 --- a/src/app/find-account/panel/SendCodeForm.tsx +++ b/src/app/find-account/panel/SendCodeForm.tsx @@ -19,8 +19,8 @@ const LabelBox = { width: '100%', flexDirection: 'column', alignItems: 'flex-start', - gap: '8px', - fontSize: '14px', + gap: '0.5rem', + fontSize: '0.875rem', } const Form = { @@ -28,7 +28,7 @@ const Form = { width: '100%', flexDirection: 'column', alignItems: 'center', - gap: '24px', + gap: '1.5rem', } const SendCodeForm = ({ @@ -42,7 +42,7 @@ const SendCodeForm = ({ openToast: () => void setIsCodeSuccessful: (isCodeSuccessful: boolean) => void }) => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const { handleSubmit, control, diff --git a/src/app/find-account/panel/SendEmailForm.tsx b/src/app/find-account/panel/SendEmailForm.tsx index 59381474c..a841d5690 100644 --- a/src/app/find-account/panel/SendEmailForm.tsx +++ b/src/app/find-account/panel/SendEmailForm.tsx @@ -13,7 +13,7 @@ const Form = { width: '100%', flexDirection: 'column', alignItems: 'center', - gap: '8px', + gap: '0.5rem', } const LabelBox = { @@ -21,8 +21,8 @@ const LabelBox = { width: '100%', flexDirection: 'column', alignItems: 'flex-start', - gap: '8px', - fontSize: '14px', + gap: '0.5rem', + fontSize: '0.875rem', } const SendEmailForm = ({ @@ -30,7 +30,7 @@ const SendEmailForm = ({ }: { setIsCodeSuccessful: (isCodeSuccessful: boolean) => void }) => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const [isEmailSuccessful, setIsEmailSuccessful] = useState(false) const { CuToast, isOpen, openToast, closeToast } = useToast() diff --git a/src/app/hitchhiking/page.tsx b/src/app/hitchhiking/page.tsx index bf787b8ea..42bf28736 100644 --- a/src/app/hitchhiking/page.tsx +++ b/src/app/hitchhiking/page.tsx @@ -10,6 +10,8 @@ import ArrowUp from '@/icons/ArrowUp' import * as style from './hitchhiking.style' import ArrowDown from '@/icons/ArrowDown' import useAxiosWithAuth from '@/api/config' +import { getUniqueArray } from '@/utils/getUniqueArray' +import useToast from '@/states/useToast' const Hitchhiking = () => { const [page, setPage] = useState(1) @@ -19,6 +21,8 @@ const Hitchhiking = () => { IPostCardHitchhiking[] >([]) + const { openToast } = useToast() + const axiosWithAuth = useAxiosWithAuth() const { isPc } = useMedia() @@ -26,7 +30,7 @@ const Hitchhiking = () => { IPagination> >( `${ - process.env.NEXT_PUBLIC_API_URL + process.env.NEXT_PUBLIC_CSR_API }/api/v1/hitch?page=${page}&pageSize=5&type=${ isProject ? 'PROJECT' : 'STUDY' }`, @@ -44,27 +48,43 @@ const Hitchhiking = () => { if (!isLoading && data?.content) { setCardList((prev) => { const newArray = [...data.content].reverse().concat(prev) - return newArray + return getUniqueArray(newArray, 'recruitId') }) } }, [isLoading, data?.content]) const removeCard = (recruitId: number) => { - setDraggedCardList((prev: IPostCardHitchhiking[]) => { - prev.push(cardList[cardList.length - 1]) - return prev - }) - setCardList((prev: IPostCardHitchhiking[]) => { - return prev.filter((card) => card.recruitId !== recruitId) - }) + if (cardList.length > 1) { + setDraggedCardList((prev: IPostCardHitchhiking[]) => { + prev.push(cardList[cardList.length - 1]) + return prev + }) + draggedCardList[draggedCardList.length - 1].hasBeenRemoved = true + setCardList((prev: IPostCardHitchhiking[]) => { + return prev.filter((card) => card.recruitId !== recruitId) + }) + } else if (cardList.length === 1) { + openToast({ + message: '넘길 수 있는 마지막 카드예요.', + severity: 'info', + }) + } if (cardList.length === 2) { setPage((prev) => (!data?.last ? prev + 1 : prev)) } } const addCard = () => { + if (draggedCardList.length === 0) { + openToast({ + message: '되돌아 갈 수 있는 마지막 카드예요.', + severity: 'info', + }) + return + } setCardList((prev: IPostCardHitchhiking[]) => { prev.push(draggedCardList[draggedCardList.length - 1]) + if (cardList.length > 1) prev[prev.length - 2].hasBeenRemoved = false return prev }) setDraggedCardList((prev: IPostCardHitchhiking[]) => { @@ -99,6 +119,7 @@ const Hitchhiking = () => { isProject={isProject} message={message} handleChange={handleChange} + setCardList={setCardList} /> { return ( ) } diff --git a/src/app/hitchhiking/panel/CardContainer.style.ts b/src/app/hitchhiking/panel/CardContainer.style.ts index 03787f4a5..6a08d5bb2 100644 --- a/src/app/hitchhiking/panel/CardContainer.style.ts +++ b/src/app/hitchhiking/panel/CardContainer.style.ts @@ -1,10 +1,17 @@ import { SxProps } from '@mui/material' +import { Inter } from 'next/font/google' + +const inter = Inter({ + subsets: ['latin'], + display: 'swap', +}) export const cardContainerStyle: SxProps = { width: '100%', overflow: 'hidden', bottom: 0, - height: ['80svh', '100%'], + height: ['90svh', '100%'], + // height: '100%', position: ['static', 'absolute'], top: [0, '2.75rem'], left: 0, @@ -14,10 +21,11 @@ export const gnbContainerStyle: SxProps = { height: '2.5rem', py: '0.38rem', } + export const gnbTypographyStyle: SxProps = { color: 'text.normal', textAlign: 'center', - fontFamily: 'Inter', + fontFamily: `${inter.style.fontFamily} !important` as string, fontSize: '13px', fontStyle: 'normal', fontWeight: 700, diff --git a/src/app/hitchhiking/panel/CardContainer.tsx b/src/app/hitchhiking/panel/CardContainer.tsx index 9e4b02b38..1415740c8 100644 --- a/src/app/hitchhiking/panel/CardContainer.tsx +++ b/src/app/hitchhiking/panel/CardContainer.tsx @@ -1,14 +1,16 @@ 'use client' import React from 'react' -import { FormControlLabel, Stack, Typography } from '@mui/material' +import { FormControlLabel, IconButton, Stack, Typography } from '@mui/material' import CuTypeToggle from '@/components/CuTypeToggle' import Interest from './Interest' -import * as cardStyle from './HitchhikingCard.style' import * as containerStyle from './CardContainer.style' import CardStack from './CardStack' import { IPostCardHitchhiking } from '@/types/IPostCard' import { BetaIcon } from '@/components/BetaBadge' +import * as style from '../hitchhiking.style' +import useMedia from '@/hook/useMedia' +import { ChevronLeft, ChevronRight } from '@/icons' const CardContainer = ({ cardList, @@ -16,13 +18,32 @@ const CardContainer = ({ isProject, message, handleChange, + addCard, + addDisabled, + setCardList, }: { cardList: Array removeCard: (recruit_id: number) => void isProject: boolean message: string handleChange: any + addCard?: () => void + addDisabled?: boolean + setCardList: React.Dispatch> }) => { + const { isPc } = useMedia() + + const setFavorite = () => { + setCardList((prev) => { + const newArray = [...prev] + newArray[prev.length - 1].favorite = + newArray[prev.length - 1].favorite === undefined + ? true + : !newArray[prev.length - 1].favorite + return newArray + }) + } + return ( {!message ? ( @@ -83,12 +104,47 @@ const CardContainer = ({ cardList={cardList} removeCard={removeCard} isProject={isProject} + addCard={addCard} /> ) : ( {message} )} - + + {!isPc && ( + + + + )} + + {!isPc && ( + removeCard(cardList[cardList.length - 1]?.recruitId)} + disabled={cardList.length === 1} + > + + + )} + ) } diff --git a/src/app/hitchhiking/panel/CardStack.tsx b/src/app/hitchhiking/panel/CardStack.tsx index 290f8dc49..6ba7aba6b 100644 --- a/src/app/hitchhiking/panel/CardStack.tsx +++ b/src/app/hitchhiking/panel/CardStack.tsx @@ -18,29 +18,29 @@ const CardStack = ({ cardList, removeCard, isProject, + addCard, }: { cardList: Array removeCard: (recruit_id: number) => void isProject: boolean + addCard?: () => void }) => { const [dragged, setDragged] = useState(false) const checkDragDirection = (x: number, y: number) => { - if (Math.abs(x) > Math.abs(y)) { - return x < 0 ? ESwipeDirection.left : ESwipeDirection.right - } else { - return y < 0 ? ESwipeDirection.up : ESwipeDirection.down - } + return y < 0 ? ESwipeDirection.up : ESwipeDirection.down } const handleDragEnd = (e: any, info: any, recruit_id: number) => { // COMMENT : 위로 조금만 움직였을 때 카드가 사라지지 않도록 처리 if ( - Math.abs(info.offset.y) < 150 || + Math.abs(info.offset.y) < 50 || checkDragDirection(info.offset.x, info.offset.y) !== ESwipeDirection.up ) { setDragged(false) - + if (addCard) { + addCard() + } return } removeCard(recruit_id) @@ -90,27 +90,42 @@ const CardStack = ({ initial={{ scale: 0.8, opacity: 0, + ...(card.hasBeenRemoved && { + y: -500, + }), }} animate={{ scale: i === cardList.length - 1 ? 1 : 0.8, opacity: i === cardList.length - 1 ? 1 : 0, + y: 0, + }} + exit={{ + opacity: 0, + y: -500, }} - exit={{ opacity: 0 }} drag dragSnapToOrigin - whileDrag={{ scale: 1.2 }} - dragElastic={1} + dragElastic={0.5} dragConstraints={{ - left: 0, + top: 0, right: 0, + left: 0, bottom: 0, }} - dragTransition={{ bounceStiffness: 300, bounceDamping: 50 }} - onDragStart={() => setDragged(true)} + dragTransition={{ + bounceStiffness: 250, + bounceDamping: 50, + }} + onDragStart={() => { + setDragged(true) + }} onDragEnd={(e: any, info: any) => handleDragEnd(e, info, card.recruitId) } - transition={{ duration: 0.3 }} + transition={{ + duration: 0.3, + translateY: { ease: 'easeOut' }, + }} > { const [data, setData] = useState(null) const [isLoading, setIsLoading] = useState(false) + const [lineCount, setLineCount] = useState({ + title: 1, + content: 1, + }) const router = useRouter() + const card = useRef(null) const { openToast, closeToast } = useToast() + useEffect(() => { + setLineCount({ + title: getLineCount(46, 22.5, 2), + content: getLineCount(191, 18, 8), + }) + }, [card]) + + useEffect(() => { + const handleResize = () => { + if (card.current) { + setLineCount({ + title: getLineCount(46, 22.5, 2), + content: getLineCount(191, 18, 8), + }) + } + } + + addEventListener('resize', handleResize) + return () => { + removeEventListener('resize', handleResize) + } + }, []) + const getLineCount = ( - otherOriginHeight: number, + originHeight: number, lineHeight: number, maxLine: number, ) => { + const removeCount = card.current?.clientHeight ?? 0 < 441 ? 2 : 1 const lineCount = Math.floor( - ((cardWidth * 441) / 328 - (otherOriginHeight + 204)) / lineHeight, + ((card.current?.clientHeight ?? 0) * originHeight) / lineHeight / 441, ) if (lineCount > maxLine) return maxLine - else if (lineCount < 1) return 1 - else return lineCount + else if (lineCount < 1 + removeCount) return 1 + else return lineCount - removeCount } + const axiosInstance = useAxiosWithAuth() useEffect(() => { @@ -100,7 +128,7 @@ const HitchhikingCardBack = ({ const handleSeeAll = (e: React.MouseEvent) => { e.stopPropagation() - router.push(`/recruit/${postId}`) + router.push(`/recruit/${postId}?type=${isProject ? 'PROJECT' : 'STUDY'}`) } return ( @@ -112,6 +140,7 @@ const HitchhikingCardBack = ({ padding: '1rem', }} key={crypto.randomUUID()} + ref={card} > {data ? ( - - + + @@ -137,10 +166,7 @@ const HitchhikingCardBack = ({ } sx={style.cardChipStyleBase} /> - - {/* TODO : 작성자 id 가져오기 */} - - + - - + + {title} @@ -174,13 +200,33 @@ const HitchhikingCardBack = ({ }} onClick={onClick} > - + + h1:first-of-type': { + marginTop: 0, + }, + '.toastui-editor-contents h1': { + paddingBottom: 0, + }, + '.toastui-editor-contents h2': { + paddingBottom: 0, + }, + }} + /> + { const [isFlipped, setIsFlipped] = useState(false) - const [cardWidth, setCardWidth] = useState(0) const [currentDomain, setCurrentDomain] = useState('') - const { isPc } = useMedia() useEffect(() => { // 현재 도메인 설정 setCurrentDomain(window.location.origin) - - // 카드 너비 설정 - setCardWidth( - isPc ? (window.innerHeight * 0.8 * 328) / 800 : window.innerWidth * 0.9, - ) - const handleResize = () => { - const newCardWidth = isPc - ? (window.innerHeight * 0.8 * 328) / 800 - : window.innerWidth * 0.9 - setCardWidth(newCardWidth) - } - - window.addEventListener('resize', handleResize) - - return () => { - window.removeEventListener('resize', handleResize) - } }, []) const handleMouseUp = (e: React.MouseEvent) => { @@ -311,7 +338,6 @@ const HitchhikingCard = ({ flipped={isFlipped} isProject={isProject} title={title} - cardWidth={cardWidth} currentDomain={currentDomain} /> diff --git a/src/app/hitchhiking/panel/Interest.tsx b/src/app/hitchhiking/panel/Interest.tsx index d40a2a9b2..84cf2f0f5 100644 --- a/src/app/hitchhiking/panel/Interest.tsx +++ b/src/app/hitchhiking/panel/Interest.tsx @@ -1,14 +1,20 @@ import { Stack, Typography, IconButton } from '@mui/material' -import React, { useEffect, useState } from 'react' +import React from 'react' import useAxiosWithAuth from '@/api/config' import Favorite from '@mui/icons-material/Favorite' import { motion, useAnimationControls } from 'framer-motion' import useToast from '@/states/useToast' import * as style from './Interest.style' -const Interest = ({ id }: { id?: number }) => { - const [favorite, setFavorite] = useState(false) - +const Interest = ({ + id, + favorite, + setFavorite, +}: { + id?: number + favorite: boolean + setFavorite: () => void +}) => { const { openToast, closeToast } = useToast() const axiosInstance = useAxiosWithAuth() @@ -29,13 +35,11 @@ const Interest = ({ id }: { id?: number }) => { closeToast() try { await axiosInstance.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/favorite/${id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorite/${id}`, ) - setFavorite((prev) => { - if (!prev) control.start(variants.favorite) - else control.start(variants.unfavorite) - return !prev - }) + setFavorite() + if (favorite) control.start(variants.favorite) + else control.start(variants.unfavorite) } catch (e) { openToast({ severity: 'error', @@ -44,17 +48,13 @@ const Interest = ({ id }: { id?: number }) => { } } - useEffect(() => { - setFavorite(false) - }, [id]) - return ( - + + + - + + {/* 사파리 설정*/} - - + diff --git a/src/app/login/oauth/ft/page.tsx b/src/app/login/oauth/ft/page.tsx index fa4bcea51..d853b84fb 100644 --- a/src/app/login/oauth/ft/page.tsx +++ b/src/app/login/oauth/ft/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { Typography } from '@mui/material' +import { Typography, Stack, CircularProgress } from '@mui/material' import { useSearchParams } from 'next/navigation' import { useEffect } from 'react' import useAuthStore from '@/states/useAuthStore' @@ -9,7 +9,7 @@ const OauthFtLogin = () => { const searchParams = useSearchParams() const code = searchParams.get('code') const state = searchParams.get('state') - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const { isLogin, accessToken } = useAuthStore() const handleConnect = () => { @@ -24,7 +24,20 @@ const OauthFtLogin = () => { if (isLogin) handleConnect() else handleLogin() }, []) - return 소셜 계정 처리중... + return ( + + + 소셜 계정 처리 중... + + ) } export default OauthFtLogin diff --git a/src/app/login/oauth/google/page.tsx b/src/app/login/oauth/google/page.tsx index 9037b75c6..db57b4392 100644 --- a/src/app/login/oauth/google/page.tsx +++ b/src/app/login/oauth/google/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { Typography } from '@mui/material' +import { Typography, Stack, CircularProgress } from '@mui/material' import { useSearchParams } from 'next/navigation' import { useEffect } from 'react' import useAuthStore from '@/states/useAuthStore' @@ -12,7 +12,7 @@ const OauthGoogleLogin = () => { const scope = searchParams.get('scope') const authuser = searchParams.get('authuser') const prompt = searchParams.get('prompt') - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const { isLogin, accessToken } = useAuthStore() const handleConnect = () => { @@ -27,7 +27,21 @@ const OauthGoogleLogin = () => { if (isLogin) handleConnect() else handleLogin() }, []) - return 소셜 계정 처리중... + + return ( + + + 소셜 계정 처리 중... + + ) } export default OauthGoogleLogin diff --git a/src/app/login/oauth/page.tsx b/src/app/login/oauth/page.tsx index fa487c78c..72fd65d53 100644 --- a/src/app/login/oauth/page.tsx +++ b/src/app/login/oauth/page.tsx @@ -1,10 +1,9 @@ 'use client' -import { Typography } from '@mui/material' +import { Typography, Stack, CircularProgress } from '@mui/material' import { useRouter, useSearchParams } from 'next/navigation' import { useEffect } from 'react' import useAuthStore from '@/states/useAuthStore' -import { setCookie } from 'cookies-next' const OauthLogin = () => { const router = useRouter() @@ -14,14 +13,26 @@ const OauthLogin = () => { const accessToken = searchParams.get('accessToken') if (accessToken) { login(accessToken) - setCookie('accessToken', accessToken) router.push('/') } else { window.alert('로그인에 실패했습니다') router.push('/login') } }, []) - return 로그인 처리중... + return ( + + + 로그인 처리 중... + + ) } export default OauthLogin diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 74ac8f51a..55ffeff92 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -180,7 +180,7 @@ const Login = () => { display: 'flex', flexDirection: 'column', width: '100%', - gap: '16px', + gap: '1rem', alignItems: 'flex-end', }} > diff --git a/src/app/login/panel/OauthLoginBox.tsx b/src/app/login/panel/OauthLoginBox.tsx index 8d4249410..a45b8627a 100644 --- a/src/app/login/panel/OauthLoginBox.tsx +++ b/src/app/login/panel/OauthLoginBox.tsx @@ -4,14 +4,14 @@ import Image from 'next/image' const Icons = { width: '40px', height: '40px', backgroundColor: '#EFEFEF' } const OauthLoginBox = () => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API return ( diff --git a/src/app/my-page/homepage-setting/panel/DisplaySetting.tsx b/src/app/my-page/homepage-setting/panel/DisplaySetting.tsx index aa14ceabd..f2b414699 100644 --- a/src/app/my-page/homepage-setting/panel/DisplaySetting.tsx +++ b/src/app/my-page/homepage-setting/panel/DisplaySetting.tsx @@ -42,6 +42,7 @@ const DisplaySetting = () => { inputProps={{ 'aria-label': `라이트/다크모드 토글` }} uncheckedtrackimage="/images/sign_moon.svg" checkedtrackimage="/images/sign_sun.svg" + disabled={useSystemTheme} /> } label={ @@ -51,7 +52,6 @@ const DisplaySetting = () => { sx={{ marginRight: '16px', marginLeft: '0', - // textShadow: '0px 4px 4px rgba(0, 0, 0, 0.25)', }} > 라이트/ 다크 모드 diff --git a/src/app/my-page/homepage-setting/panel/KeywordSetting.tsx b/src/app/my-page/homepage-setting/panel/KeywordSetting.tsx index bf5e7b265..5eb9248a0 100644 --- a/src/app/my-page/homepage-setting/panel/KeywordSetting.tsx +++ b/src/app/my-page/homepage-setting/panel/KeywordSetting.tsx @@ -4,22 +4,17 @@ import CuButton from '@/components/CuButton' import CuTextField from '@/components/CuTextField' import CuTextFieldLabel from '@/components/CuTextFieldLabel' import useModal from '@/hook/useModal' -import { - AlertColor, - Box, - Button, - Grid, - InputAdornment, - Stack, - Typography, -} from '@mui/material' -import React, { useRef, useState } from 'react' -import useSWR from 'swr' -import TagChip from './TagChip' +import { Box, Button, InputAdornment, Stack, Typography } from '@mui/material' +import Grid from '@mui/material/Unstable_Grid2' +import React, { useEffect, useRef, useState } from 'react' import CuTextModal from '@/components/CuTextModal' import TitleBox from '@/components/TitleBox' import useMedia from '@/hook/useMedia' import useToast from '@/states/useToast' +import { motion, AnimatePresence } from 'framer-motion' +import TagChip from '@/components/TagChip' +import { useTheme } from '@mui/material' +import { convertNonAlphabeticToHex } from '@/utils/convertNonAlpbabetToHex' interface IChip { key: number @@ -27,26 +22,18 @@ interface IChip { } const KeywordAddingField = ({ - mutate, - openToast, - closeToast, keywordList, + setData, }: { - mutate: () => void - openToast: ({ - severity, - message, - }: { - severity: AlertColor - message: React.ReactNode - }) => void - closeToast: () => void keywordList: Array | undefined | null + setData: React.Dispatch>> }) => { const [inputValue, setInputValue] = useState('' as string) const textFieldRef = useRef(null) const axiosWithAuth = useAxiosWithAuth() + const { openToast, closeToast } = useToast() + const validateData = (trimmed: string) => { closeToast() if (trimmed.length < 2) { @@ -68,7 +55,7 @@ const KeywordAddingField = ({ const addKeyword = async (trimmed: string) => { closeToast() await axiosWithAuth - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/alarm/add`, { + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/alarm/add`, { newKeyword: trimmed, }) .then(() => { @@ -80,7 +67,15 @@ const KeywordAddingField = ({ ), }) - mutate() + }) + .then(() => { + setData((prev) => [ + ...prev, + { + key: new Date().getTime(), + label: trimmed, + }, + ]) }) .catch((error) => { if (error.response.status === 400) { @@ -155,68 +150,118 @@ const KeywordAddingField = ({ const ChipsArray = ({ data, - mutate, isLoading, + setData, }: { - mutate: () => void - data: Array | undefined | null + data: Array isLoading: boolean + setData: React.Dispatch>> }) => { + const theme = useTheme() + + const { openToast } = useToast() + + const axiosWithAuth = useAxiosWithAuth() + const handleDelete = (label: string) => { + // closeToast() + return () => + axiosWithAuth + .delete( + `${ + process.env.NEXT_PUBLIC_CSR_API + }/api/v1/alarm/delete?keyword=${convertNonAlphabeticToHex(label)}`, + ) + .then(() => { + openToast({ + severity: 'success', + message: `'${label}'를 알림 키워드 목록에서 삭제했습니다.`, + }) + }) + .then(() => { + setData((prev) => prev.filter((keyword) => keyword.label !== label)) + }) + .catch((error) => { + if (error.data.message) { + openToast({ + severity: 'error', + message: error.data.message, + }) + } else { + openToast({ + severity: 'error', + message: ( + <> + {label}를 알림 키워드 목록에서 삭제하지 못했습니다, + + ), + }) + } + }) + } + return ( - - {!data && - (isLoading ? ( - - - 로딩 중 입니다. - - - ) : ( - - - 등록한 알림 키워드가 없습니다. - - - ))} - {data && - data.map((chip) => { - return - })} - + + + {data?.length === 0 && + (isLoading ? ( + + + 로딩 중... + + + ) : ( + + + 등록한 알림 키워드가 없어요. + + + ))} + {data.length > 0 && + data.map((chip) => { + return ( + + + + + + ) + })} + + ) } const KeywordDisplayBox = ({ - mutate, data, isLoading, error, - openToast, - closeToast, + setData, }: { - mutate: () => void - data: Array | undefined | null + data: Array isLoading: boolean error: any - openToast: ({ - severity, - message, - }: { - severity: AlertColor - message: React.ReactNode - }) => void - closeToast: () => void + setData: React.Dispatch>> }) => { const { isOpen, closeModal, openModal } = useModal() const axiosWithAuth = useAxiosWithAuth() + const { openToast, closeToast } = useToast() + const deleteAll = async () => { closeToast() await axiosWithAuth - .delete(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/alarm/delete/all`) + .delete(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/alarm/delete/all`) .then(() => { closeModal() - mutate() openToast({ severity: 'success', message: '모든 키워드를 삭제하였습니다.', @@ -230,16 +275,23 @@ const KeywordDisplayBox = ({ 등록된 키워드 - {error ? ( - 데이터를 가져오지 못했습니다. + + 데이터를 가져오지 못했습니다. + ) : ( - + )} { const { isPc } = useMedia() - - const { openToast, closeToast } = useToast() + const [data, setData] = useState>([] as Array) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) const axiosWithAuth = useAxiosWithAuth() @@ -276,13 +329,24 @@ const KeywordSetting = () => { ) return newChipData } - return null + return [] as Array }) - const { isLoading, data, mutate, error } = useSWR | null>( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/alarm`, - getKeywords, - ) + useEffect(() => { + const fetchData = async () => { + setIsLoading(true) + try { + const result = await getKeywords( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/alarm`, + ) + setData(result) + } catch (error) { + setError(error as any) + } + setIsLoading(false) + } + fetchData() + }, []) return ( { } > - + ) diff --git a/src/app/my-page/homepage-setting/panel/NotifSetting.tsx b/src/app/my-page/homepage-setting/panel/NotifSetting.tsx index 2b9fa07d5..f02da16c0 100644 --- a/src/app/my-page/homepage-setting/panel/NotifSetting.tsx +++ b/src/app/my-page/homepage-setting/panel/NotifSetting.tsx @@ -1,20 +1,33 @@ 'use client' +import useAxiosWithAuth from '@/api/config' import { BetaBadge } from '@/components/BetaBadge' +import CuTextModal from '@/components/CuTextModal' import CuToggle from '@/components/CuToggle' import TitleBox from '@/components/TitleBox' import useMedia from '@/hook/useMedia' +import useModal from '@/hook/useModal' import { Box, FormControlLabel, Stack, Typography } from '@mui/material' -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' const Notif = ({ checked, handleChange, type, + name, + contents, }: { checked: boolean - handleChange: (event: React.ChangeEvent) => void + handleChange: ({ name, checked }: { name: string; checked: boolean }) => void type: string + name: string + contents: string }) => { + const { openModal, closeModal, isOpen } = useModal() + + const onChange = () => { + openModal() + } + return ( } label={ - + {type} } labelPlacement="start" + name={name} + /> + { + handleChange({ name, checked: !checked }) + closeModal() + }, + }} + content={contents} /> ) } +interface INotif { + keyword: boolean + team: boolean + message: boolean + nightAlarm: boolean +} + const NotifSetting = () => { - const [keyword, setKeyword] = useState(false) - const [team, setTeam] = useState(false) - const [message, setMessage] = useState(false) - const [night, setNight] = useState(false) + const [notif, setNotif] = useState({ + keyword: true, + team: true, + message: true, + nightAlarm: true, + }) + + const axiosWithAuth = useAxiosWithAuth() + + useEffect(() => { + const fetchNotif = async () => { + await axiosWithAuth.get('/api/v1/noti/get-my-alarm').then((res) => { + setNotif(res.data) + }) + } + fetchNotif() + }, []) const { isPc } = useMedia() + const handleChange = ({ + name, + checked, + }: { + name: string + checked: boolean + }) => { + // axiosWithAuth + // .get( + // `/api/v1/noti/alarm-setting?alarmType=${name}&value=${checked}`, + // ) + // .then(() => { + // setNotif({ ...notif, [name]: checked }) + // }) + setNotif((prev) => ({ ...prev, [name]: checked })) + } + + const contentsOnAgree = { + keyword: + '이 알림을 켜면, 키워드 알림 설정에서 추가한 키워드에 따라 관심가지는 분야의 스터디, 프로젝트에 대한 정보를 전달해드려요. 알림을 켤까요?', + team: '이 알림을 켜면, 참여하고 있는 팀에 새로운 일이 일어나면 알려드려요. 알림을 켤까요?', + message: '이 알림을 켜면, 새로운 쪽지가 왔을 때 알려드려요. 알림을 켤까요?', + nightAlarm: + '이 알림을 켜면, 야간에도 알림을 받을 수 있어요. 알림을 켤까요?', + } + + const contentsOnDisagree = { + keyword: + '이 알림을 끄면, 키워드 알림 설정에서 추가한 키워드에 따라 관심가지는 분야의 스터디, 프로젝트에 대한 정보를 받을 수 없어요. 알림을 끌까요?', + team: '이 알림을 끄면, 참여하고 있는 팀에 새로운 일이 일어나도 알림이 뜨지 않아요. 알림을 끌까요?', + message: + '이 알림을 끄면, 새로운 쪽지가 와도 알림을 받을 수 없어요. 알림을 끌까요?', + nightAlarm: + '이 알림을 끄면, 야간에는 알림을 받을 수 없어요. 알림을 끌까요?', + } + return ( - + - 알림 설정 - - - - 아직 개발 중인 기능입니다. - + + 알림 설정 + + + + 아직 개발 중인 기능입니다. + + } > setKeyword((prev) => !prev)} + checked={notif.keyword} + handleChange={handleChange} + name="keyword" + contents={ + !notif.keyword + ? contentsOnAgree.keyword + : contentsOnDisagree.keyword + } /> setTeam((prev) => !prev)} + handleChange={handleChange} + checked={notif.team} + name="team" + contents={ + !notif.team ? contentsOnAgree.team : contentsOnDisagree.team + } /> setMessage((prev) => !prev)} + checked={notif.message} + handleChange={handleChange} + name="message" + contents={ + !notif.message + ? contentsOnAgree.message + : contentsOnDisagree.message + } /> setNight((prev) => !prev)} + checked={notif.nightAlarm} + handleChange={handleChange} + name="nightAlarm" + contents={ + !notif.nightAlarm + ? contentsOnAgree.nightAlarm + : contentsOnDisagree.nightAlarm + } /> diff --git a/src/app/my-page/homepage-setting/panel/TagChip.css b/src/app/my-page/homepage-setting/panel/TagChip.css deleted file mode 100644 index b19073ebf..000000000 --- a/src/app/my-page/homepage-setting/panel/TagChip.css +++ /dev/null @@ -1,24 +0,0 @@ -@keyframes PopAnimation { - 0% { - transform: scale(1); - opacity: 0.75; - } - 75% { - transform: scale(1.5); - opacity: 1; - } - 100% { - transform: scale(1); - } -} - -@keyframes RemoveAnimation { - 0% { - transform: scale(1); - opacity: 1; - } - 100% { - transform: scale(0); - opacity: 0; - } -} diff --git a/src/app/my-page/homepage-setting/panel/TagChip.tsx b/src/app/my-page/homepage-setting/panel/TagChip.tsx deleted file mode 100644 index a578a777e..000000000 --- a/src/app/my-page/homepage-setting/panel/TagChip.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { Chip, Grid, SxProps, Typography } from '@mui/material' -import React, { useEffect, useState } from 'react' -import './TagChip.css' -import useAxiosWithAuth from '@/api/config' -import useToast from '@/states/useToast' - -interface IChip { - key: number - label: string -} - -const TagChip = ({ chip, mutate }: { chip: IChip; mutate: () => void }) => { - const [style, setStyle] = useState({} as SxProps) - - const { openToast, closeToast } = useToast() - - useEffect(() => { - setStyle({ - animation: 'PopAnimation 0.5s', - }) - // const id = setTimeout(() => { - // setStyle({ - // opacity: 1, - // transform: 'scale(1)', - // }) - // }, 500) - // return () => clearTimeout(id) - }, []) - - const axiosWithAuth = useAxiosWithAuth() - const handleDelete = async (chip: IChip) => { - closeToast() - await axiosWithAuth - .delete( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/alarm/delete?keyword=${chip.label}`, - ) - .then(() => { - openToast({ - severity: 'success', - message: `'${chip.label}'를 알림 키워드 목록에서 삭제했습니다.`, - }) - }) - .then(() => { - mutate() - }) - .catch((error) => { - if (error.data.message) { - openToast({ - severity: 'error', - message: error.data.message, - }) - } else { - openToast({ - severity: 'error', - message: `'${chip.label}'를 알림 키워드 목록에서 삭제하지 못했습니다`, - }) - } - }) - } - - return ( - - - {chip.label} - - } - deleteIcon={ - - - - - } - onDelete={() => handleDelete(chip)} - sx={{ - ...style, - padding: '6px 0px 6px 8px', - backgroundColor: 'purple.tinted', - borderRadius: '2px', - height: '24px', - transition: 'opacity 0.5s ease, transform 0.5s ease', - '& .MuiChip-label': { - padding: '0px', - }, - }} - /> - - ) -} - -export default TagChip diff --git a/src/app/my-page/interests/page.tsx b/src/app/my-page/interests/page.tsx index 8483ba439..2e7d9c6b0 100644 --- a/src/app/my-page/interests/page.tsx +++ b/src/app/my-page/interests/page.tsx @@ -20,6 +20,7 @@ import * as style from './interests.style' import { centeredPosition } from '@/constant/centerdPosition.style' import { IPagination } from '@/types/IPagination' import { ITag } from '@/types/IPostDetail' +import { getUniqueArray } from '@/utils/getUniqueArray' export interface IDefaultPostCard { recruit_id: number @@ -167,6 +168,10 @@ const MyInterests = () => { type === 'SHOWCASE' ? '/showcase?' : `?type=${type}&` }page=${page}&pageSize=${pagesize}`, (url: string) => axiosInstance.get(url).then((res) => res.data), + { + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, ) const deleteAll = async () => { @@ -175,7 +180,7 @@ const MyInterests = () => { setIsDeleting(true) return await axiosWithAuth .delete( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/mypage/favorite?type=${type}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/mypage/favorite?type=${type}`, ) .then(() => { openToast({ @@ -204,11 +209,17 @@ const MyInterests = () => { if (!isLoading && data) { if (type === 'SHOWCASE') { setShowcaseList((prev) => { - return prev.concat(data.content as Array) + return getUniqueArray( + prev.concat(data.content as Array), + 'showcaseId', + ) }) } else { setPostList((prev) => { - return prev.concat(data.content as Array) + return getUniqueArray( + prev.concat(data.content as Array), + 'recruit_id', + ) }) } @@ -235,7 +246,10 @@ const MyInterests = () => { }) const InterestContentsCallback = React.useCallback(() => { - if (postList.length || showcaseList) { + if ( + (type !== 'SHOWCASE' && postList.length) || + (type === 'SHOWCASE' && showcaseList.length) + ) { return ( { setShowcaseList={setShowcaseList} /> ) - } else if (isLoading) { + } else if ( + isLoading && + ((type !== 'SHOWCASE' && !postList.length) || + (type === 'SHOWCASE' && !showcaseList.length)) + ) { return ( { ) } else { return ( - - + 관심있다고 표시한 페이지가 없습니다. - + ) } - }, [isLoading, postList, showcaseList]) + }, [isLoading, postList, showcaseList, type]) return ( <> diff --git a/src/app/my-page/interests/panel/InterestsContents.tsx b/src/app/my-page/interests/panel/InterestsContents.tsx index 9c0babbc6..5c706a34e 100644 --- a/src/app/my-page/interests/panel/InterestsContents.tsx +++ b/src/app/my-page/interests/panel/InterestsContents.tsx @@ -34,7 +34,7 @@ const InterestsContents = ({ const handleDefaultUnfavorite = (recruit_id: number) => () => { axiosInstance .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/favorite/${recruit_id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorite/${recruit_id}`, ) .then(() => { setPostList((prev) => @@ -45,7 +45,7 @@ const InterestsContents = ({ const handleShowcaseUnfavorite = (id: number) => () => { axiosInstance - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/favorite/${id}`) + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/favorite/${id}`) .then(() => { setShowcaseList((prev) => prev.filter((post) => post.showcaseId !== id)) }) diff --git a/src/app/my-page/layout.tsx b/src/app/my-page/layout.tsx index 7ad6ffb11..fba2d61fd 100644 --- a/src/app/my-page/layout.tsx +++ b/src/app/my-page/layout.tsx @@ -1,7 +1,7 @@ import { Box, Container, Stack } from '@mui/material' import React from 'react' import NavBar from './panel/NavBar' -import * as style from './layout.style' +import * as style from '@/components/NavBarLayout.style' const Layout = ({ children }: { children: React.ReactNode }) => { return ( diff --git a/src/app/my-page/message/@detail/page.tsx b/src/app/my-page/message/@detail/page.tsx index 9d13d880b..66a5db0ec 100644 --- a/src/app/my-page/message/@detail/page.tsx +++ b/src/app/my-page/message/@detail/page.tsx @@ -27,6 +27,7 @@ const MessageChatPage = () => { ) const axiosWithAuth = useAxiosWithAuth() const { isPc } = useMedia() + const [isMessageSending, setIsMessageSending] = useState(false) const fetchMoreData = useCallback( async (url: string) => { @@ -147,6 +148,10 @@ const MessageChatPage = () => { {isPc ? ( { /> ) : ( theme.palette.background.primary, diff --git a/src/app/my-page/message/@detail/panel/MessageForm.tsx b/src/app/my-page/message/@detail/panel/MessageForm.tsx index 3ab8c7c57..78cb3ebce 100644 --- a/src/app/my-page/message/@detail/panel/MessageForm.tsx +++ b/src/app/my-page/message/@detail/panel/MessageForm.tsx @@ -19,6 +19,10 @@ import * as style from './MessageForm.style' const MAX_LENGTH = 300 interface IMessageFormProps { + messageSendState: { + isMessageSending: boolean + setIsMessageSending: (value: boolean) => void + } targetId: number updateTarget?: Dispatch> addNewMessage: (newMessage: IMessage) => void @@ -29,6 +33,7 @@ interface IMessageFormProps { const BorderlessTextField = styled(CuTextField)(style.removeBorder) const MessageForm = ({ + messageSendState, targetId, updateTarget, addNewMessage, @@ -53,6 +58,7 @@ const MessageForm = ({ ) => { e.preventDefault() e.stopPropagation() + messageSendState.setIsMessageSending(true) try { if (!content) { openToast({ @@ -98,6 +104,7 @@ const MessageForm = ({ }) } } finally { + messageSendState.setIsMessageSending(false) handleClose && handleClose() } } @@ -123,18 +130,29 @@ const MessageForm = ({ id="message" multiline value={content} - placeholder="내용을 입력하세요" + placeholder={ + disabled ? '채팅방이 삭제되었습니다' : '내용을 입력하세요' + } onChange={(e) => setContent(e.target.value.slice(0, MAX_LENGTH)) } onKeyDown={handleKeyDown} disabled={disabled} + sx={{ + '.MuiOutlinedInput-root.Mui-disabled': { + opacity: 1, + }, + }} /> {content.length} / {MAX_LENGTH} - + diff --git a/src/app/my-page/message/@detail/panel/MessageFormModal.tsx b/src/app/my-page/message/@detail/panel/MessageFormModal.tsx index c6a8324e6..a5136d0fc 100644 --- a/src/app/my-page/message/@detail/panel/MessageFormModal.tsx +++ b/src/app/my-page/message/@detail/panel/MessageFormModal.tsx @@ -4,6 +4,10 @@ import { IMessage } from '@/types/IMessage' import MessageForm from './MessageForm' interface IMessageFormModalProps { + messageSendState: { + isMessageSending: boolean + setIsMessageSending: (value: boolean) => void + } isOpen: boolean target: { id: number @@ -14,6 +18,7 @@ interface IMessageFormModalProps { } const MessageFormModal = ({ + messageSendState, isOpen, target, addNewMessage, @@ -26,6 +31,7 @@ const MessageFormModal = ({ title={target.nickname} mobileFullSize containedButton={{ + isLoading: messageSendState.isMessageSending, text: '보내기', type: 'submit', form: 'message-form', @@ -36,6 +42,7 @@ const MessageFormModal = ({ }} > - + {message.content} @@ -81,7 +86,12 @@ export const TargetMessageItem = ({ sx={style.targetAvatar} /> )} - + {message.content} diff --git a/src/app/my-page/message/@detail/panel/MobileSendButton.tsx b/src/app/my-page/message/@detail/panel/MobileSendButton.tsx index 5bebcbf4c..0a0c7f150 100644 --- a/src/app/my-page/message/@detail/panel/MobileSendButton.tsx +++ b/src/app/my-page/message/@detail/panel/MobileSendButton.tsx @@ -8,6 +8,10 @@ import MessageFormModal from './MessageFormModal' import * as style from './MobileSendButton.style' interface IMobileSendButtonProps { + messageSendState: { + isMessageSending: boolean + setIsMessageSending: (value: boolean) => void + } disabled: boolean target: { id: number @@ -21,6 +25,7 @@ const SCROLL_OFFSET = 5 // 버튼이 바뀌는 스크롤 위치 (px) const SCROLL_THROTTLE = 500 // 스크롤 감지 주기 (ms) // TODO : 의도한대로 동작하는지 확인 필요함. const MobileSendButton = ({ + messageSendState, disabled, target, addNewMessage, @@ -80,6 +85,7 @@ const MobileSendButton = ({ { const { targetId, conversationId } = message const listItemRef = useRef(null) const { openToast } = useToast() + const { mutate } = useSWRConfig() const deleteOneMessage = () => { axiosWithAuth .delete('/api/v1/message/delete-message', { - data: { target: [{ targetId }] }, + data: { target: [{ conversationId }] }, + }) + .then(() => { + mutate('/api/v1/message/list') }) .catch(() => { openToast({ diff --git a/src/app/my-page/message/@list/panel/NewMessageForm.style.ts b/src/app/my-page/message/@list/panel/NewMessageForm.style.ts index 6d7f95363..cd6f0ce75 100644 --- a/src/app/my-page/message/@list/panel/NewMessageForm.style.ts +++ b/src/app/my-page/message/@list/panel/NewMessageForm.style.ts @@ -1,7 +1,6 @@ import { Theme } from '@mui/material' export const form = { - padding: '1rem', borderRadius: '0.25rem', background: (theme: Theme) => theme.palette.background.tertiary, } @@ -15,4 +14,13 @@ export const input = { fontWeight: (theme: Theme) => theme.typography.Caption.fontWeight, lineHeight: (theme: Theme) => theme.typography.Caption.lineHeight, }, + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + '&.Mui-focused': { + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + }, + overflow: 'scroll', } diff --git a/src/app/my-page/message/@list/panel/NewMessageForm.tsx b/src/app/my-page/message/@list/panel/NewMessageForm.tsx index d76b9789e..62978b160 100644 --- a/src/app/my-page/message/@list/panel/NewMessageForm.tsx +++ b/src/app/my-page/message/@list/panel/NewMessageForm.tsx @@ -1,5 +1,5 @@ import { FormEvent, useCallback, useState } from 'react' -import { Box, InputBase } from '@mui/material' +import { Box, TextField } from '@mui/material' import useAxiosWithAuth from '@/api/config' import useModal from '@/hook/useModal' import { IMessageListData, IMessageTarget } from '@/types/IMessage' @@ -27,6 +27,7 @@ const NewMessageForm = ({ const axiosInstance = useAxiosWithAuth() const { isOpen: modalOpen, openModal, closeModal } = useModal() const { openToast } = useToast() + const [isMessageSending, setIsMessageSending] = useState(false) const messageSubmitHandler = async (e: FormEvent) => { e.preventDefault() @@ -51,6 +52,7 @@ const NewMessageForm = ({ const sendMessage = useCallback( async (targetId?: number, content?: string) => { try { + setIsMessageSending(true) if (!targetId || !content) throw new Error() const reqBody: IMessageData = { targetId: targetId, @@ -70,6 +72,8 @@ const NewMessageForm = ({ severity: 'error', message: '쪽지 보내기에 실패했습니다. 다시 시도해주세요.', }) + } finally { + setIsMessageSending(false) } }, [], @@ -79,12 +83,17 @@ const NewMessageForm = ({ <>
- setContent(e.target.value)} sx={style.input} + inputProps={{ + minLength: 2, + maxLength: 300, + }} />
@@ -97,6 +106,7 @@ const NewMessageForm = ({ onClick: () => { sendMessage(userInfo?.targetId, content) }, + isLoading: isMessageSending, }} textButton={{ text: '취소', diff --git a/src/app/my-page/message/@list/panel/NewMessageModal.tsx b/src/app/my-page/message/@list/panel/NewMessageModal.tsx index 94c762074..76787fbe5 100644 --- a/src/app/my-page/message/@list/panel/NewMessageModal.tsx +++ b/src/app/my-page/message/@list/panel/NewMessageModal.tsx @@ -133,7 +133,7 @@ const NewMessageModal = ({ fullWidth value={targetUser ? targetUser.targetNickname : keyword} disabled={!!targetUser} - placeholder={'닉네임 혹은 이메일을 입력하세요.'} + placeholder={'검색할 닉네임을 입력해주세요.'} sx={style.inputBase} onChange={(e) => setKeyword(e.target.value)} /> diff --git a/src/app/my-page/panel/NavBar.style.ts b/src/app/my-page/panel/NavBar.style.ts index e28b8f9ec..87cca2769 100644 --- a/src/app/my-page/panel/NavBar.style.ts +++ b/src/app/my-page/panel/NavBar.style.ts @@ -1,5 +1,3 @@ -import { SxProps } from '@mui/material' - export const whale = { fontSize: '1.0625rem', // = width? } @@ -19,14 +17,3 @@ export const silhouette = { export const setting = { fontsize: '0.75rem', } - -export const pcNavBar: SxProps = { - width: '30%', - maxWidth: '19.25rem', - height: 'content-fit', -} - -export const mobileNavBar: SxProps = { - width: '100%', - height: 'content-fit', -} diff --git a/src/app/my-page/panel/NavBar.tsx b/src/app/my-page/panel/NavBar.tsx index 37bb25241..91e28f0ee 100644 --- a/src/app/my-page/panel/NavBar.tsx +++ b/src/app/my-page/panel/NavBar.tsx @@ -10,6 +10,7 @@ import { WhaleIcon, } from '@/icons/MyPage' import * as style from './NavBar.style' +import * as navStyle from '@/components/NavBarBox.style' import { Box } from '@mui/material' import useMedia from '@/hook/useMedia' @@ -27,7 +28,7 @@ const NavBar = () => { const router = useRouter() const { isPc } = useMedia() return ( - + { authorized={authenticationFt} authenticationTitle="42계정" authenticatedContent={authenticationFt} - href={`${process.env.NEXT_PUBLIC_API_URL}/oauth2/authorization/ft`} + href={`${process.env.NEXT_PUBLIC_CSR_API}/oauth2/authorization/ft`} /> diff --git a/src/app/my-page/privacy/panel/AuthSettingSection.tsx b/src/app/my-page/privacy/panel/AuthSettingSection.tsx index 5724c156f..2e853dd74 100644 --- a/src/app/my-page/privacy/panel/AuthSettingSection.tsx +++ b/src/app/my-page/privacy/panel/AuthSettingSection.tsx @@ -27,7 +27,7 @@ const AuthSettingSection = ({ {authenticationTitle} diff --git a/src/app/my-page/privacy/panel/PasswordChangeSection.tsx b/src/app/my-page/privacy/panel/PasswordChangeSection.tsx index 5c4dcb316..5b0569376 100644 --- a/src/app/my-page/privacy/panel/PasswordChangeSection.tsx +++ b/src/app/my-page/privacy/panel/PasswordChangeSection.tsx @@ -19,7 +19,7 @@ const PasswordChangeSection = () => { sx={style.buttonStyleBase} onClick={openModal} > - + 변경하기 diff --git a/src/app/my-page/profile/page.tsx b/src/app/my-page/profile/page.tsx index b1b2d8ead..7f5693ff2 100644 --- a/src/app/my-page/profile/page.tsx +++ b/src/app/my-page/profile/page.tsx @@ -31,7 +31,7 @@ const MyProfile = () => { isLoading, mutate, } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/profile`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/profile`, (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) diff --git a/src/app/my-page/profile/panel/MyPortfolio.tsx b/src/app/my-page/profile/panel/MyPortfolio.tsx index cccbfaeaf..9c4057592 100644 --- a/src/app/my-page/profile/panel/MyPortfolio.tsx +++ b/src/app/my-page/profile/panel/MyPortfolio.tsx @@ -42,7 +42,7 @@ const MyPortfolio = ({ const axiosWithAuth = useAxiosWithAuth() const { data, isLoading } = useSWR>( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/myPortfolio/list?page=${page}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/myPortfolio/list?page=${page}`, (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) diff --git a/src/app/my-page/profile/panel/PostCard.style.ts b/src/app/my-page/profile/panel/PostCard.style.ts index 0278a92b1..b0678162d 100644 --- a/src/app/my-page/profile/panel/PostCard.style.ts +++ b/src/app/my-page/profile/panel/PostCard.style.ts @@ -5,6 +5,7 @@ export const cardMediaStyleBase: SxProps = { objectFit: 'cover', maxHeight: '15.6875rem', borderRadius: '0.75rem', + p: 0, } export const cardAuthorAvatarStyleBase: SxProps = { diff --git a/src/app/my-page/profile/panel/PostCard.tsx b/src/app/my-page/profile/panel/PostCard.tsx index 453b2a725..7fc93c450 100644 --- a/src/app/my-page/profile/panel/PostCard.tsx +++ b/src/app/my-page/profile/panel/PostCard.tsx @@ -3,7 +3,6 @@ import { Card, CardContent, CardHeader, - CardMedia, Stack, SxProps, Typography, @@ -16,6 +15,7 @@ import CuAvatar from '@/components/CuAvatar' import * as style from './PostCard.style' import { useRouter } from 'next/navigation' import SplitButton from '@/components/SplitButton' +import CuPhotoBox from '@/components/CuPhotoBox' interface IPostCard { teamLogo: string // 팀 로고 @@ -76,15 +76,18 @@ function PostCard({ }} onClick={gotoTeamPage} > - + > + +
{ axiosWithAuth - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/signup/nickname`, { + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/signup/nickname`, { nickname, }) .then(() => { @@ -200,21 +200,26 @@ const ProfileBioEditor = ({ }) .catch((error) => { setIsNicknameUnique(false) - if (error.data.message) { + + if (error?.response.data?.message) { openToast({ severity: 'error', - message: error.data.message, + message: String(error.response.data.messages[0]).split(': ')[1], + }) + setError('nickname', { + type: 'notUnique', + message: String(error.response.data.messages[0]).split(': ')[1], }) } else { openToast({ severity: 'error', message: '중복된 닉네임 입니다.', }) + setError('nickname', { + type: 'notUnique', + message: '중복된 닉네임 입니다. 다른 닉네임을 입력해주세요.', + }) } - setError('nickname', { - type: 'notUnique', - message: '중복된 닉네임 입니다. 다른 닉네임을 입력해주세요.', - }) setIsLoading(false) }) } @@ -262,7 +267,7 @@ const ProfileBioEditor = ({ } submitData.append('imageChange', imageChanged.toString().toUpperCase()) - if (!isNicknameUnique) { + if (!isNicknameUnique && nickname !== data.nickname) { setError('nickname', { type: 'notUnique', message: '닉네임 중복확인이 필요합니다.', @@ -272,7 +277,7 @@ const ProfileBioEditor = ({ closeToast() await axiosWithAuth .put( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/profile/introduction/edit`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/profile/introduction/edit`, submitData, { headers: { @@ -304,11 +309,6 @@ const ProfileBioEditor = ({ }) } - function getStringByteSize(str: string) { - const encoder = new TextEncoder() - const encoded = encoder.encode(str) - return encoded.length - } const theme = useTheme() return ( + /^([가-힣a-zA-Z0-9]+)$/.test(value) || + value === '' || + '닉네임은 한글, 영문, 숫자만 입력 가능합니다.', + }, }} /> {/* 소개 수정 */} @@ -467,10 +473,7 @@ const ProfileBioEditor = ({ color={'red.strong'} sx={{ height: '0.75rem' }} > - {/* {errors.introduction - ? errors.introduction.message // NOTE: 테스트용으로 helperText를 사용했습니다. 버그 수정 시 원상복구 요망 - : field.value.length} */} - {getStringByteSize(field.value)} + {errors.introduction && errors.introduction.message} } /> diff --git a/src/app/my-page/profile/panel/ProfileCard.tsx b/src/app/my-page/profile/panel/ProfileCard.tsx index 1ca6749f0..6f4bfe927 100644 --- a/src/app/my-page/profile/panel/ProfileCard.tsx +++ b/src/app/my-page/profile/panel/ProfileCard.tsx @@ -27,12 +27,26 @@ const ProfileImageModal = ({ keepMounted sx={{ border: 'none', outline: 'none' }} > - + + {/* */} + + {/* */} + ) } diff --git a/src/app/my-page/profile/panel/ProfileLinkEditor.tsx b/src/app/my-page/profile/panel/ProfileLinkEditor.tsx index 5dd0e61c7..8ebf30d68 100644 --- a/src/app/my-page/profile/panel/ProfileLinkEditor.tsx +++ b/src/app/my-page/profile/panel/ProfileLinkEditor.tsx @@ -1,14 +1,13 @@ import React from 'react' -import { IUserProfileLink } from '@/types/IUserProfile' -import { Controller, useForm } from 'react-hook-form' -import CuTextField from '@/components/CuTextField' -import CuTextFieldLabel from '@/components/CuTextFieldLabel' +import { IUserProfileLink, IUserProfileLinkField } from '@/types/IUserProfile' +import { useFieldArray, useForm } from 'react-hook-form' import useAxiosWithAuth from '@/api/config' import CuModal from '@/components/CuModal' -import { Stack, Typography } from '@mui/material' +import { InputLabel, Stack, Typography } from '@mui/material' import useMedia from '@/hook/useMedia' import * as style from './Profile.style' import useToast from '@/states/useToast' +import ControlledTextfield from '@/components/ControlledTextfield' const ProfileLinkEditor = ({ closeModal, @@ -22,13 +21,14 @@ const ProfileLinkEditor = ({ open: boolean }) => { const axiosWithAuth = useAxiosWithAuth() - const defaultValues: Array = links - ? links.map((link) => ({ - id: link.id, - linkName: link.linkName, - linkUrl: link.linkUrl, - })) - : ([] as Array) + const defaultValues: IUserProfileLinkField = { + linkList: links as Array<{ linkName: string; linkUrl: string }>, + } + + const regex = + // eslint-disable-next-line no-useless-escape + /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%.\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%\+.~#?&//=]*)/ + const { isPc } = useMedia() const { openToast, closeToast } = useToast() @@ -36,8 +36,7 @@ const ProfileLinkEditor = ({ const emptyLinksLength: number = 3 - (links ? links.length : 0) for (let i = 0; i < emptyLinksLength; i++) - defaultValues.push({ - id: -1 * (i + 1), + defaultValues.linkList.push({ linkName: '', linkUrl: '', }) @@ -50,11 +49,13 @@ const ProfileLinkEditor = ({ clearErrors, formState: { errors, isSubmitting }, reset, - } = useForm>({ - defaultValues: { ...defaultValues }, + } = useForm({ + defaultValues: defaultValues, mode: 'onChange', }) + const { fields } = useFieldArray({ control, name: 'linkList' }) + const handleCloseModal = () => { reset(defaultValues) closeModal() @@ -62,28 +63,28 @@ const ProfileLinkEditor = ({ // 링크 제목에서 부르는 함수 const isLinkUrlRequired = (idx: number, linkName: string) => { - const linkUrl = getValues(`${idx}.linkUrl`) + const linkUrl = getValues(`linkList.${idx}.linkUrl`) if (linkUrl) { return } else if (!linkUrl && !linkName) { - clearErrors(`${idx}.linkUrl`) + clearErrors(`linkList.${idx}.linkUrl`) } } // 링크 주소에서 부르는 함수 const isLinkNameRequired = (idx: number, linkUrl: string) => { - const linkName = getValues(`${idx}.linkName`) + const linkName = getValues(`linkList.${idx}.linkName`) if (linkName) { return } else if (!linkUrl) { - clearErrors(`${idx}.linkName`) + clearErrors(`linkList.${idx}.linkName`) } } // 링크 주소 유효성 검사 const isLinkUrlValid = (idx: number) => { return (linkUrl: string) => { - const linkName = getValues(`${idx}.linkName`) + const linkName = getValues(`linkList.${idx}.linkName`) if (linkUrl) { return true } else if (linkName && !linkUrl) { @@ -95,7 +96,7 @@ const ProfileLinkEditor = ({ // 링크 제목 유효성 검사 const isLinkNameValid = (idx: number) => { return (linkName: string) => { - const linkUrl = getValues(`${idx}.linkUrl`) + const linkUrl = getValues(`linkList.${idx}.linkUrl`) if (linkName) { return true } else if (linkUrl && !linkName) { @@ -104,26 +105,21 @@ const ProfileLinkEditor = ({ } } - const onSubmit = async (data: Array) => { - const requestBody: { - linkList: Array<{ linkName: string; linkUrl: string }> - } = { - linkList: [], - } + const onSubmit = async (data: IUserProfileLinkField) => { + const linkList: Array<{ linkName: string; linkUrl: string }> = [] - for (let i = 0; i < data.length; i++) { - requestBody.linkList.push({ - linkName: data[i].linkName ?? '', - linkUrl: data[i].linkUrl ?? '', - }) - } + data.linkList.map((item) => { + if (item.linkName === '' || item.linkUrl === '') { + return + } + linkList.push({ linkName: item.linkName, linkUrl: item.linkUrl }) + }) closeToast() await axiosWithAuth - .put( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/profile/link`, - requestBody, - ) + .put(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/profile/link`, { + linkList: linkList, + }) .then(() => { openToast({ severity: 'success', @@ -170,94 +166,58 @@ const ProfileLinkEditor = ({ style={isPc ? style.formPcStyle : style.formMobileStyle} > - {defaultValues.map((link, i) => { + {fields.map((field, index) => { return ( - - - - {`링크 ${i + 1}`} - - - - ( - { - field.onChange(e) - isLinkUrlRequired(i, field.value) - }} - onBlur={() => { - field.onBlur() - isLinkUrlRequired(i, field.value) - }} - autoComplete="off" - error={errors[i]?.linkName ? true : false} - fullWidth - inputProps={{ maxLength: 20 }} - helperText={ - - {errors[i]?.linkName?.message} - - } - placeholder="링크 제목을 입력해주세요." - /> - )} - name={`${i}.linkName`} - control={control} - rules={{ - maxLength: { - value: 20, - message: - '링크 제목은 최대 20글자까지만 적용 가능합니다.', - }, - validate: { - required: isLinkNameValid(i), - }, - }} - /> - ( - { - field.onChange(e) - isLinkNameRequired(i, field.value) - }} - onBlur={() => { - field.onBlur() - isLinkNameRequired(i, field.value) - }} - autoComplete="off" - error={errors[i]?.linkUrl ? true : false} - fullWidth - helperText={ - - {errors[i]?.linkUrl?.message} - - } - inputProps={{ maxLength: 300 }} - placeholder="링크 주소(URL)를 입력해주세요." - /> - )} - name={`${i}.linkUrl`} - control={control} - rules={{ - maxLength: { - value: 300, - message: '링크는 최대 300글자까지만 적용 가능합니다.', - }, - validate: { - required: isLinkUrlValid(i), - }, - }} - /> +
+ + + + {`링크 ${index + 1}`} + + + + + {errors?.linkList?.[index]?.linkName?.message} + + } + onBlur={() => isLinkUrlRequired(index, field.linkName)} + placeholder="링크 제목을 입력해주세요." + /> + { + return ( + regex.test(value) || + !value || + '유효한 url을 입력하세요.' + ) + }, + validate: isLinkUrlValid(index), + }, + }} + error={!!errors?.linkList?.[index]?.linkUrl} + helperText={ + + {errors?.linkList?.[index]?.linkUrl?.message} + + } + onBlur={() => isLinkNameRequired(index, field.linkUrl)} + placeholder="링크 주소(URL)를 입력해주세요." + /> + - +
) })}
diff --git a/src/app/my-page/profile/panel/ProfileLinksSection.tsx b/src/app/my-page/profile/panel/ProfileLinksSection.tsx index b9cda96ce..b4381eeb6 100644 --- a/src/app/my-page/profile/panel/ProfileLinksSection.tsx +++ b/src/app/my-page/profile/panel/ProfileLinksSection.tsx @@ -15,7 +15,9 @@ const ProfileLink = (props: IUserProfileLink) => { src={`https://www.google.com/s2/favicons?domain=${props.linkUrl}`} sx={style.faviconStyle} variant="square" - /> + > + {props.linkName[0]} + void isEditable: boolean }) => { + const newLinkList: Array<{ linkName: string; linkUrl: string }> = [] + + linkList.map((item) => { + if (item.linkName === '' || item.linkUrl === '') { + return + } + newLinkList.push({ linkName: item.linkName, linkUrl: item.linkUrl }) + }) return ( - {linkList?.length ? ( - linkList.map((item) => ) + {newLinkList?.length ? ( + newLinkList.map((item) => ( + + )) ) : ( 제공된 링크가 없습니다. diff --git a/src/app/my-page/profile/panel/SkillsEditor.tsx b/src/app/my-page/profile/panel/SkillsEditor.tsx index 7b9f6b58a..fd04db9eb 100644 --- a/src/app/my-page/profile/panel/SkillsEditor.tsx +++ b/src/app/my-page/profile/panel/SkillsEditor.tsx @@ -1,23 +1,12 @@ import useAxiosWithAuth from '@/api/config' import CuModal from '@/components/CuModal' -import CuTextModal from '@/components/CuTextModal' -import TagChip from '@/components/TagChip' -import useModal from '@/hook/useModal' +import FieldWithLabel from '@/components/FieldWithLabel' +import SkillAutocomplete from '@/components/SkillAutocomplete' +import Tutorial from '@/components/Tutorial' +import { SkillsTutorial } from '@/components/tutorialContent/SkillsTutorial' import useToast from '@/states/useToast' import { ISkill } from '@/types/IUserProfile' -import { getUniqueArray } from '@/utils/getUniqueArray' -import { - Autocomplete, - Button, - CircularProgress, - Stack, - TextField, - Typography, -} from '@mui/material' -import React, { useEffect, useState } from 'react' - -// COMMENT :우선 해당 값으로 해두었으나 조정이 필요합니다. 밀리초 단위입니다. -const TIMEOUT = 500 +import React, { useState } from 'react' const SkillsEditor = ({ open, @@ -30,15 +19,7 @@ const SkillsEditor = ({ mutate: () => void closeModal: () => void }) => { - const [selected, setSelected] = useState>( - skillList.map((skill) => skill.name) as Array, - ) // 선택 된 데이터 - const [tagList, setTagList] = useState([] as ISkill[]) // 검색 된 데이터 - - const [text, setText] = useState('') // 검색 텍스트 - - const [timeOut, setTimeOut] = useState(TIMEOUT) - const [isLoading, setIsLoading] = useState(false) + const [selected, setSelected] = useState>(skillList) // 선택 된 데이터 const [isSubmitting, setIsSubmitting] = useState(false) @@ -46,68 +27,16 @@ const SkillsEditor = ({ const axiosWithAuth = useAxiosWithAuth() - const { - isOpen, - openModal: openAlertModal, - closeModal: closeAlertModal, - } = useModal() - const handleCancelClose = () => { - setSelected(skillList.map((skill) => skill.name) as Array) + setSelected(skillList) closeModal() } - useEffect(() => { - const countdown = setInterval(() => { - setTimeOut((prev) => prev - TIMEOUT / 5) - }, TIMEOUT / 5) - - return () => clearInterval(countdown) - }, [timeOut]) - - useEffect(() => { - if (timeOut === 0 && text !== '' && isLoading) { - if (text.length < 2) { - setTimeOut(TIMEOUT) - return - } - axiosWithAuth - .get( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/skill/search?keyword=${text}`, - ) - .then((res) => { - setTagList((prev) => getUniqueArray(prev.concat(res.data), 'tagId')) - setIsLoading(false) - }) - .catch(() => { - setIsLoading(false) - }) - } - }, [timeOut]) - - const handleTextFiledChange = (e: any) => { - setText(e.target.value) - if (e.target.value === '') { - setIsLoading(false) - return - } else if (isLoading === false) { - setIsLoading(true) - } - setTimeOut(TIMEOUT) - } - - const handleInput = (_: any, value: string[]) => { - setSelected(value) - } - const handleModalClose = () => { closeToast() setIsSubmitting(true) axiosWithAuth - .put( - '/api/v1/skill/regist', - tagList.filter((tag) => selected.includes(tag.name)), - ) + .put('/api/v1/skill/regist', selected) .then(() => { openToast({ severity: 'success', message: '스킬이 수정되었습니다.' }) mutate() @@ -136,130 +65,19 @@ const SkillsEditor = ({ onClick: handleCancelClose, }} > - <> - - - 나의 스킬 - - tag.name)} - onChange={handleInput} - renderTags={() => <>} - renderInput={(params) => ( - = 10} - onChange={handleTextFiledChange} - size="small" - placeholder={'프레임워크 또는 개발언어를 입력해주세요.'} - sx={{ position: 'relative' }} - InputProps={{ - ...params.InputProps, - endAdornment: ( - <> - {isLoading ? ( - - ) : null} - {params.InputProps.endAdornment} - - ), - }} - /> - )} - /> - - - - 선택한 스킬 ({selected.length}/10) - - - - {selected.length ? ( - selected.map((tagName) => { - const tag = - tagList.find((tag) => tag.name === tagName) ?? - skillList.find((tag) => tag.name === tagName) - if (!tag) return null - return ( - { - setSelected((prev) => { - const newTags = prev.filter( - (curTag) => curTag !== tag.name, - ) - return newTags - }) - }} - color={tag.color} - /> - ) - }) - ) : ( - - 선택된 스킬이 없습니다. - - )} - - - { - setSelected([]) - closeAlertModal() - }, - }} - textButton={{ - text: '취소', - onClick: closeAlertModal, - }} + } /> + } + > + - +
) } diff --git a/src/app/my-page/template.tsx b/src/app/my-page/template.tsx new file mode 100644 index 000000000..8853ec867 --- /dev/null +++ b/src/app/my-page/template.tsx @@ -0,0 +1,7 @@ +import React from 'react' + +const Template = ({ children }: { children: React.ReactNode }) => { + return
{children}
+} + +export default Template diff --git a/src/app/page.tsx b/src/app/page.tsx index bcc0350c5..a8bfb212c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,11 +1,15 @@ import MainPage from './panel/MainPage' import axios from 'axios' -export default async function Home() { +export const dynamic = 'force-dynamic' + +export default async function Home({ searchParams }: { searchParams: any }) { let data try { const response = await axios.get( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit?type=STUDY&sort=latest&page=1&pageSize=6&keyword=&due=1주일&due=12개월 이상®ion1=®ion2=&place=&status=&tag=`, + `${process.env.NEXT_PUBLIC_SSR_API}/api/v1/recruit?type=${ + searchParams?.type ?? 'STUDY' + }&sort=latest&page=1&pageSize=6&keyword=&due=1주일&due=12개월 이상®ion1=®ion2=&place=&status=&tag=`, { headers: { 'Cache-Control': 'no-store', @@ -13,8 +17,8 @@ export default async function Home() { }, ) data = response.data - } catch (e) { - console.log(e) + } catch (err) { + console.error('데이터를 불러오는데 실패했습니다.') } return diff --git a/src/app/panel/ExternalMessageModal.style.ts b/src/app/panel/ExternalMessageModal.style.ts index e1e8116e4..0f5172e71 100644 --- a/src/app/panel/ExternalMessageModal.style.ts +++ b/src/app/panel/ExternalMessageModal.style.ts @@ -25,10 +25,17 @@ export const inputBase = { color: (theme: Theme) => theme.palette.text.normal, WebkitTextFillColor: (theme: Theme) => theme.palette.text.normal, }, + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + '&.Mui-focused': { + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + }, } export const form = { - padding: '1rem', borderRadius: '0.25rem', background: (theme: Theme) => theme.palette.background.tertiary, } @@ -42,4 +49,13 @@ export const input = { fontWeight: (theme: Theme) => theme.typography.Caption.fontWeight, lineHeight: (theme: Theme) => theme.typography.Caption.lineHeight, }, + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + '&.Mui-focused': { + '& .MuiOutlinedInput-notchedOutline': { + border: 'none', + }, + }, + overflow: 'scroll', } diff --git a/src/app/panel/ExternalMessageModal.tsx b/src/app/panel/ExternalMessageModal.tsx index 8c249b057..865140ac7 100644 --- a/src/app/panel/ExternalMessageModal.tsx +++ b/src/app/panel/ExternalMessageModal.tsx @@ -1,5 +1,5 @@ import React, { useState, ReactNode } from 'react' -import { Box, Stack, InputBase, Typography } from '@mui/material' +import { Box, Stack, InputBase, Typography, TextField } from '@mui/material' import useAxiosWithAuth from '@/api/config' import useModal from '@/hook/useModal' import useToast from '@/states/useToast' @@ -139,7 +139,7 @@ const ExternalMessageModal = ({ required: '내용을 입력해주세요.', }} render={({ field }) => ( - )} /> diff --git a/src/app/panel/MainLayout.tsx b/src/app/panel/MainLayout.tsx index 6aab84033..29efe374c 100644 --- a/src/app/panel/MainLayout.tsx +++ b/src/app/panel/MainLayout.tsx @@ -5,9 +5,11 @@ import Header from './layout-panel/Header' import { usePathname } from 'next/navigation' import MobileNav from './layout-panel/MobileNav' import PcNav from './layout-panel/PcNav' +import useMedia from '@/hook/useMedia' const MainLayout = ({ children }: { children: React.ReactNode }) => { const pathname = usePathname() + const { isPc } = useMedia() // if ( // pathname === '/login' || @@ -34,14 +36,17 @@ const MainLayout = ({ children }: { children: React.ReactNode }) => { minHeight: '100dvh', }} > -
- {children} - -
-
- - {children} -
+ {isPc ? ( +
+ + {children} +
+ ) : ( +
+ {children} + +
+ )} ) } @@ -54,18 +59,20 @@ const MainLayout = ({ children }: { children: React.ReactNode }) => { minHeight: '100dvh', }} > -
-
- {/* margin은 header와 bottom appbar의 크기 */} - - {children} - - -
-
- - {children} -
+ {isPc ? ( +
+ + {children} +
+ ) : ( +
+
+ + {children} + + +
+ )} ) } diff --git a/src/app/panel/MainPage.tsx b/src/app/panel/MainPage.tsx index b113e62c0..81ba45d30 100644 --- a/src/app/panel/MainPage.tsx +++ b/src/app/panel/MainPage.tsx @@ -18,14 +18,10 @@ import useAxiosWithAuth from '@/api/config' import { AxiosInstance } from 'axios' import { IPagination } from '@/types/IPagination' import PwaInstallBanner from './PwaInstallBanner' -import PushAlertBanner from './PushAlertBanner' +// import PushAlertBanner from './PushAlertBanner' import MainBanner from '@/app/panel/main-page/MainBanner' -import io from 'socket.io-client' -import { getCookie } from 'cookies-next' -import useSocket from '@/states/useSocket' import Tutorial from '@/components/Tutorial' import { MainPageTutorial } from '@/components/tutorialContent/MainPageTutorial' -import useHeaderStore from '@/states/useHeaderStore' import NoDataDolphin from '@/components/NoDataDolphin' import { cardStyle, @@ -37,6 +33,7 @@ import SearchOptionPanel, { InfinityScrollPanel, } from '@/app/panel/main-page/MainPanel' import SelectSort from '@/app/panel/main-page/SelectSort' +import useMedia from '@/hook/useMedia' export interface BeforeInstallPromptEvent extends Event { readonly platforms: string[] @@ -61,20 +58,16 @@ export interface IDetailOption { tag: string } -export const socket = io(`${process.env.NEXT_PUBLIC_SOCKET}`, { - transports: ['socket.io', 'polling'], - query: { - token: getCookie('accessToken') ? getCookie('accessToken') : '', - }, -}) - const MainPage = ({ initData }: { initData: IPagination }) => { + const searchParams = useSearchParams() + const keyword = searchParams.get('keyword') ?? '' + const searchType = + searchParams.get('type') === 'PROJECT' ? 'PROJECT' : 'STUDY' const router = useRouter() const [page, setPage] = useState(1) - const [type, setType] = useState(undefined) //'STUDY' + const [type, setType] = useState(searchType) //'STUDY' const [openOption, setOpenOption] = useState(false) const [sort, setSort] = useState(undefined) //'latest' - const { setSocket } = useSocket() const [detailOption, setDetailOption] = useState({ isInit: true, due1: 0, @@ -86,22 +79,20 @@ const MainPage = ({ initData }: { initData: IPagination }) => { tag: '', }) - const searchParams = useSearchParams() - const keyword = searchParams.get('keyword') ?? '' const { isLogin } = useAuthStore() const axiosInstance: AxiosInstance = useAxiosWithAuth() const [prevScrollHeight, setPrevScrollHeight] = useState( undefined, ) - const { headerTitle, setHeaderTitle } = useHeaderStore() const [init, setInit] = useState(true) + const { isTablet } = useMedia() useEffect(() => { if (keyword !== '') { - setHeaderTitle(keyword + ' 검색 결과') + setType(searchType) setInit(false) - } else setHeaderTitle('') - }, [keyword]) + } + }, [keyword, searchType]) /* page가 1이면 서버가 가져온 데이터(initData)로 렌더링 */ @@ -125,11 +116,11 @@ const MainPage = ({ initData }: { initData: IPagination }) => { }&tag=${detailOption.tag}` const isInit = - page == 1 && !type && !sort && detailOption.isInit && keyword == '' && init + page == 1 && !sort && detailOption.isInit && keyword == '' && init const { data: favoriteData } = useSWR( isInit && isLogin - ? `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/favorites` + option + ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorites` + option : null, (url: string) => axiosInstance.get(url).then((res) => res.data), ) @@ -146,7 +137,7 @@ const MainPage = ({ initData }: { initData: IPagination }) => { } = useSWR>( isInit ? null - : `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit` + option, + : `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit` + option, isLogin ? (url: string) => axiosInstance.get(url).then((res) => { @@ -155,36 +146,20 @@ const MainPage = ({ initData }: { initData: IPagination }) => { : defaultGetFetcher, ) - const [content, setContent] = useState(initData?.content ?? []) - - useEffect(() => { - if (isLogin) { - socket.on('connect', () => { - console.log('socket connected') - }) - socket.on('disconnect', () => { - console.log('socket disconnected') - }) - socket.on('connect_error', (err) => { - console.log(err) - }) - socket.on('reconnect', (attemptNumber) => { - console.log('reconnect', attemptNumber) - }) - socket.on('reconnect_attempt', (attemptNumber) => { - console.log('reconnect_attempt', attemptNumber) - }) - setSocket(socket) - } - }, []) + const [content, setContent] = useState( + initData?.content.map((v) => ({ + ...v, + favorite: getFavoriteData(v.recruit_id), + })) ?? [], + ) useEffect(() => { if (!newData || !newData?.content) return + //page가 1일 경우 == initData가 설정되어있을경우, 무한스크롤시 page는 무조건 2부터 시작함. //따라서 page가 1일 경우에는 옵션이 달라진 것임. 고로 무조건 새로운 데이터로 setContent를 해준다. if (page == 1) { - setContent(newData.content) - return + return setContent(newData.content) } //여기서부터는 무한스크롤 영역. 길이가 0이면 더해주지 않는다. if (newData?.content.length == 0) return @@ -203,8 +178,16 @@ const MainPage = ({ initData }: { initData: IPagination }) => { page, ) + const { target: pcTarget, spinner: pcSpinner } = useInfiniteScrollHook( + setPage, + isLoading, + (newData?.last || initData?.last) ?? true, //isEnd + page, + ) + const handleType = useCallback( (value: ProjectType) => { + setInit(false) setType(value) //type이 변경될 경우 초기화 setPage(1) @@ -218,7 +201,7 @@ const MainPage = ({ initData }: { initData: IPagination }) => { tag: '', }) setSort('latest') - router.push('/') + router.replace(`?type=${value}`) }, [router], ) @@ -233,30 +216,28 @@ const MainPage = ({ initData }: { initData: IPagination }) => { setPage(1) }, []) - const noContent = - isLoading && page == 1 - ? '로딩중...' - : error - ? '에러 발생' - : content?.length == 0 - ? '데이터가 없습니다' - : null + const noContent = !isLoading + ? error + ? '에러 발생' + : content?.length == 0 + ? '데이터가 없습니다' + : null + : null return ( <> - + {/* */} {/* mobile view */}
- + {keyword === '' ? ( <> - + - + - }) => { justifyContent={'space-between'} my={'0.75rem'} > - {headerTitle} + + {keyword} + 검색 결과 + )} @@ -285,19 +269,15 @@ const MainPage = ({ initData }: { initData: IPagination }) => { justifyContent={'center'} alignItems={'center'} > - {isLoading ? ( - {noContent} - ) : ( - - )} + ) : ( <> - + {content?.map((project: IPost) => ( }) => { ))} + {/* 무한 스크롤 */} + + + )} - {/* 무한 스크롤 */} -
{/* pc view */}
- + {keyword === '' ? ( <> - + - + }) => { justifyContent={'space-between'} mb={'0.75rem'} > - {headerTitle} + + {keyword} + 검색 결과 + )} @@ -370,14 +359,10 @@ const MainPage = ({ initData }: { initData: IPagination }) => { justifyContent={'center'} alignItems={'center'} > - {isLoading ? ( - {noContent} - ) : ( - - )} + ) : ( <> @@ -398,15 +383,17 @@ const MainPage = ({ initData }: { initData: IPagination }) => { ))} {/* 무한 스크롤 */} - + )} - - - - - + {!isTablet && ( + + + + + + )}
diff --git a/src/app/panel/MuiThemeProvider.tsx b/src/app/panel/MuiThemeProvider.tsx index eed8123d9..f68c258bc 100644 --- a/src/app/panel/MuiThemeProvider.tsx +++ b/src/app/panel/MuiThemeProvider.tsx @@ -479,6 +479,25 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { }, } + theme.components.MuiOutlinedInput = { + styleOverrides: { + root: { + '& input': { + fontSize: '16px', + transform: 'scale(0.75)', + transformOrigin: 'top left', + marginBottom: '-10px', + marginRight: '-33.333333333%', + width: '133.333333333%', + lineHeight: '150%', + }, + '& .MuiOutlinedInput-notchedOutline': { + height: '100%', + }, + }, + }, + } + theme.components.MuiTextField = { styleOverrides: { root: { @@ -487,11 +506,9 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { }, '& input': { height: '32px', - padding: '0px 12px', + padding: '0px 16px', '&::placeholder': { color: theme.palette.text.alternative, - fontSize: '12px', - fontWeight: 400, lineHeight: '150%', }, ':-webkit-autofill': { @@ -502,9 +519,8 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { padding: '0px', borderRadius: '4px', height: 'auto', + minHeight: '32px', backgroundColor: theme.palette.background.tertiary, - fontSize: '12px', - fontWeight: 400, color: theme.palette.text.normal, lineHeight: '150%', '& fieldset': { @@ -527,7 +543,7 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { }, '& .MuiInputBase-inputMultiline': { height: 'auto', - padding: '12px', + padding: '16px', }, '.MuiFormHelperText-filled': { margin: 0, @@ -576,7 +592,8 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { } if (theme.typography) { - theme.typography.fontFamily = 'Pretendard Variable, sans-serif' + theme.typography.fontFamily = + 'var(--main-font), Pretendard Variable, sans-serif' theme.typography.HeadlineEmphasis = { fontSize: '32px', fontStyle: 'normal', @@ -677,7 +694,7 @@ const MuiThemeProvider = ({ children }: { children: React.ReactNode }) => { color: theme.palette.text.normal, } theme.typography.Tag = { - fontSize: '12px', + fontSize: '11px', fontStyle: 'normal', fontWeight: 400, lineHeight: '150%', diff --git a/src/app/panel/OthersProfile.tsx b/src/app/panel/OthersProfile.tsx index b5fe9274a..e5048c561 100644 --- a/src/app/panel/OthersProfile.tsx +++ b/src/app/panel/OthersProfile.tsx @@ -49,6 +49,9 @@ const OthersProfile = ({ name, userId, children }: IOthersProfile) => { router.push('/my-page') } + // 유령회원일 경우 + if (Number(userId) === -1) return <>{children} + return (
{children && ( diff --git a/src/app/panel/PushAlertBanner.tsx b/src/app/panel/PushAlertBanner.tsx index 1ada7eac4..45dba5461 100644 --- a/src/app/panel/PushAlertBanner.tsx +++ b/src/app/panel/PushAlertBanner.tsx @@ -1,81 +1,60 @@ +'use client' + import useAxiosWithAuth from '@/api/config' import { Box, Button, Stack, Typography } from '@mui/material' import { AxiosInstance } from 'axios' import { useEffect, useState } from 'react' -import webpush from 'web-push' +import { initializeApp } from 'firebase/app' +import { getMessaging, onMessage, getToken } from 'firebase/messaging' const PushAlertBanner = () => { const axiosInstance: AxiosInstance = useAxiosWithAuth() - const [isShowPush, setIsShowPush] = useState(true) + const [isShowPush, setIsShowPush] = useState(false) const [isScroll, setIsScroll] = useState(1) - const urlBase64ToUint8Array = (base64String: string) => { - const padding = '='.repeat((4 - (base64String.length % 4)) % 4) - const base64 = (base64String + padding) - .replace(/-/g, '+') - .replace(/_/g, '/') - const rawData = window.atob(base64) - const outputArray = new Uint8Array(rawData.length) - - for (let i = 0; i < rawData.length; ++i) { - outputArray[i] = rawData.charCodeAt(i) - } - - return outputArray - } - - const displayNotification = () => { - if ('serviceWorker' in navigator && 'PushManager' in window) { - navigator.serviceWorker.ready.then((swReg) => { - swReg.showNotification('Hello world!') - }) - } - } - - const createPushSubscription = (swReg: ServiceWorkerRegistration) => { - // 추후 서버 셋팅 한 뒤 사용 - const vapidPublicKey = webpush.generateVAPIDKeys().publicKey - const convertedVapidPublicKey = urlBase64ToUint8Array(vapidPublicKey) - swReg.pushManager - .subscribe({ - userVisibleOnly: true, - applicationServerKey: convertedVapidPublicKey, - }) - .then((newSub) => { - let newSubData = newSub.toJSON() - let newSubString = JSON.stringify(newSubData) - - return axiosInstance.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/push`, - { - subscription: newSubString, - }, - ) - }) - .then((res) => { - console.log(res) - displayNotification() + const handlePushFCM = () => { + const firebaseConfig = initializeApp({ + apiKey: `${process.env.NEXT_PUBLIC_FIREBASE_API_KEY}`, + authDomain: `${process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN}`, + projectId: `${process.env.NEXT_PUBLIC_FIREBASE_PROJECT_ID}`, + storageBucket: `${process.env.NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET}`, + messagingSenderId: `${process.env.NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID}`, + appId: `${process.env.NEXT_PUBLIC_FIREBASE_APP_ID}`, + measurementId: `${process.env.NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID}`, + }) + + const messaging = getMessaging(firebaseConfig) + + getToken(messaging, { + vapidKey: `${process.env.NEXT_PUBLIC_FIREBASE_VAPID_KEY}`, + }) + .then((currentToken: any) => { + if (currentToken) { + axiosInstance + .post( + `${process.env.NEXT_PUBLIC_NEXT_PUBLIC_CSR_API}:8082/alarm/send-push`, + { + token: currentToken, + title: '푸시 알림 테스트', + message: '푸시 알림 테스트 메시지입니다.', + }, + ) + .then(() => { + console.log('푸시 알림 전송 성공') + }) + } else { + console.log( + 'No registration token available. Request permission to generate one.', + ) + } }) - .catch((err) => { - console.log(err) + .catch(() => { + console.log('An error occurred while retrieving token. ') }) - } - const handlePushNotification = () => { - if ('serviceWorker' in navigator && 'PushManager' in window) { - let reg: ServiceWorkerRegistration - - navigator.serviceWorker.ready - .then((swReg) => { - reg = swReg - return swReg.pushManager.getSubscription() - }) - .then((subscription) => { - if (subscription === null) { - createPushSubscription(reg) - } - }) - } + onMessage(messaging, () => { + console.log('Message received. ') + }) } const handlePush = () => { @@ -83,7 +62,7 @@ const PushAlertBanner = () => { Notification.requestPermission((permission) => { if (permission === 'granted') { console.log('Notification permission granted.') - handlePushNotification() + handlePushFCM() setIsShowPush(false) localStorage.setItem('isShowPush', 'false') } else { @@ -100,6 +79,8 @@ const PushAlertBanner = () => { useEffect(() => { if (localStorage && localStorage.getItem('isShowPush') === 'false') { setIsShowPush(false) + } else { + setIsShowPush(true) } window.addEventListener('scroll', handleScroll) @@ -113,7 +94,7 @@ const PushAlertBanner = () => { <> {isShowPush && ( { - const [isShowInstall, setIsShowInstall] = useState(true) + const [isShowInstall, setIsShowInstall] = useState(false) const { isPc } = useMedia() const [isSafari, setIsSafari] = useState(false) const [deferredPrompt, setDeferredPrompt] = @@ -23,7 +25,6 @@ const PwaInstallBanner = () => { deferredPrompt.prompt() deferredPrompt.userChoice.then((choiceResult) => { if (choiceResult.outcome === 'accepted') { - console.log('User accepted the install prompt') setIsShowInstall(false) localStorage.setItem('isShowInstall', 'false') } else { @@ -31,16 +32,21 @@ const PwaInstallBanner = () => { } }) } else { - console.log('not install') + console.log( + '[Error] PWA install banner is not working. Maybe already installed?', + ) + setIsShowInstall(false) } } useEffect(() => { - if (window.matchMedia('(display-mode: standalone)').matches) { - setIsShowInstall(false) - } - if (localStorage.getItem('isShowInstall') === 'false') { + if ( + window.matchMedia('(display-mode: standalone)').matches || + localStorage.getItem('isShowInstall') === 'false' + ) { setIsShowInstall(false) + } else { + setIsShowInstall(true) } const isSafariBrowser = @@ -77,10 +83,14 @@ const PwaInstallBanner = () => { <> {isShowInstall && ( { <> {isShowInstall && ( diff --git a/src/app/panel/font.ts b/src/app/panel/font.ts index 531f213c2..4b435713b 100644 --- a/src/app/panel/font.ts +++ b/src/app/panel/font.ts @@ -2,4 +2,6 @@ import localFont from 'next/font/local' export const Pretendard = localFont({ src: '../../../public/fonts/PretendardVariable.woff2', + variable: '--main-font', + fallback: ['sans-serif'], }) diff --git a/src/app/panel/layout-panel/AlertIcon.tsx b/src/app/panel/layout-panel/AlertIcon.tsx index a00bd1a59..29dea3e37 100644 --- a/src/app/panel/layout-panel/AlertIcon.tsx +++ b/src/app/panel/layout-panel/AlertIcon.tsx @@ -1,53 +1,197 @@ 'use client' -// import { Badge, Drawer, Tab, Tabs } from '@mui/material' -import { Badge } from '@mui/material' -import { IconButton } from '@mui/material' -// import { SyntheticEvent, useCallback, useState } from 'react' -// import { Box } from '@mui/system' +import { CircularProgress, IconButton } from '@mui/material' import NotificationIcon from '@/icons/NotificationIcon' import useMedia from '@/hook/useMedia' -import CuModal from '@/components/CuModal' -import ForbiddenDolphin from '@/components/WorkingDolphin' -import useModal from '@/hook/useModal' +import { usePathname, useSearchParams } from 'next/navigation' -const AlertIcon = () => { - const isAlertComing = false - // const [tabvalue, setTabValue] = useState(0) - // const [isAlertComing, setIsAlertComing] = useState(false) - // const [isDrawerOpen, setIsDrawerOpen] = useState(false) +// 알림 잠그기 + +// import { Badge } from '@mui/material' +// import ForbiddenDolphin from '@/components/WorkingDolphin' +// import CuModal from '@/components/CuModal' +// import useModal from '@/hook/useModal' + +// 알림탭 관련 + +import { + Badge, + Button, + Drawer, + Stack, + Tab, + Tabs, + Typography, +} from '@mui/material' +import { + Dispatch, + SetStateAction, + SyntheticEvent, + useCallback, + useEffect, + useRef, + useState, +} from 'react' +import { Box } from '@mui/system' +import { CloseIcon } from '@/icons' +import useAuthStore from '@/states/useAuthStore' +import NoDataDolphin from '@/components/NoDataDolphin' +import { useRouter } from 'next/navigation' +import useAlarmStorage, { IAlarm } from '@/states/useAlarmStorage' +import AlertCard from './alert-panel/AlertCard' +import { debounce } from 'lodash' + +const useInfiniteScroll = ({ + setPage, + mutate, + isEnd, + page, + isDrawerOpen, + tabvalue, +}: { + setPage: Dispatch> + mutate: any + isEnd: boolean + page: number + isDrawerOpen: boolean + tabvalue: number +}) => { + const [spinner, setSpinner] = useState(false) + const target = useRef(null) + + const debouncedFetchData = debounce(async () => { + // 데이터 업데이트. setSpinner을 언제 true할지 정해야. + setSpinner(true) + await mutate(page, tabvalue) + setPage(page + 1) + setSpinner(false) + }, 1000) + + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting) { + if (!spinner && isEnd === false && isDrawerOpen) { + // 스피너를 표시하고 페이지 번호를 증가시킨 후 디바운스된 데이터 가져오기 함수 호출 + // 가능한 페이지 양을 도달했다면 더이상 로딩하지 않는다. + debouncedFetchData() + } + } + }, + { threshold: 0.8 }, + ) + const currentTarget = target.current + + if (currentTarget) { + observer.observe(currentTarget) + } + + // 컴포넌트가 언마운트되면 IntersectionObserver 해제 + return () => { + if (currentTarget) observer.unobserve(currentTarget) + } + }, [target, spinner, debouncedFetchData, page, isEnd, isDrawerOpen, tabvalue]) + + return { target, spinner } +} + +const AlertIcon = () => { + // const isAlertComing = false const { isPc } = useMedia() - const { isOpen, openModal, closeModal } = useModal() - - // const openAlertTab = useCallback(() => { - // setIsAlertComing(true) - // setIsDrawerOpen(true) - // }, [setIsAlertComing, setIsDrawerOpen]) - - // const toggleDrawer = useCallback( - // (open: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => { - // if ( - // event.type === 'keydown' && - // ((event as React.KeyboardEvent).key === 'Tab' || - // (event as React.KeyboardEvent).key === 'Shift') - // ) { - // return - // } - - // setIsDrawerOpen(open) - // }, - // [setIsDrawerOpen], - // ) - - // const handleChange = (e: SyntheticEvent, newValue: number) => { - // setTabValue(newValue) - // } + // const { isOpen, openModal, closeModal } = useModal() + + // 알림 탭 관련 + const { + isNewAlarm, + isNew, + getAlarms, + alarms, + deleteAlarm, + deleteAllAlarms, + checkNewAlarm, + resetAlarms, + } = useAlarmStorage() + const [tabvalue, setTabValue] = useState(0) + const [page, setPage] = useState(1) + const [isAlertComing, setIsAlertComing] = useState(false) + const [isDrawerOpen, setIsDrawerOpen] = useState(false) + const { isLogin } = useAuthStore() + const router = useRouter() + const pathname = usePathname() + const searchParams = useSearchParams() + + const { target, spinner } = useInfiniteScroll({ + setPage, + mutate: getAlarms, + isEnd: alarms[alarms.length - 1]?.isEnd || false, + page, + isDrawerOpen, + tabvalue, + }) + + useEffect(() => { + isNewAlarm(isLogin) + }, [pathname, searchParams, isLogin, isNewAlarm]) + + useEffect(() => { + if (isDrawerOpen) { + checkNewAlarm() + if (page === 1) { + getAlarms(page, tabvalue) + setPage(page + 1) + } + if (isAlertComing) { + setIsAlertComing(false) + } + } else { + resetAlarms() + setPage(1) + } + }, [isDrawerOpen, setIsAlertComing, tabvalue]) + + const openAlertTab = useCallback(() => { + setIsAlertComing(true) + setIsDrawerOpen(true) + }, [setIsAlertComing, setIsDrawerOpen]) + + const toggleDrawer = useCallback( + (open: boolean) => (event: React.KeyboardEvent | React.MouseEvent) => { + if ( + event.type === 'keydown' && + ((event as React.KeyboardEvent).key === 'Tab' || + (event as React.KeyboardEvent).key === 'Shift') + ) { + return + } + + setIsDrawerOpen(open) + }, + [setIsDrawerOpen], + ) + + const handleChange = useCallback( + (e: SyntheticEvent, newValue: number) => { + setTabValue(newValue) + setPage(1) + resetAlarms() + }, + [tabvalue, setPage, resetAlarms], + ) + + const handleClose = () => { + setIsDrawerOpen(false) + } + + const handleLogin = () => { + setIsDrawerOpen(false) + router.push('/login') + } return ( <> - - + + { /> - + {/* - - {/* */} + - - - - - - - + + + {!isPc && ( + + + + )} + + + 알림 + + + + + {!isLogin ? ( + + + + + + + ) : ( + + + + + + + + + + + + + + {alarms.length === 0 ? ( + + ) : ( + <> + {alarms.map((item: IAlarm) => ( + deleteAlarm(item.notificationId)} + alert={item} + /> + ))} + + {spinner && } + + + )} + + + + )} - */} + ) } diff --git a/src/app/panel/layout-panel/Header.tsx b/src/app/panel/layout-panel/Header.tsx index 731f1267b..9587a4fe8 100644 --- a/src/app/panel/layout-panel/Header.tsx +++ b/src/app/panel/layout-panel/Header.tsx @@ -28,7 +28,13 @@ import useAuthStore from '@/states/useAuthStore' * - 오른쪽 아이콘 (있을 수도 있고 없을 수도 있음) */ -const Header = ({ pathname }: { pathname?: string }) => { +const Header = ({ + pathname, + backAction, +}: { + pathname?: string + backAction?: () => void +}) => { const theme = useTheme() const mobileHeader = { ...style.mobileHeader, @@ -39,12 +45,14 @@ const Header = ({ pathname }: { pathname?: string }) => { const [title, setTitle] = useState('') const searchParams = useSearchParams() const keyword = searchParams.get('keyword') ?? '' + const type = searchParams.get('type') ?? 'STUDY' const regex = /^\/recruit\/\d+\/edit$/ useEffect(() => { if (!pathname) return setTitle('') if (pathname === '/') { - setTitle('메인') + if (keyword !== '') setTitle('검색 결과') + else setTitle('메인') } else if (pathname.startsWith('/login')) { setTitle('로그인') } else if (pathname === '/recruit/write') { @@ -54,7 +62,7 @@ const Header = ({ pathname }: { pathname?: string }) => { } else if (pathname.startsWith('/team-list')) { if (!isLogin) { router.push('/login?redirect=/team-list') - } else setTitle('팀페이지') + } else setTitle('나의 팀') } else if (pathname.startsWith('/my-page')) { if (!isLogin) { router.push('/login?redirect=/my-page') @@ -62,16 +70,19 @@ const Header = ({ pathname }: { pathname?: string }) => { } else { setTitle('') } - }, [pathname]) + }, [keyword, pathname]) const { headerTitle } = useHeaderStore() // 타이틀만 보여주고 싶은 경우 (뒤로 가기 버튼이 보이지 않았으면 하는 경우) - const onlyTitle = title === '마이페이지' || title === '팀페이지' + const onlyTitle = + pathname?.startsWith('/my-page') || + pathname?.startsWith('/team-list') || + pathname?.startsWith('/login') return ( - {title === '메인' && keyword === '' ? ( + {pathname === '/' && keyword === '' ? ( @@ -88,7 +99,12 @@ const Header = ({ pathname }: { pathname?: string }) => { ) : ( router.back()} + onClick={() => { + if (backAction) backAction() + else if (pathname === '/' && keyword !== '') { + router.replace(`?type=${type}`) + } else router.back() + }} sx={{ visibility: onlyTitle ? 'hidden' : 'visible', }} @@ -96,7 +112,7 @@ const Header = ({ pathname }: { pathname?: string }) => { - {/* headerTitle이 있는 경우: 페이지안에서 header를 설정하는 경우 (ex 모집글뷰, 팀페이지) */} + {/* headerTitle이 있는 경우: 페이지안에서 header를 설정하는 경우 (ex 모집글뷰, 나의 팀) */} {headerTitle === '' ? title : headerTitle} diff --git a/src/app/panel/layout-panel/MobileNav.tsx b/src/app/panel/layout-panel/MobileNav.tsx index dd5f535d3..1594a0263 100644 --- a/src/app/panel/layout-panel/MobileNav.tsx +++ b/src/app/panel/layout-panel/MobileNav.tsx @@ -27,7 +27,10 @@ const MobileNav = () => { useEffect(() => { if (pathname === '/') { setValue('home') - } else if (pathname.startsWith('/team-list')) { + } else if ( + pathname.startsWith('/team-list') || + pathname.startsWith('/teams') + ) { setValue('team-list') } else if (pathname.startsWith('/hitchhiking')) { setValue('hitchhiking') @@ -36,7 +39,7 @@ const MobileNav = () => { else setValue('my-page') } else if (pathname.startsWith('/showcase')) { setValue('showcase') - } else if (pathname.startsWith('/login')) { + } else { setValue('') } }, [pathname]) @@ -90,7 +93,7 @@ const MobileNav = () => { /> 팀페이지} + label={나의 팀} value={'team-list'} onClick={() => { router.push('/team-list') diff --git a/src/app/panel/layout-panel/Nav.style.ts b/src/app/panel/layout-panel/Nav.style.ts index decf98d01..bb121e2e1 100644 --- a/src/app/panel/layout-panel/Nav.style.ts +++ b/src/app/panel/layout-panel/Nav.style.ts @@ -1,4 +1,5 @@ export const navContainerStyle = { + display: 'flex', position: 'fixed', left: 0, right: 0, @@ -14,20 +15,20 @@ export const navContainerStyle = { export const navStyle = { '& .MuiBottomNavigationAction-label': { - color: 'text.normal', + color: 'text.alternative', }, '& .MuiTypography-root': { - color: 'text.normal', + color: 'text.alternative', }, '&.Mui-selected': { '& .MuiBottomNavigationAction-label': { - color: 'text.primary', + color: 'text.normal', }, '& .MuiSvgIcon-root': { - color: 'text.primary', + color: 'text.normal', }, '& .MuiTypography-root': { - color: 'text.primary', + color: 'text.normal', }, }, } diff --git a/src/app/panel/layout-panel/PcNav.tsx b/src/app/panel/layout-panel/PcNav.tsx index 816f403ed..9a4c034c5 100644 --- a/src/app/panel/layout-panel/PcNav.tsx +++ b/src/app/panel/layout-panel/PcNav.tsx @@ -6,7 +6,9 @@ import { Avatar, BottomNavigation, BottomNavigationAction, + Box, Button, + Container, IconButton, Stack, Typography, @@ -37,29 +39,37 @@ const PcNav = () => { : '/login?redirect=/my-page/interests' const { data: profileData } = useSWR( - isLogin ? `${process.env.NEXT_PUBLIC_API_URL}/api/v1/profile` : undefined, + isLogin ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/profile` : undefined, (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) useEffect(() => { if (pathname === '/') { setValue('home') - } else if (pathname.includes('/team-list')) { + } else if ( + pathname.startsWith('/team-list') || + pathname.startsWith('/teams') + ) { setValue('team-list') - } else if (pathname.includes('/hitchhiking')) { + } else if (pathname.startsWith('/hitchhiking')) { setValue('hitchhiking') - } else if (pathname.includes('/showcase')) { + } else if (pathname.startsWith('/showcase')) { setValue('showcase') + } else { + setValue('home') } }, [pathname]) return ( - - + @@ -117,7 +127,7 @@ const PcNav = () => { color={value === 'team-list' ? 'primary' : 'text.normal'} variant="Caption" > - 팀페이지 + 나의 팀 } onClick={() => { @@ -200,8 +210,8 @@ const PcNav = () => { )} - - + + ) } diff --git a/src/app/panel/layout-panel/alert-panel/AlertCard.tsx b/src/app/panel/layout-panel/alert-panel/AlertCard.tsx new file mode 100644 index 000000000..e06a30dd1 --- /dev/null +++ b/src/app/panel/layout-panel/alert-panel/AlertCard.tsx @@ -0,0 +1,75 @@ +'use client' + +import { AlarmType, IAlarm } from '@/states/useAlarmStorage' +import { + Card, + CardActionArea, + IconButton, + Stack, + Typography, +} from '@mui/material' +import { SystemIcon, TeamIcon, MessageIcon } from './Icons' +import { CloseIcon } from '@/icons' +import { useRouter } from 'next/navigation' + +interface IAlertCard { + alert: IAlarm + handleDelete: (id: number) => void +} + +const AlertCard = ({ alert, handleDelete }: IAlertCard) => { + const router = useRouter() + return ( + + router.push(alert.redirectUrl)} + > + + {alert.type === AlarmType.SYSTEM && } + {alert.type === AlarmType.TEAM && } + {alert.type === AlarmType.MESSAGE && } + + + + {alert.body} + + + + + handleDelete(alert.notificationId)}> + + + + + ) +} + +export default AlertCard diff --git a/src/app/panel/layout-panel/alert-panel/Icons.tsx b/src/app/panel/layout-panel/alert-panel/Icons.tsx new file mode 100644 index 000000000..d9d4c9e7a --- /dev/null +++ b/src/app/panel/layout-panel/alert-panel/Icons.tsx @@ -0,0 +1,54 @@ +import { createSvgIcon } from '@mui/material' + +const SystemIcon = createSvgIcon( + + + + , + 'SystemIcon', +) + +const MessageIcon = createSvgIcon( + + + + , + 'MessageIcon', +) + +const TeamIcon = createSvgIcon( + + + + , + 'TeamIcon', +) + +export { SystemIcon, MessageIcon, TeamIcon } diff --git a/src/app/panel/main-page/FloatEditButton.tsx b/src/app/panel/main-page/FloatEditButton.tsx index 15d2095fc..2c08ba69b 100644 --- a/src/app/panel/main-page/FloatEditButton.tsx +++ b/src/app/panel/main-page/FloatEditButton.tsx @@ -20,7 +20,7 @@ const FloatEditButton = () => { > diff --git a/src/app/panel/main-page/FormCheckbox.tsx b/src/app/panel/main-page/FormCheckbox.tsx index df930f710..c35836227 100644 --- a/src/app/panel/main-page/FormCheckbox.tsx +++ b/src/app/panel/main-page/FormCheckbox.tsx @@ -6,11 +6,13 @@ const FormCheckbox = ({ label, control, value, + variant, }: { name: string label: string control: any value?: string + variant?: any }) => { return ( @@ -25,7 +27,7 @@ const FormCheckbox = ({ ) } /> - {label} + {label} ) } diff --git a/src/app/panel/main-page/MainBanner.tsx b/src/app/panel/main-page/MainBanner.tsx index 0c19a7196..a914c41d3 100644 --- a/src/app/panel/main-page/MainBanner.tsx +++ b/src/app/panel/main-page/MainBanner.tsx @@ -1,66 +1,30 @@ -'use client' - -import { Stack } from '@mui/material' import useMedia from '@/hook/useMedia' -import Image from 'next/image' -import Slider from 'react-slick' -import 'slick-carousel/slick/slick.css' -import 'slick-carousel/slick/slick-theme.css' import { useRouter } from 'next/navigation' +import CuPhotoBox from '@/components/CuPhotoBox' const MainBanner = () => { - const router = useRouter() const { isPc } = useMedia() - const settings = { - dots: false, - infinite: true, - speed: 500, - slidesToShow: 1, - slidesToScroll: 1, - arrows: false, - // autoplay: true, - // autoplaySpeed: 3000, - pauseOnHover: true, - } + const router = useRouter() return ( - - - {'main-banner'} - - - - {'about-banner'} - - about-banner router.push('/about')} - onKeyUp={() => {}} - /> - - - + router.push('/about')} + style={{ + width: '100%', + height: isPc ? '12.5rem' : '100px', + cursor: 'pointer', + fill: 'none', + }} + objectStyle="contain" + src={ + !isPc + ? '/images/banners/about-mobile.svg' + : '/images/banners/about-pc.svg' + } + alt="main-banner" + priorityOption={true} + /> + // ) } diff --git a/src/app/panel/main-page/MainCard.style.ts b/src/app/panel/main-page/MainCard.style.ts index 10b0e7823..2ed091ccf 100644 --- a/src/app/panel/main-page/MainCard.style.ts +++ b/src/app/panel/main-page/MainCard.style.ts @@ -19,7 +19,7 @@ export const ChipStyle: SxProps = { top: 16, left: 16, borderRadius: 1, - backgroundColor: 'background.tertiary', + // backgroundColor: 'background.tertiary', color: 'text.normal', height: '1.25rem', '& .MuiChip-label': { diff --git a/src/app/panel/main-page/MainCard.tsx b/src/app/panel/main-page/MainCard.tsx index 4b1d1bf90..cb29e7a47 100644 --- a/src/app/panel/main-page/MainCard.tsx +++ b/src/app/panel/main-page/MainCard.tsx @@ -5,7 +5,6 @@ import { Card, CardContent, CardHeader, - CardMedia, Chip, Typography, Stack, @@ -15,6 +14,7 @@ import OthersProfile from '../OthersProfile' import TagChip from '@/components/TagChip' import FavoriteButton from '@/components/FavoriteButton' import { ChipStyle } from '@/app/panel/main-page/MainCard.style' +import CuPhotoBox from '@/components/CuPhotoBox' const MainCard = ({ title, @@ -41,21 +41,68 @@ const MainCard = ({ : '모집완료' return ( - + - */} + {status && ( {statusLabel}} + label={ + + {statusLabel} + + } + color={statusLabel === '모집중' ? 'green' : 'error'} sx={ChipStyle} size="medium" /> @@ -84,7 +131,17 @@ const MainCard = ({ /> } title={ - + {user_nickname} } @@ -103,7 +160,7 @@ const MainCard = ({ > { const settings = { @@ -21,36 +21,14 @@ const MainCarousel = () => { height: '100%', } - const imageProps = { - width: 310, - height: 130, - style: { - borderRadius: '0.75rem', - height: '7.5rem', - }, - } - return ( - banner-1 - - - banner-1 - - - banner-1 diff --git a/src/app/panel/main-page/MainPanel.tsx b/src/app/panel/main-page/MainPanel.tsx index 329ef5ac1..77b3dec87 100644 --- a/src/app/panel/main-page/MainPanel.tsx +++ b/src/app/panel/main-page/MainPanel.tsx @@ -9,7 +9,7 @@ interface ISearchOptionPanel { openOption: boolean setOpenOption: (value: boolean) => void handleOption: (value: IDetailOption) => void - type: ProjectType | undefined + type: ProjectType sort: ProjectSort | undefined handleSort: (value: ProjectSort) => void isPc?: boolean @@ -58,6 +58,7 @@ export const InfinityScrollPanel = ({ sx={{ bottom: 0, height: '1vh', + paddingY: '0.25rem', }} ref={target} /> diff --git a/src/app/panel/main-page/MainProfile.tsx b/src/app/panel/main-page/MainProfile.tsx index 2e4ece450..5fe1f1dc9 100644 --- a/src/app/panel/main-page/MainProfile.tsx +++ b/src/app/panel/main-page/MainProfile.tsx @@ -9,7 +9,7 @@ const MainProfile = () => { const axiosWithAuth = useAxiosWithAuth() const { isLogin } = useAuthStore() const { data } = useSWR( - isLogin ? `${process.env.NEXT_PUBLIC_API_URL}/api/v1/profile` : undefined, + isLogin ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/profile` : undefined, (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) const [isClient, setIsClient] = useState(false) @@ -46,7 +46,7 @@ const MainProfile = () => { ) : ( { const router = useRouter() const { data, isLoading, error } = useSWR>( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase?page=1&pageSize=10`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase?page=1&pageSize=10`, defaultGetFetcher, ) - // console.log(data) - const handleClick = useCallback(() => { if (data?.content.length === 0) return const id = data?.content[0].id @@ -53,16 +52,16 @@ const MainShowcase = () => { {data && data.content[0] && ( - main-showcase-image { overflow={'hidden'} textOverflow={'ellipsis'} m={'1rem'} + height={'5rem'} > - { }} > {data.content[0].description} - + */} + diff --git a/src/app/panel/main-page/Mainpage.style.ts b/src/app/panel/main-page/Mainpage.style.ts index aa86c8315..4b1c3e49f 100644 --- a/src/app/panel/main-page/Mainpage.style.ts +++ b/src/app/panel/main-page/Mainpage.style.ts @@ -9,12 +9,17 @@ export const sideMenuStyle: SxProps = { export const cardStyle: SxProps = { height: '21.875rem', borderRadius: '0.75rem', + width: '100%', } export const floatButtonStyle: SxProps = { - position: 'fixed', - right: 20, - bottom: 80, + display: 'flex', + width: '100%', + position: 'sticky', + justifyContent: 'flex-end', + boxSizing: 'border-box', + paddingX: '0.5rem', + bottom: '6.25rem', } export const containerStyle = { diff --git a/src/app/panel/main-page/Options.tsx b/src/app/panel/main-page/Options.tsx index 5f901b6df..2b00acd85 100644 --- a/src/app/panel/main-page/Options.tsx +++ b/src/app/panel/main-page/Options.tsx @@ -18,8 +18,11 @@ import { ITag } from '@/types/IPostDetail' import SettingSelect from '@/app/teams/[id]/setting/panel/SettingSelect' import useMedia from '@/hook/useMedia' -const Options = ({ setDetailOption, setOpenOption }: { - setDetailOption: any, +const Options = ({ + setDetailOption, + setOpenOption, +}: { + setDetailOption: any setOpenOption?: (value: boolean) => void }) => { const { isPc } = useMedia() @@ -33,7 +36,7 @@ const Options = ({ setDetailOption, setOpenOption }: { }, }) const { data: listData } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/tag`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/tag`, defaultGetFetcher, ) const [due, setDue] = useState([0, 100]) @@ -80,6 +83,9 @@ const Options = ({ setDetailOption, setOpenOption }: { status, tag, }) + if (!isPc && setOpenOption) { + setOpenOption(false) + } } const handleReset = () => { @@ -108,16 +114,16 @@ const Options = ({ setDetailOption, setOpenOption }: { } return ( -
{ - handleSubmit(onSubmit) - if (!isPc && setOpenOption) { - setOpenOption(false) - } - }}> - + + { aria-describedby="modal-description" > +
diff --git a/src/app/panel/main-page/SearchOption.tsx b/src/app/panel/main-page/SearchOption.tsx index ba034e890..d61b88ab2 100644 --- a/src/app/panel/main-page/SearchOption.tsx +++ b/src/app/panel/main-page/SearchOption.tsx @@ -13,7 +13,7 @@ const SearchOption = ({ openOption: boolean setOpenOption: any setDetailOption: any - type: ProjectType | undefined + type: ProjectType }) => { const { isPc } = useMedia() const typeTitle = type === 'PROJECT' ? '프로젝트' : '스터디' @@ -29,14 +29,18 @@ const SearchOption = ({ alignItems={'center'} bgcolor={openOption ? undefined : 'purple.strong'} borderRadius={'0.75rem'} + onClick={() => setOpenOption(!openOption)} > - + 맞춤 {typeTitle}를 빠르게 찾아요. - setOpenOption(!openOption)} - sx={{ color: titleColor }} - > + {openOption ? : } @@ -55,14 +59,18 @@ const SearchOption = ({ alignItems={'center'} bgcolor={'purple.strong'} borderRadius={'0.75rem'} + onClick={() => setOpenOption(!openOption)} > - + 맞춤 {typeTitle}를 빠르게 찾아요. - setOpenOption(!openOption)} - sx={{ color: 'white' }} - > + {openOption ? : } @@ -73,18 +81,28 @@ const SearchOption = ({ anchor={'bottom'} > - - - 맞춤 프로젝트를 빠르게 찾아요. - - setOpenOption(!openOption)} + setOpenOption(!openOption)} + > + + 맞춤 {typeTitle}를 빠르게 찾아요. + + {openOption ? : } - + diff --git a/src/app/panel/main-page/SelectType.tsx b/src/app/panel/main-page/SelectType.tsx index 71df952b0..fd178ae47 100644 --- a/src/app/panel/main-page/SelectType.tsx +++ b/src/app/panel/main-page/SelectType.tsx @@ -5,7 +5,7 @@ const SelectType = ({ type, setType, }: { - type: ProjectType | undefined + type: ProjectType setType: (value: ProjectType) => void }) => { { @@ -14,7 +14,7 @@ const SelectType = ({ return ( { setType('STUDY') diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx index 19e8f2c00..2374ae4da 100644 --- a/src/app/privacy/page.tsx +++ b/src/app/privacy/page.tsx @@ -14,25 +14,7 @@ import useAuthStore from '@/states/useAuthStore' import BoxBase from '@/components/BoxBase' import PrivacyPolicy from './panel/PrivacyPolicy' import UsagePolicy from './panel/UsagePolicy' - -const PCSignupBox = { - display: 'flex', - position: 'relative', - width: '544px', - padding: '40px 64px', - flexDirection: 'column', - alignItems: 'center', - gap: '48px', -} - -const MobileSignupBox = { - display: 'flex', - width: '100%', - flexDirection: 'column', - alignItems: 'center', - padding: '40px 16px', - gap: '24px', -} +import { PCLoginBox, MobileLoginBox } from '../login/login.style' const PCPaper = { width: 'calc(100%-16px)', @@ -104,7 +86,7 @@ const Privacy = () => { return ( <> - + 회원가입 diff --git a/src/app/privacy/panel/UsagePolicy.tsx b/src/app/privacy/panel/UsagePolicy.tsx index 8e446d79e..421e74755 100644 --- a/src/app/privacy/panel/UsagePolicy.tsx +++ b/src/app/privacy/panel/UsagePolicy.tsx @@ -3,7 +3,7 @@ import DynamicToastViewer from '@/components/DynamicToastViewer' const UsagePolicy = () => { const policy: string = ` - # peer 이용약관 (수정중) + # peer 이용약관 > 마지막 업데이트 2024.02.04 diff --git a/src/app/profile/[id]/layout.tsx b/src/app/profile/[id]/layout.tsx index b4ef5bf14..2ffa35674 100644 --- a/src/app/profile/[id]/layout.tsx +++ b/src/app/profile/[id]/layout.tsx @@ -1,6 +1,6 @@ import React from 'react' import { Container, Stack, Box } from '@mui/material' -import * as style from '../../my-page/layout.style' +import * as style from '@/components/NavBarLayout.style' const Layout = ({ children }: { children: React.ReactNode }) => { return ( diff --git a/src/app/profile/[id]/page.tsx b/src/app/profile/[id]/page.tsx index 6258dc59d..8c045eed6 100644 --- a/src/app/profile/[id]/page.tsx +++ b/src/app/profile/[id]/page.tsx @@ -19,7 +19,7 @@ const Profile = ({ params }: { params: { id: string } }) => { error, isLoading, } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/profile/otherUser?userId=${params.id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/profile/otherUser?userId=${params.id}`, (url: string) => axios.get(url).then((res) => res.data), ) const { isPc } = useMedia() diff --git a/src/app/profile/[id]/panel/PortfolioList.tsx b/src/app/profile/[id]/panel/PortfolioList.tsx index 938da1a97..239d06c0b 100644 --- a/src/app/profile/[id]/panel/PortfolioList.tsx +++ b/src/app/profile/[id]/panel/PortfolioList.tsx @@ -16,7 +16,7 @@ const PortfolioList = ({ userId }: { userId: string }) => { const [pageLimit, setPageLimit] = useState(1) const { data, isLoading } = useSWR>( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/otherPortfolio/list?userId=${userId}&page=${page}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/otherPortfolio/list?userId=${userId}&page=${page}`, (url: string) => axios.get(url).then((res) => res.data), ) @@ -30,7 +30,7 @@ const PortfolioList = ({ userId }: { userId: string }) => { useEffect(() => { if (data) { setPostList((prev) => getUniqueArray(prev.concat(data), 'redirectionIds')) - console.log(data) + if (data.length && !data[data.length - 1]?.isEnd) { setPageLimit((prev) => prev + 1) } diff --git a/src/app/recruit/[id]/edit/page.tsx b/src/app/recruit/[id]/edit/page.tsx index 3a221b809..979035bc9 100644 --- a/src/app/recruit/[id]/edit/page.tsx +++ b/src/app/recruit/[id]/edit/page.tsx @@ -1,5 +1,5 @@ 'use client' -import React, { useRef } from 'react' +import React, { useRef, useState } from 'react' import CreateTeamEditor from '@/app/recruit/write/panel/CreateTeamEditor' import { Editor } from '@toast-ui/editor' import { IRecruitWriteField } from '@/types/IRecruitWriteField' @@ -12,26 +12,9 @@ import { fieldToForm, formToField, } from '../../write/panel/fields/Interview/handleInterviewList' -import { IFormInterview, IRoleWrite } from '@/types/IPostDetail' -import { ISkill } from '@/types/IUserProfile' - -interface IRecruitEditApiType { - place: string - image: string | null - title: string - name: string - due: string - type: string - region: Array | null - link: string - tagList: Array - roleList: Array - interviewList: Array - max: string | undefined - isAnswered: boolean -} const Page = ({ params }: { params: { id: string } }) => { + const [isSubmitting, setIsSubmitting] = useState(false) const { openToast, closeToast } = useToast() const router = useRouter() const editorRef = useRef(null) @@ -41,17 +24,41 @@ const Page = ({ params }: { params: { id: string } }) => { const type = searchParam.get('type') const axiosWithAuth = useAxiosWithAuth() - const { - data: initData, - isLoading, - error, - } = useSWR( - `/api/v1/recruit/edit/${params.id}`, - (url: string) => axiosWithAuth.get(url).then((res) => res.data), + + const { data, isLoading, error } = useSWR<{ + defaultValues: IRecruitWriteField + isAnswered: boolean + content: string + }>(`/api/v1/recruit/edit/${params.id}`, (url: string) => + axiosWithAuth + .get(url) + .then((res) => res.data) + .then((data) => ({ + defaultValues: { + place: data.place, + image: data.image, + title: data.title, + name: data.name, + due: data.due, + type: data.type, + region: + data.place === 'ONLINE' + ? { large: '', small: '' } + : { large: data.region1, small: data.region2 }, + link: data.link ?? '', + tagList: data.tagList, + roleList: + data.type === 'PROJECT' ? data.roleList : [{ name: '', number: 0 }], + interviewList: formToField(data.interviewList), + max: data.totalNumber ? `${data.totalNumber}` : `2`, + }, + isAnswered: data.isAnswered, + content: data.content, + })), ) if (isLoading) return - else if (error || !initData) { + else if (error || !data) { if (error?.response?.initData?.message) { openToast({ message: error?.response?.data?.message, severity: 'error' }) } else { @@ -64,27 +71,16 @@ const Page = ({ params }: { params: { id: string } }) => { return <> } - const defaultValues: IRecruitWriteField = { - place: initData.place, - image: initData.image, - title: initData.title, - name: initData.name, - due: initData.due, - type: type || initData.type, - region: initData.place === 'ONLINE' ? ['', ''] : initData.region, - link: initData.link ?? '', - tagList: initData.tagList, - roleList: - initData.type === 'PROJECT' - ? initData.roleList - : [{ name: '', number: 0 }], - interviewList: formToField(initData.interviewList), - max: initData.max ? initData.max.toString() : '2', - } - const handleSubmit = async (data: IRecruitWriteField) => { closeToast() - + if (String(editorRef.current?.getMarkdown()).length > 20000) { + openToast({ + message: '모집글 내용은 20000자 이하로 작성해주세요.', + severity: 'error', + }) + return + } + setIsSubmitting(true) await axiosWithAuth .put(`/api/v1/recruit/${params.id}`, { name: data.name, @@ -92,7 +88,10 @@ const Page = ({ params }: { params: { id: string } }) => { due: data.due, status: 'ONGOING', content: editorRef.current?.getMarkdown(), - region: data.place === 'ONLINE' ? null : data.region, + region: + data.place === 'ONLINE' + ? null + : [data.region.large, data.region.small], link: data.link, tagList: data.tagList.map((tag) => { return tag.tagId @@ -100,7 +99,7 @@ const Page = ({ params }: { params: { id: string } }) => { roleList: data.type === 'PROJECT' ? data.roleList : null, interviewList: fieldToForm(data.interviewList), place: data.place, - max: data.type === 'PROJECT' ? null : Number(data.max), + max: data.type === 'PROJECT' ? null : Number(data.max) - 1, type: data.type, }) .then((res) => { @@ -108,7 +107,12 @@ const Page = ({ params }: { params: { id: string } }) => { message: '모집글이 성공적으로 수정되었습니다.', severity: 'success', }) - router.replace(`/recruit/${res.data}?type=${data.type}`) + // router.replace(`/recruit/${res.data}?type=${data.type}`) + + //ssr시 router.push로 하면 새로운 데이터를 패칭하지 않아서 window.location.href로 대체 + if (window) + window.location.href = `/recruit/${res.data}?type=${data.type}` + setIsSubmitting(false) }) .catch((error) => { openToast({ @@ -122,10 +126,12 @@ const Page = ({ params }: { params: { id: string } }) => { return ( ) } diff --git a/src/app/recruit/[id]/page.tsx b/src/app/recruit/[id]/page.tsx index 5a742647e..6d5eb44e7 100644 --- a/src/app/recruit/[id]/page.tsx +++ b/src/app/recruit/[id]/page.tsx @@ -1,8 +1,9 @@ import React from 'react' - import axios from 'axios' import RecruitDetailPage from '@/app/recruit/[id]/panel/RecruitDetailPage' +export const dynamic = 'force-dynamic' + export default async function RecruitDetailIndex({ params, }: { @@ -11,7 +12,7 @@ export default async function RecruitDetailIndex({ let data try { const response = await axios.get( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/${params.id}`, + `${process.env.NEXT_PUBLIC_SSR_API}/api/v1/recruit/${params.id}`, { headers: { 'Cache-Control': 'no-store', @@ -20,7 +21,7 @@ export default async function RecruitDetailIndex({ ) data = response.data } catch (e) { - console.log(e) + // console.error(e) } return diff --git a/src/app/recruit/[id]/panel/ApplyDefaultButton.tsx b/src/app/recruit/[id]/panel/ApplyDefaultButton.tsx index 5e73e4cf5..a460a68ce 100644 --- a/src/app/recruit/[id]/panel/ApplyDefaultButton.tsx +++ b/src/app/recruit/[id]/panel/ApplyDefaultButton.tsx @@ -21,7 +21,7 @@ const ApplyDefaultButton = ({ disabled={disabled} > - 지원하기 + {disabled ? '마감' : '지원하기'} ) diff --git a/src/app/recruit/[id]/panel/ApplyDrawerButton.tsx b/src/app/recruit/[id]/panel/ApplyDrawerButton.tsx index 9be912861..8c9098f31 100644 --- a/src/app/recruit/[id]/panel/ApplyDrawerButton.tsx +++ b/src/app/recruit/[id]/panel/ApplyDrawerButton.tsx @@ -64,7 +64,7 @@ const ApplyDrawerButton = ({ }} > - 지원하기 + {disabled ? '마감' : '지원하기'} diff --git a/src/app/recruit/[id]/panel/ApplyFormButton.tsx b/src/app/recruit/[id]/panel/ApplyFormButton.tsx index 7bc6b0553..64ed5ef14 100644 --- a/src/app/recruit/[id]/panel/ApplyFormButton.tsx +++ b/src/app/recruit/[id]/panel/ApplyFormButton.tsx @@ -4,19 +4,23 @@ import React, { useMemo } from 'react' import RecruitFormModal from '@/app/recruit/[id]/panel/form/RecruitFormModal' import useAuthStore from '@/states/useAuthStore' import { useRouter } from 'next/navigation' -import { IRole, ProjectType } from '@/types/IPostDetail' +import { IRole, ProjectType, TPostStatus } from '@/types/IPostDetail' import ApplyDrawerButton from '@/app/recruit/[id]/panel/ApplyDrawerButton' const ApplyFormButton = ({ id, type, roleList, + data, pc, + status, }: { id: string type: ProjectType roleList: IRole[] + data: any pc?: boolean + status: TPostStatus }) => { const { isLogin } = useAuthStore() const currentUrl = '/login?redirect=/recruit/1?type=' + type @@ -24,10 +28,12 @@ const ApplyFormButton = ({ const [role, setRole] = React.useState(null) const [open, setOpen] = React.useState(false) - const checkIsFull = useMemo( - () => roleList?.every((role: IRole) => role?.current >= role?.number), - [roleList], - ) + const checkIsFull = useMemo(() => { + if (status === 'DONE') return true + if (type === 'PROJECT') + return roleList?.every((role) => role.current >= role.number) + else return data.current >= data.totalNumber + }, [data, roleList, type]) const handleApply = (selectedRole: string | null) => { if (!isLogin) router.push(currentUrl) @@ -45,6 +51,7 @@ const ApplyFormButton = ({ setOpen={setOpen} recruit_id={id} role={role} + type={type} /> {type === 'PROJECT' && roleList?.length ? ( {type === 'PROJECT' && roleList?.length ? ( - 지원하기 + {disabled ? '마감' : '지원하기'} { + const convertLink = (link: string) => { + const httpPattern = /^https?:\/\//i + if (!httpPattern.test(link)) { + return `http://${link}` + } + return link + } //@todo 이동불가능한 url 처리 return ( - diff --git a/src/app/recruit/[id]/panel/RecruitContentText.tsx b/src/app/recruit/[id]/panel/RecruitContentText.tsx index 9d3115afd..aaa033a03 100644 --- a/src/app/recruit/[id]/panel/RecruitContentText.tsx +++ b/src/app/recruit/[id]/panel/RecruitContentText.tsx @@ -20,7 +20,7 @@ const RecruitContentText = ({ > {icon} - + {label} diff --git a/src/app/recruit/[id]/panel/RecruitDetailContent.tsx b/src/app/recruit/[id]/panel/RecruitDetailContent.tsx index 08673b1a9..aae9a34de 100644 --- a/src/app/recruit/[id]/panel/RecruitDetailContent.tsx +++ b/src/app/recruit/[id]/panel/RecruitDetailContent.tsx @@ -1,15 +1,12 @@ import { Stack, Typography } from '@mui/material' import RecruitContentText from '@/app/recruit/[id]/panel/RecruitContentText' import PersonOutlineOutlinedIcon from '@mui/icons-material/PersonOutlineOutlined' -import HowToRegOutlinedIcon from '@mui/icons-material/HowToRegOutlined' -import WifiOutlinedIcon from '@mui/icons-material/WifiOutlined' -import AccessTimeOutlinedIcon from '@mui/icons-material/AccessTimeOutlined' -import LocationOnOutlinedIcon from '@mui/icons-material/LocationOnOutlined' -import LocalOfferOutlinedIcon from '@mui/icons-material/LocalOfferOutlined' import { IPostDetail, IRole, ITag, ProjectType } from '@/types/IPostDetail' import TagChip from '@/components/TagChip' -import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined' import React from 'react' +import DynamicToastViewer from '@/components/DynamicToastViewer' +import * as style from '@/app/recruit/write/page.style' +import * as Icon from '@/icons' const RecruitDetailContent = ({ data, @@ -31,43 +28,55 @@ const RecruitDetailContent = ({ /> } + icon={ + + } > - {roleList.length ? ( - roleList?.map(({ name, number, current }, idx: number) => - type === 'PROJECT' ? ( - {`${name} ${current}/${number} 명`} - ) : ( - name === 'STUDY' && ( - {`${current}/${number} 명`} - ) - ), - ) + {type === 'STUDY' ? ( + {`${data?.current}/${data?.totalNumber} 명`} ) : ( - - + roleList?.map(({ name, number, current }, idx: number) => ( + {`${name} ${current}/${number} 명`} + )) )} } + icon={ + + } /> } + icon={ + + } label="목표기간" content={data?.due} /> - }> + + } + > {data?.region ? ( {data.region[0] + ' ' + data.region?.[1]} @@ -78,7 +87,12 @@ const RecruitDetailContent = ({ )} - }> + + } + > {data?.tagList?.map((tag: ITag, idx: number) => ( @@ -87,9 +101,14 @@ const RecruitDetailContent = ({ } - /> + icon={ + + } + > + + ) } diff --git a/src/app/recruit/[id]/panel/RecruitDetailPage.tsx b/src/app/recruit/[id]/panel/RecruitDetailPage.tsx index a1c617b97..a1f2d469b 100644 --- a/src/app/recruit/[id]/panel/RecruitDetailPage.tsx +++ b/src/app/recruit/[id]/panel/RecruitDetailPage.tsx @@ -1,6 +1,6 @@ 'use client' -import { Typography, Stack, Container, Divider } from '@mui/material' +import { Typography, Stack, Container, Divider, Box } from '@mui/material' import { IPostDetail, ProjectType } from '@/types/IPostDetail' import React, { useEffect, useMemo, useState } from 'react' import { useRouter, useSearchParams } from 'next/navigation' @@ -17,8 +17,15 @@ import useAxiosWithAuth from '@/api/config' import Tutorial from '@/components/Tutorial' import RecruitPageTutorial from '@/components/tutorialContent/RecruitPageTutorial' -const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { +const RecruitDetailPage = ({ + data, + id, +}: { + data?: IPostDetail + id: string +}) => { const [isClient, setIsClient] = useState(false) + const [content, setCotent] = useState(data) const router = useRouter() const type = (useSearchParams().get('type') as ProjectType) ?? 'PROJECT' const { isPc } = useMedia() @@ -29,7 +36,7 @@ const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { const { data: favoriteData } = useSWR( isLogin - ? `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/favorite/${id}` + ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorite/${id}` : null, (url: string) => axiosInstance.get(url).then((res) => res.data), ) @@ -42,6 +49,7 @@ const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { useEffect(() => { if (data) { setHeaderTitle(data.teamName) + setCotent(data) } return () => { setHeaderTitle('') @@ -49,13 +57,13 @@ const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { }, [data]) const roleList = useMemo(() => { - if (!data) return [] - return data.roleList.filter((role) => role.name !== 'Leader') - }, [data]) + if (!content) return [] + return content.roleList.filter((role) => role.name !== 'Leader') + }, [content]) - const me = nickname === data?.leader_nickname + const me = nickname === content?.leader_nickname - if (!data) return 데이터가 없습니다 + if (!content) return 데이터가 없습니다 /** PC 뷰 **/ if (isPc) { @@ -78,8 +86,9 @@ const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { @@ -87,19 +96,32 @@ const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { {/*이미지, 제목, 프로필 영역*/} - + {isClient && !me && ( - - } + + + } + /> + )} {/* 모집 내용 */} - + @@ -108,24 +130,31 @@ const RecruitDetailPage = ({ data, id }: { data: IPostDetail; id: string }) => { /** 모바일 뷰 **/ return ( - + - + - + + {isClient && !me && ( + + )} - {isClient && !me && ( - - )} ) } diff --git a/src/app/recruit/[id]/panel/RecruitInfo.tsx b/src/app/recruit/[id]/panel/RecruitInfo.tsx index fd6a26c32..19658f236 100644 --- a/src/app/recruit/[id]/panel/RecruitInfo.tsx +++ b/src/app/recruit/[id]/panel/RecruitInfo.tsx @@ -23,6 +23,7 @@ const RecruitInfo = ({ data, type, children, pc }: RecruitInfoProps) => { diff --git a/src/app/recruit/[id]/panel/RecruitInfoElement.tsx b/src/app/recruit/[id]/panel/RecruitInfoElement.tsx index 08c227afb..428037ef9 100644 --- a/src/app/recruit/[id]/panel/RecruitInfoElement.tsx +++ b/src/app/recruit/[id]/panel/RecruitInfoElement.tsx @@ -1,6 +1,7 @@ -import { Box, Chip, Stack, Typography } from '@mui/material' +import { Chip, Stack, Typography } from '@mui/material' import React from 'react' import { ProjectType, TPostStatus } from '@/types/IPostDetail' +import CuPhotoBox from '@/components/CuPhotoBox' export const RecruitTitle = ({ title, @@ -36,7 +37,7 @@ export const TypeChip = ({ type }: { type: ProjectType }) => { sx={{ backgroundColor: 'background.tertiary', borderRadius: 2, - color: 'green.normal', + color: type === 'STUDY' ? 'yellow.strong' : 'green.normal', }} /> ) @@ -46,21 +47,22 @@ export const RecruitImage = ({ image, width, height, + maxWidth, }: { image: string width: string + maxWidth?: string height: string }) => { return ( - ) diff --git a/src/app/recruit/[id]/panel/RecruitQuickMenu.tsx b/src/app/recruit/[id]/panel/RecruitQuickMenu.tsx index 20f4634eb..f7eefc7bb 100644 --- a/src/app/recruit/[id]/panel/RecruitQuickMenu.tsx +++ b/src/app/recruit/[id]/panel/RecruitQuickMenu.tsx @@ -1,12 +1,18 @@ import { Stack } from '@mui/material' +import useAxiosWithAuth from '@/api/config' import FavoriteButton from '@/components/FavoriteButton' -import React from 'react' +import React, { useEffect, useState } from 'react' import { usePathname, useRouter, useSearchParams } from 'next/navigation' import ShareMenuItem from '@/components/dropdownMenu/ShareMenuItem' import DropdownMenu from '@/components/DropdownMenu' -import * as style from '@/components/dropdownMenu/dropdownMenu.styles' import IconMenuItem from '@/components/dropdownMenu/IconMenuItem' +import useToast from '@/states/useToast' +import useModal from '@/hook/useModal' import WriteIcon from '@/icons/Nav/WriteIcon' +import { TrashLineIcon } from '@/icons' +import * as style from '@/components/dropdownMenu/dropdownMenu.styles' +import { isAxiosError } from 'axios' +import CuTextModal from '@/components/CuTextModal' const RecruitQuickMenu = ({ favorite, @@ -14,48 +20,121 @@ const RecruitQuickMenu = ({ title, content, me, + status, }: { favorite: boolean | undefined recruit_id: number title: string content: string me?: boolean + status: string }) => { const path = usePathname() const type = useSearchParams().get('type') const router = useRouter() + const [currentPageUrl, setCurrentPageUrl] = useState('') + const axiosWithAuth = useAxiosWithAuth() + const [isDeleting, setIsDeleting] = useState(false) + const { openToast } = useToast() + const { isOpen, openModal: openConfirmModal, closeModal } = useModal() + + //window is not defined 에러 방지 + useEffect(() => { + setCurrentPageUrl(window.location.href) + }, []) + + const handleDelete = () => { + setIsDeleting(true) + axiosWithAuth + .delete(`/api/v1/recruit/${recruit_id}`) + .then(() => { + alert('모집글을 삭제했습니다.') + router.push('/') // 모집글을 삭제한 뒤 메인으로 이동. + }) + .catch((error: unknown) => { + if (isAxiosError(error)) { + if (error.response?.status === 400 && error.response.data.message) { + openToast({ + severity: 'error', + message: error.response.data.message, + }) + } else if (error.response?.status === 403) { + openToast({ + severity: 'error', + message: '모집글 작성자만 삭제할 수 있습니다.', + }) + } else if (error.response?.status === 404) { + openToast({ + severity: 'error', + message: '존재하지 않는 모집글입니다.', + }) + } else { + openToast({ + severity: 'error', + message: '모집글 삭제에 실패했습니다.', + }) + } + } else { + openToast({ + severity: 'error', + message: '모집글 삭제에 실패했습니다.', + }) + } + }) + .finally(() => { + setIsDeleting(false) + closeModal() + }) + } return ( - - - - + + - {me && ( - router.push(`/recruit/${recruit_id}/edit`)} - icon={ - - } - text={'수정'} + + - )} - - + {me && ( + router.push(`/recruit/${recruit_id}/edit`)} + icon={} + text={'수정'} + disabled={status === 'DONE'} + /> + )} + {me && ( + } + text={'삭제'} + /> + )} + + + + ) } diff --git a/src/app/recruit/[id]/panel/form/CheckQuestionForm.tsx b/src/app/recruit/[id]/panel/form/CheckQuestionForm.tsx index c9ea8fbc1..afc3e51da 100644 --- a/src/app/recruit/[id]/panel/form/CheckQuestionForm.tsx +++ b/src/app/recruit/[id]/panel/form/CheckQuestionForm.tsx @@ -26,7 +26,8 @@ const CheckQuestionForm = ({ label={label} control={control} key={index} - value={value?.includes(label) ? label : undefined} + variant={'Body1'} + value={value?.includes(index.toString()) ? 'true' : undefined} /> ) })} diff --git a/src/app/recruit/[id]/panel/form/CloseQuestionForm.tsx b/src/app/recruit/[id]/panel/form/CloseQuestionForm.tsx index 75109d9c7..8ad4e1d2b 100644 --- a/src/app/recruit/[id]/panel/form/CloseQuestionForm.tsx +++ b/src/app/recruit/[id]/panel/form/CloseQuestionForm.tsx @@ -33,7 +33,9 @@ const CloseQuestionForm = ({ disabled={disabled} control={} label={ - {label} + + {label} + } value={index} key={index} diff --git a/src/app/recruit/[id]/panel/form/RatioQuestionForm.tsx b/src/app/recruit/[id]/panel/form/RatioQuestionForm.tsx index e1672cd57..a4804cf81 100644 --- a/src/app/recruit/[id]/panel/form/RatioQuestionForm.tsx +++ b/src/app/recruit/[id]/panel/form/RatioQuestionForm.tsx @@ -38,7 +38,7 @@ const RatioQuestionForm = ({ defaultValue={value ? value : '0'} render={({ field }) => ( - {optionList?.[1]} + {optionList?.[1]} {listArray?.map((label: string, index: number) => { return ( @@ -53,7 +53,7 @@ const RatioQuestionForm = ({ ) })} - {optionList?.[2]} + {optionList?.[2]} )} /> diff --git a/src/app/recruit/[id]/panel/form/RecruitFormModal.tsx b/src/app/recruit/[id]/panel/form/RecruitFormModal.tsx index 8e5d90e45..5b35bf1b4 100644 --- a/src/app/recruit/[id]/panel/form/RecruitFormModal.tsx +++ b/src/app/recruit/[id]/panel/form/RecruitFormModal.tsx @@ -1,6 +1,5 @@ 'use client' -import useToast from '@/hook/useToast' import { Box, Button, Modal, Stack, Typography } from '@mui/material' import React, { useState } from 'react' import { Controller, useForm } from 'react-hook-form' @@ -11,8 +10,9 @@ import RatioQuestionForm, { RatioQuestionList } from './RatioQuestionForm' import useAxiosWithAuth from '@/api/config' import useSWR from 'swr' import useAuthStore from '@/states/useAuthStore' -import { useRouter } from 'next/navigation' import CuTextField from '@/components/CuTextField' +import useToast from '@/states/useToast' +import { ProjectType } from '@/types/IPostDetail' interface IInterviewData { question: string @@ -25,40 +25,31 @@ const RecruitFormModal = ({ setOpen, recruit_id, role, + type, }: { open: boolean setOpen: any recruit_id: string role: string | null + type: ProjectType }) => { const axiosWithAuth = useAxiosWithAuth() const [isLoading, setLoading] = useState(false) const { isLogin } = useAuthStore() const { data } = useSWR( isLogin - ? `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/interview/${recruit_id}` + ? `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/interview/${recruit_id}` : null, (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) - const router = useRouter() + const [openConfirm, setOpenConfirm] = useState(false) const { handleSubmit, control, formState: { errors }, } = useForm() - const { - CuToast: CuSuccessToast, - isOpen: isSuccessOpen, - openToast: openSuccessToast, - closeToast: closeSuccessToast, - } = useToast() - const { - CuToast: CuFailedToast, - isOpen: isFailedOpen, - openToast: openFailedToast, - closeToast: closeFailedToast, - } = useToast() + const { openToast } = useToast() const submitForm = () => { handleSubmit(onSubmit)() @@ -67,7 +58,8 @@ const RecruitFormModal = ({ const onSubmit = async (values: any) => { let value - if (!data?.length) value = { role, answerList: [] } + if (!data?.length) + value = { role: type === 'STUDY' ? 'STUDY' : role, answerList: [] } else { const array = Object.values(values) const answerList = array?.map((res: any) => { @@ -88,17 +80,21 @@ const RecruitFormModal = ({ try { setLoading(true) await axiosWithAuth.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/interview/${recruit_id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/interview/${recruit_id}`, value, ) setOpenConfirm(false) - openSuccessToast() - router.push(`/recruit/${recruit_id}`) + openToast({ + severity: 'success', + message: '제출에 성공하였습니다.', + }) setOpen(false) - } catch (e) { + } catch (e: any) { setOpenConfirm(false) - openFailedToast() - console.log('e', e) + openToast({ + severity: 'error', + message: e?.response?.data?.message ?? '제출에 실패하였습니다.', + }) } finally { setLoading(false) } @@ -106,20 +102,6 @@ const RecruitFormModal = ({ return (data?.length ?? 0) > 0 ? ( <> - - 제출에 성공하였습니다. - - - 제출에 실패하였습니다. - - - 인터뷰 작성 - + 인터뷰 작성 {data?.map((quest, idx) => ( { const editorRef = useRef(null) const axiosWithAuth = useAxiosWithAuth() const router = useRouter() + const [isSubmitting, setIsSubmitting] = useState(false) const { openToast, closeToast } = useToast() @@ -23,22 +24,24 @@ const Page = () => { name: '', due: '', type: 'PROJECT', - region: ['', ''], + region: { large: '', small: '' }, link: '', tagList: [], roleList: [{ name: '', number: 0 }], - interviewList: [ - { - question: '질문을 입력하세요.', - type: 'CLOSE', - optionList: [{ option: '답변 1' }], - }, - ], + interviewList: [], max: '2', } const handleSubmit = async (data: IRecruitWriteField) => { closeToast() + if (String(editorRef.current?.getMarkdown()).length > 20000) { + openToast({ + message: '모집글 내용은 20000자 이하로 작성해주세요.', + severity: 'error', + }) + return + } + setIsSubmitting(true) await axiosWithAuth .post('/api/v1/recruit/write', { image: data.image?.split(',')[1], @@ -46,7 +49,10 @@ const Page = () => { name: data.name, due: data.due, type: data.type, - region: data.place === 'ONLINE' ? null : data.region, + region: + data.place === 'ONLINE' + ? null + : [data.region.large, data.region.small], tagList: data.tagList.map((tag: ITag) => { return tag.tagId }), @@ -62,13 +68,15 @@ const Page = () => { message: '모집글이 성공적으로 등록되었습니다.', severity: 'success', }) - router.replace(`/recruit/${res.data}`) + setIsSubmitting(false) + router.push(`/recruit/${res.data}?type=${data.type}`) }) .catch((error) => { openToast({ message: error.data.message ?? '모집글 등록에 실패했습니다.', severity: 'error', }) + setIsSubmitting(false) }) } @@ -78,6 +86,7 @@ const Page = () => { defaultValues={defaultValues} editorType="write" submitHandler={handleSubmit} + isSubmitting={isSubmitting} /> ) } diff --git a/src/app/recruit/write/panel/CreateTeamEditor.tsx b/src/app/recruit/write/panel/CreateTeamEditor.tsx index 916871cf8..bc221b8c9 100644 --- a/src/app/recruit/write/panel/CreateTeamEditor.tsx +++ b/src/app/recruit/write/panel/CreateTeamEditor.tsx @@ -1,6 +1,6 @@ 'use client' -import { useEffect } from 'react' +import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { Box, @@ -30,8 +30,9 @@ import Tutorial from '@/components/Tutorial' import RecruitEditPageTutorial from '@/components/tutorialContent/RecruitEditPageTutorial' import CuTextModal from '@/components/CuTextModal' import useModal from '@/hook/useModal' -// import useToast from '@/states/useToast' +import useToast from '@/states/useToast' import InterviewForm from './fields/Interview/InterviewForm' +import { SkillsTutorial } from '@/components/tutorialContent/SkillsTutorial' const CreateTeamEditor = ({ defaultValues, @@ -39,16 +40,22 @@ const CreateTeamEditor = ({ editorRef, editorType, isAnswered, + isSubmitting, + content, }: { defaultValues: IRecruitWriteField submitHandler: (data: IRecruitWriteField) => Promise editorRef: React.MutableRefObject editorType: 'edit' | 'write' isAnswered?: boolean + isSubmitting?: boolean + content?: string }) => { + const [completedInterview, setCompletedInterview] = useState(false) + const router = useRouter() - // const { openToast, closeToast } = useToast() + const { openToast, closeToast } = useToast() const { isLogin } = useAuthStore() @@ -56,11 +63,11 @@ const CreateTeamEditor = ({ if (!isLogin) router.push('/login') }, [isLogin]) - // const { - // // openModal: openCompleteModal, - // // closeModal: closeCompleteModal, - // // isOpen: isCompleteOpen, - // } = useModal() + const { + openModal: openCompleteModal, + closeModal: closeCompleteModal, + isOpen: isCompleteOpen, + } = useModal() const { openModal: openCancelModal, closeModal: closeCancelModal, @@ -76,40 +83,36 @@ const CreateTeamEditor = ({ const { control, handleSubmit, - formState: { - errors, - isSubmitting, - // isValid - }, + formState: { errors, isValid }, setValue, watch, trigger, - // setError, + setError, clearErrors, } = useForm({ defaultValues: defaultValues, - mode: 'onChange', + mode: 'all', }) - // const handleComplete = () => { - // closeToast() - // if (!image) { - // setError('image', { - // type: 'required', - // message: '필수 입력 항목입니다.', - // }) - // } - // trigger().then(() => { - // if (!isValid) { - // openToast({ - // severity: 'error', - // message: '문제가 있는 입력란이 있어요. 확인해주세요!', - // }) - // return - // } - // openCompleteModal() - // }) - // } + const handleComplete = () => { + closeToast() + if (!image) { + setError('image', { + type: 'required', + message: '필수 입력 항목입니다.', + }) + } + trigger().then(() => { + if (!isValid) { + openToast({ + severity: 'error', + message: '문제가 있는 입력란이 있어요. 확인해주세요!', + }) + return + } + openCompleteModal() + }) + } const region = watch('region') const place = watch('place') @@ -120,7 +123,6 @@ const CreateTeamEditor = ({ return ( <> - {/* {isPc && ( */} } /> - {/* )} */} {/* 대표이미지 */} @@ -212,7 +213,7 @@ const CreateTeamEditor = ({ } @@ -221,13 +222,13 @@ const CreateTeamEditor = ({ variant={'Caption'} color={'text.alternative'} > - 프로젝트 + 스터디 } disabled={editorType === 'edit'} /> } @@ -236,7 +237,7 @@ const CreateTeamEditor = ({ variant={'Caption'} color={'text.alternative'} > - 스터디 + 프로젝트 } disabled={editorType === 'edit'} @@ -257,7 +258,7 @@ const CreateTeamEditor = ({ } inputProps={{ - maxLength: 20, + maxLength: 40, }} /> )} @@ -331,7 +332,7 @@ const CreateTeamEditor = ({ rules={{ required: '필수 입력 항목입니다.', maxLength: { - value: 20, + value: 40, message: '20자 이내로 입력해주세요.', }, minLength: { @@ -438,15 +439,12 @@ const CreateTeamEditor = ({ /> } formHelperText={ - errors?.region?.[0]?.message || - errors?.region?.[1]?.message || + errors?.region?.large?.message || + errors?.region?.small?.message || undefined } > - + )} {/* 커뮤니케이션 링크 등록 */} @@ -483,7 +481,6 @@ const CreateTeamEditor = ({ name="link" control={control} rules={{ - required: '필수 입력 항목입니다.', minLength: { value: 2, message: '2자 이상 입력해주세요.', @@ -492,17 +489,32 @@ const CreateTeamEditor = ({ value: 300, message: '300자 이내로 입력해주세요.', }, + validate: { + pattern: (value) => { + if (!value) return true + const regex = + // eslint-disable-next-line no-useless-escape + /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%.\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%\+.~#?&//=]*)/ + return regex.test(value) || '유효한 url을 입력하세요.' + }, + }, }} /> {/* 태그 추가 */} } + endIconButton={ + } + /> + } > ( @@ -516,11 +528,12 @@ const CreateTeamEditor = ({ error={!!errors?.tagList} trigger={trigger} placeholder="프로젝트에 필요한 기술을 입력하세요." + autocompleteSx={{ width: ['100%', '26rem'] }} /> )} control={control} name="tagList" - rules={{ required: true }} + // rules={{ required: true }} /> {/* 팀 소개 글 작성 (커스텀에디터 적용되어야 할 부분) */} @@ -531,11 +544,14 @@ const CreateTeamEditor = ({ sx={{ ...style.iconStyleBase, color: 'text.normal' }} /> } + sx={{ width: '100%' }} > - + + + {/* 모집 인터뷰 */} } > + {(completedInterview || + defaultValues.interviewList.length > 0) && ( + + 인터뷰 작성 완료 + + )} - {/* ) => { - setValue('interviewList', value) - }} - /> */} {/* 등록, 취소 버튼 */} + { + handleSubmit(submitHandler)() + }, + isLoading: isSubmitting, + }} + /> - {/* { - handleSubmit(submitHandler)() - }, - // type: 'submit', - // form: 'recruit-form', - // isLoading: isSubmitting, - }} - /> */} ) diff --git a/src/app/recruit/write/panel/fields/Interview/InterviewForm.tsx b/src/app/recruit/write/panel/fields/Interview/InterviewForm.tsx index af6e49293..56f22d22f 100644 --- a/src/app/recruit/write/panel/fields/Interview/InterviewForm.tsx +++ b/src/app/recruit/write/panel/fields/Interview/InterviewForm.tsx @@ -2,31 +2,83 @@ import CuModal from '@/components/CuModal' import { IRecruitWriteField } from '@/types/IRecruitWriteField' import { Button, MenuItem, Select, Stack, Typography } from '@mui/material' import React, { useState } from 'react' -import { Control, UseFormTrigger, useFieldArray } from 'react-hook-form' +import { + Control, + UseFormTrigger, + useFieldArray, + useFormState, +} from 'react-hook-form' import Question from './Question' +import CuTextModal from '@/components/CuTextModal' +import useModal from '@/hook/useModal' +import useToast from '@/states/useToast' const InterviewForm = ({ control, closeModal, isOpen, trigger, + setCompletedInterview, }: { control: Control closeModal: () => void isOpen: boolean trigger: UseFormTrigger + setCompletedInterview: (value: boolean) => void }) => { + const { openToast } = useToast() + const { + openModal: openCancelModal, + closeModal: closeCancelModal, + isOpen: isCancelOpen, + } = useModal() + + const { + openModal: openCompleteModal, + closeModal: closeCompleteModal, + isOpen: isCompleteOpen, + } = useModal() + const [value, setValue] = useState<'OPEN' | 'CLOSE' | 'CHECK' | 'RATIO'>( 'OPEN', ) - const { fields, append } = useFieldArray({ + const { fields, append, remove } = useFieldArray({ control, name: 'interviewList', }) + const { errors } = useFormState({ control, name: 'interviewList' }) + const handleComplete = () => { - trigger('interviewList') + if (fields.length === 0) { + openToast({ + message: '최소 한 개 이상의 질문을 작성하세요.', + severity: 'error', + }) + return + } + trigger('interviewList').then(() => { + if (Object.keys(errors).length) { + openToast({ + message: '질문과 답변을 모두 작성해주세요.', + severity: 'error', + }) + return + } + openCompleteModal() + }) + } + + const handleCompleteModalConfirm = () => { + setCompletedInterview(true) + closeCompleteModal() + closeModal() + } + + const handleCancelModalConfirm = () => { + fields.map((_, index) => remove(index)) + closeCancelModal() closeModal() } @@ -36,88 +88,119 @@ const InterviewForm = ({ } if (value === 'OPEN') append({ - question: '질문을 입력하세요.', + question: '', type: 'OPEN', optionList: [{ option: '' }], }) else if (value === 'CLOSE') append({ - question: '질문을 입력하세요.', + question: '', type: 'CLOSE', optionList: [{ option: '' }, { option: '' }], }) else if (value === 'CHECK') append({ - question: '질문을 입력하세요.', + question: '', type: 'CHECK', optionList: [{ option: '' }], }) else if (value === 'RATIO') append({ - question: '질문을 입력하세요.', + question: '', type: 'RATIO', optionList: [{ option: '5' }, { option: '' }, { option: '' }], }) } return ( - - - {fields.map((field, index) => { - return ( - + + + {fields.map((field, index) => { + return ( + + + + ) + })} + + - setValue( - event.target.value as 'OPEN' | 'CLOSE' | 'CHECK' | 'RATIO', - ) - } - > - - 주관식 - - - 객관식 - - - 다중 선택 - - - 선형 배율 - - - + + 주관식 + + + 객관식 + + + 다중 선택 + + + 선형 배율 + + + + - - + + + + ) } diff --git a/src/app/recruit/write/panel/fields/Interview/Options.tsx b/src/app/recruit/write/panel/fields/Interview/Options.tsx index 715a4cc44..17609daf7 100644 --- a/src/app/recruit/write/panel/fields/Interview/Options.tsx +++ b/src/app/recruit/write/panel/fields/Interview/Options.tsx @@ -6,9 +6,11 @@ import { UnCheckedCheckBox, UnSelectedRadioButton, } from '@/icons' +import useToast from '@/states/useToast' import { IRecruitWriteField } from '@/types/IRecruitWriteField' import { Button, + FormHelperText, IconButton, MenuItem, Stack, @@ -16,7 +18,7 @@ import { Typography, } from '@mui/material' import React from 'react' -import { Control, useFieldArray, useWatch } from 'react-hook-form' +import { Control, useFieldArray, useFormState, useWatch } from 'react-hook-form' const Body2Style = { '& .MuiInputBase-root': { @@ -25,11 +27,12 @@ const Body2Style = { fontWeight: 400, lineHeight: '150%', color: 'text.alternative', + width: '40%', }, '& input': { p: 0, }, - width: '40%', + width: '100%', } const Options = ({ @@ -46,11 +49,15 @@ const Options = ({ name: `interviewList.${firstIndex}.optionList`, }) + const { errors } = useFormState({ control }) + const ratioMax = useWatch({ control, name: `interviewList.${firstIndex}.optionList.${0}.option`, }) + const { openToast } = useToast() + if (type === 'CLOSE') { return ( <> @@ -77,9 +84,42 @@ const Options = ({ placeholder="선택지를 입력해주세요." variant="standard" sx={Body2Style} + error={ + !!errors?.interviewList?.[firstIndex]?.optionList?.[index] + ?.option?.message + } + inputProps={{ + maxLength: 20, + }} + rules={{ + required: '선택지를 입력해주세요.', + maxLength: { + value: 20, + message: '최대 20자까지 입력 가능합니다.', + }, + minLength: { + value: 2, + message: '최소 2자 이상 입력해주세요.', + }, + }} + helperText={ + + { + errors?.interviewList?.[firstIndex]?.optionList?.[index] + ?.option?.message + } + + } /> { + if (fields.length === 1) { + openToast({ + severity: 'error', + message: '선택지는 최소 1개 이상 입력해야 합니다.', + }) + return + } remove(index) }} > @@ -116,14 +156,47 @@ const Options = ({ sx={{ color: 'text.alternative', width: '0.875rem' }} /> + { + errors?.interviewList?.[firstIndex]?.optionList?.[index] + ?.option?.message + } + + } /> { + if (fields.length === 1) { + openToast({ + severity: 'error', + message: '선택지는 최소 1개 이상 입력해야 합니다.', + }) + return + } remove(index) }} > @@ -180,6 +253,13 @@ const Options = ({ control={control} placeholder="선택지를 입력해주세요." variant="outlined" + rules={{ + required: '최대 값을 지정해주세요.', + }} + error={ + !!errors?.interviewList?.[firstIndex]?.optionList?.[index] + ?.option?.message + } > 2 3 @@ -190,22 +270,51 @@ const Options = ({ ) } return ( - - - {index === 1 ? '1.' : ratioMax + '.'} - - + + + + {index === 1 ? '1.' : ratioMax + '.'} + + + + + + {errors?.interviewList?.[firstIndex]?.optionList?.[0]?.option + ?.message ?? + errors?.interviewList?.[firstIndex]?.optionList?.[index] + ?.option?.message} + + ) })} @@ -218,10 +327,13 @@ const Options = ({ key={field.id} name={`interviewList.${firstIndex}.optionList.${index}.option`} control={control} - placeholder="선택지를 입력해주세요." + placeholder="주관식 답변입니다." variant="standard" sx={Body2Style} disabled + inputProps={{ + maxLength: 20, + }} /> ) }) diff --git a/src/app/recruit/write/panel/fields/Interview/Question.tsx b/src/app/recruit/write/panel/fields/Interview/Question.tsx index 8bced0fe3..aacddba1c 100644 --- a/src/app/recruit/write/panel/fields/Interview/Question.tsx +++ b/src/app/recruit/write/panel/fields/Interview/Question.tsx @@ -1,52 +1,95 @@ import ControlledSelect from '@/components/ControlledSelect' -import { MenuItem, Typography } from '@mui/material' +import { IconButton, MenuItem, Stack, Typography } from '@mui/material' import React from 'react' -// import { IFormInterview } from '@/types/IPostDetail' -import { Control, useWatch } from 'react-hook-form' +import { + Control, + UseFieldArrayRemove, + useFormState, + useWatch, +} from 'react-hook-form' import { IRecruitWriteField } from '@/types/IRecruitWriteField' import ControlledTextfield from '@/components/ControlledTextfield' import Options from './Options' +import { CloseIcon } from '@/icons' const Question = ({ control, index, + remove, }: { control: Control index: number + remove: UseFieldArrayRemove }) => { const type = useWatch({ control, name: `interviewList.${index}.type` }) + const { errors } = useFormState({ control }) return ( <> - - - 주관식 - - - 객관식 - - - 다중 선택 - - - 선형 배율 - - + + + + 주관식 + + + 객관식 + + + 다중 선택 + + + 선형 배율 + + + { + remove(index) + }} + > + + + + {errors?.interviewList?.[index]?.question?.message} + + } placeholder="질문을 입력해주세요." variant="standard" sx={{ - width: '50%', + width: '100%', + maxWidth: ['100%', '20rem'], '& .MuiInputBase-root': { fontSize: '15px', fontWeight: 400, diff --git a/src/app/recruit/write/panel/fields/SelectRegion.tsx b/src/app/recruit/write/panel/fields/SelectRegion.tsx index e1542351c..1daa32cef 100644 --- a/src/app/recruit/write/panel/fields/SelectRegion.tsx +++ b/src/app/recruit/write/panel/fields/SelectRegion.tsx @@ -7,14 +7,13 @@ import { Control, Controller, useFormState } from 'react-hook-form' import { IRecruitWriteField } from '@/types/IRecruitWriteField' interface BasicSelectProps { - region: string[] + region: { large: string; small: string } control: Control } -// 해당 컴포넌트에는 react-hook-form을 제대로 적용하지 않았습니다. - export default function SelectRegion({ region, control }: BasicSelectProps) { const { errors } = useFormState({ control }) + let options1 = [ koreaDistrict.largeScaleData.map((value) => { return ( @@ -27,8 +26,8 @@ export default function SelectRegion({ region, control }: BasicSelectProps) { }), ] - let options2 = koreaDistrict.smallScaleData[region[0] ?? ''] - ? koreaDistrict.smallScaleData[region[0] ?? ''].map((value) => { + let options2 = koreaDistrict.smallScaleData[region.large ?? ''] + ? koreaDistrict.smallScaleData[region.large ?? ''].map((value) => { return ( @@ -51,12 +50,12 @@ export default function SelectRegion({ region, control }: BasicSelectProps) { {...field} sx={style.selectStyle} variant="outlined" - error={errors.region?.[0] ? true : false} + error={errors.region?.large ? true : false} > {options1} )} - name={'region.0'} + name={'region.large'} control={control} rules={{ required: '필수 입력 항목 입니다.' }} /> @@ -67,12 +66,12 @@ export default function SelectRegion({ region, control }: BasicSelectProps) { {...field} sx={style.selectStyle} variant="outlined" - error={errors.region?.[1] ? true : false} + error={errors.region?.small ? true : false} > {options2} )} - name={'region.1'} + name={'region.small'} control={control} rules={{ required: '필수 입력 항목 입니다.' }} /> diff --git a/src/app/recruit/write/panel/fields/SetTeamRole.tsx b/src/app/recruit/write/panel/fields/SetTeamRole.tsx index c1eeed71d..eaae564f3 100644 --- a/src/app/recruit/write/panel/fields/SetTeamRole.tsx +++ b/src/app/recruit/write/panel/fields/SetTeamRole.tsx @@ -7,10 +7,9 @@ import { UseFormTrigger, useFieldArray, useFormState, - useWatch, } from 'react-hook-form' import ControlledTextfield from '@/components/ControlledTextfield' -import React, { useState } from 'react' +import React from 'react' import FieldWithLabel from '@/components/FieldWithLabel' import { CloseIcon, PlusIcon, UserCheckIcon } from '@/icons' import * as style from '../../page.style' @@ -28,40 +27,35 @@ const SetTeamRole = ({ editorType: 'write' | 'edit' }) => { const { isPc } = useMedia() - const [leftMember, setLeftMember] = useState(10) const { prepend, remove, fields } = useFieldArray({ control, name: 'roleList', }) - const roleData = useWatch({ control, name: 'roleList.0.number' }) - const { errors } = useFormState({ control }) + const { errors } = useFormState({ control, name: 'roleList' }) - const { closeToast, openToast } = useToast() + const { openToast, closeToast } = useToast() - const handlePrepend = () => { + const handlePrepend = (event: React.MouseEvent) => { + event.stopPropagation() closeToast() - if (leftMember == roleData) { - openToast({ - message: '최대 10명 까지만 등록 가능합니다.', + if (fields.length >= 10) { + return openToast({ + message: '최대 10개의 역할까지 모집 가능해요.', severity: 'error', }) - return } - trigger('roleList').then(() => { - if (!errors.roleList) { - setLeftMember((prev) => { - return prev - roleData - }) - prepend({ name: '', number: 1 }) - } - }) + prepend({ name: '', number: 0 }) } const handleRemove = (index: number) => { - setLeftMember((prev) => { - return prev + fields[index].number - }) + closeToast() + if (fields.length <= 1) { + return openToast({ + message: '최소 1개의 역할은 입력해주세요.', + severity: 'error', + }) + } remove(index) } @@ -72,7 +66,7 @@ const SetTeamRole = ({ } endIconButton={ - + @@ -87,7 +81,7 @@ const SetTeamRole = ({ { + onChange={() => { trigger([`roleList.${index}.name`]) }} name={`roleList.${index}.name`} @@ -100,22 +94,14 @@ const SetTeamRole = ({ ? '찾고있는 역할을 입력하세요, ex) 프론트엔드 개발자, 디자이너' : '찾고있는 역할을 입력하세요.' } - rules={ - index === 0 - ? { - required: '모집 역할을 입력해주세요.', - minLength: { - value: 2, - message: '2글자 이상 입력해주세요.', - }, - maxLength: { - value: 20, - message: '20글자 이하로 입력해주세요.', - }, - } - : undefined - } - disabled={editorType === 'edit' || !!index} + rules={{ + required: '모집 역할을 입력해주세요.', + maxLength: { + value: 20, + message: '20글자 이하로 입력해주세요.', + }, + }} + disabled={editorType === 'edit'} error={!!errors?.roleList?.[index]?.name} /> ), }} - onBlur={() => { - trigger([`roleList.${index}.number`]) + rules={{ + required: '모집 인원을 입력해주세요.', + min: { value: 1, message: '1명 이상 입력해주세요.' }, + max: { value: 6, message: '6명 이하로 입력해주세요.' }, }} - rules={ - index === 0 - ? { - required: '모집 인원을 입력해주세요.', - min: { value: 1, message: '1명 이상 입력해주세요.' }, - max: { - value: leftMember > 6 ? 6 : leftMember, - message: `${ - leftMember > 6 ? 6 : leftMember - }명 이하로 입력해주세요.`, - }, - } - : undefined - } sx={{ width: '4.5rem', }} - disabled={editorType === 'edit' || !!index} + disabled={editorType === 'edit'} error={!!errors?.roleList?.[index]?.number} /> handleRemove(index)} sx={{ height: '1.5rem' }} - disabled={fields.length === 1} > { return ( @@ -97,8 +96,7 @@ export default function SearchBody({ onClose }: SearchBodyProps) { Math.max(...storedKeywords.map((key) => Number(key.split('_')[1])), 0) + 1 const newKeywordKey = `searchWord_${newKeywordIndex}` localStorage.setItem(newKeywordKey, keyword) - - router.push(`?keyword=${data.searchWord}`) + router.push(`/?keyword=${data.searchWord}&type=${type}`) onClose() } @@ -113,7 +111,6 @@ export default function SearchBody({ onClose }: SearchBodyProps) { return ( <> - {!isPc &&
} { + const axiosWithAuth = useAxiosWithAuth() const { data, isLoading, error } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/${params.id}`, - defaultGetFetcher, - { shouldRetryOnError: false }, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/${params.id}`, + (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) + if (isLoading) return if (error) { if (error.response && error.response.status === 404) { @@ -27,10 +29,10 @@ const ShowcaseDetailPage = ({ params }: { params: { id: number } }) => { return ( data && ( - <> + - + ) ) } diff --git a/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts b/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts index 2bf2499fc..4c4fd8219 100644 --- a/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts +++ b/src/app/showcase/detail/[id]/panel/CommentContainer.style.ts @@ -16,6 +16,8 @@ export const commentListContainer = { height: 'auto', gap: '1rem', justifyContent: 'space-between', + overflowWrap: 'anywhere', + alignItems: 'center', } export const commenterInfo = { diff --git a/src/app/showcase/detail/[id]/panel/CommentContainer.tsx b/src/app/showcase/detail/[id]/panel/CommentContainer.tsx index 99280ee3c..29562b4ed 100644 --- a/src/app/showcase/detail/[id]/panel/CommentContainer.tsx +++ b/src/app/showcase/detail/[id]/panel/CommentContainer.tsx @@ -19,6 +19,8 @@ import useSWR, { mutate } from 'swr' import { CommentWriter } from './CommentWriter' import useToast from '@/states/useToast' import * as style from './CommentContainer.style' +import OthersProfile from '@/app/panel/OthersProfile' +// import OthersProfile from '@/app/panel/OthersProfile' const Comment = ({ data, postId }: CommentProps) => { const theme = useTheme() @@ -29,11 +31,11 @@ const Comment = ({ data, postId }: CommentProps) => { const onDeleteComment = async () => { try { await axiosWithAuth.delete( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/comment/${data.commentId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${data.commentId}`, ) closeToast() mutate( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/comment/${postId}?page=1&pageSize=3`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${postId}?page=1&pageSize=3`, ) } catch (error: any) { switch (error.response.status) { @@ -73,11 +75,17 @@ const Comment = ({ data, postId }: CommentProps) => { - + {/* TODO : OthersProfile 컴포넌트로 감싸기 */} + + + {data.authorNickname} @@ -135,7 +143,7 @@ const Comment = ({ data, postId }: CommentProps) => { const CommentContainer = ({ postId }: IPostId) => { const axiosWithAuth = useAxiosWithAuth() const { data, isLoading, error } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/comment/${postId}?page=1&pageSize=3`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${postId}?page=1&pageSize=3`, (url: string) => axiosWithAuth.get(url).then((res) => res.data), { shouldRetryOnError: false }, ) @@ -151,7 +159,7 @@ const CommentContainer = ({ postId }: IPostId) => { @@ -168,7 +176,7 @@ const CommentContainer = ({ postId }: IPostId) => { diff --git a/src/app/showcase/detail/[id]/panel/CommentWriter.tsx b/src/app/showcase/detail/[id]/panel/CommentWriter.tsx index 050899cbd..3871cf78c 100644 --- a/src/app/showcase/detail/[id]/panel/CommentWriter.tsx +++ b/src/app/showcase/detail/[id]/panel/CommentWriter.tsx @@ -13,7 +13,7 @@ export const CommentWriter = ({ mutate, }: IPostId & { mutate: typeof mutateType }) => { const [content, setContent] = useState('') - const commentURL = `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/comment/${postId}?page=1&pageSize=3` + const commentURL = `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment/${postId}?page=1&pageSize=3` const axiosWithAuth = useAxiosWithAuth() const { openToast } = useToast() @@ -25,7 +25,7 @@ export const CommentWriter = ({ try { await axiosWithAuth.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/comment`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/comment`, { content: content, postId: Number(postId), @@ -71,6 +71,7 @@ export const CommentWriter = ({ onChange={onChangeContent} placeholder="댓글을 작성해주세요." style={style.writerInput} + inputProps={{ maxLength: 150 }} /> diff --git a/src/app/showcase/detail/[id]/panel/ShowcaseViewer.tsx b/src/app/showcase/detail/[id]/panel/ShowcaseViewer.tsx index e60cace2a..89f5e02bb 100644 --- a/src/app/showcase/detail/[id]/panel/ShowcaseViewer.tsx +++ b/src/app/showcase/detail/[id]/panel/ShowcaseViewer.tsx @@ -1,11 +1,10 @@ -import { Box, Container, Stack } from '@mui/material' +import { Container, Stack } from '@mui/material' import React from 'react' import TeamName from '../../../panel/common/TeamName' import SkillInput from '../../../panel/common/SkillInput' import StartEndDateViewer from '../../../panel/common/StartEndDateViewer' import TeamMembers from '../../../panel/common/TeamMembers' import { IShowcaseViewerFields } from '@/types/IShowcaseEdit' -import ToastViewer from '@/components/ToastUIViewer' import LinksViewer from '../../../panel/common/LinksViewer' import '@toast-ui/editor/dist/toastui-editor-viewer.css' import * as style from './ShowcaseViewer.style' @@ -13,6 +12,8 @@ import LabelWithIcon from '@/components/LabelWithIcon' import { FileIcon } from '@/icons' import * as Style from '../../../panel/common/SkillInput.style' import useMedia from '@/hook/useMedia' +import DynamicToastViewer from '@/components/DynamicToastViewer' +import CuPhotoBox from '@/components/CuPhotoBox' interface IShowcaseViewerProps { data: IShowcaseViewerFields @@ -21,18 +22,23 @@ interface IShowcaseViewerProps { const CoverImage = ({ image }: { image: string }) => { return ( - ) } const InformationViewer = ({ data }: any) => { return ( - + @@ -49,11 +55,7 @@ const ContentViewer = ({ content }: { content: string }) => { message="내용" color="text.alternative" /> - + ) } @@ -74,10 +76,10 @@ const ShowcaseViewer = ({ data, postId }: IShowcaseViewerProps) => { @@ -88,10 +90,10 @@ const ShowcaseViewer = ({ data, postId }: IShowcaseViewerProps) => { ) : ( { const showcaseId = params.get('showcaseId') const axiosWithAuth = useAxiosWithAuth() const { data, isLoading, error } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/${showcaseId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/${showcaseId}`, (url: string) => axiosWithAuth.get(url).then((res) => res.data), { shouldRetryOnError: false }, ) diff --git a/src/app/showcase/page.tsx b/src/app/showcase/page.tsx index c632a2ee2..c99bd72a1 100644 --- a/src/app/showcase/page.tsx +++ b/src/app/showcase/page.tsx @@ -11,20 +11,24 @@ import { ICardData } from './panel/types' import useAuthStore from '@/states/useAuthStore' import CardContainer from './panel/CardContainer' import ShowcasePCLayout from './panel/ShowcasePc/ShowcasePcLayout' +import useToast from '@/states/useToast' const Showcase = () => { const [page, setPage] = useState(1) const [cardList, setCardList] = useState>([]) + const [draggedCardList, setDraggedCardList] = useState([]) const { isPc } = useMedia() const { isLogin } = useAuthStore() const axiosWithAuth = useAxiosWithAuth() const { data, isLoading, error } = useSWR>( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase?page=${page}&pageSize=10`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase?page=${page}&pageSize=10`, isLogin ? (url: string) => axiosWithAuth.get(url).then((res) => res.data) : defaultGetFetcher, ) + const { openToast } = useToast() + useEffect(() => { if (!isLoading && data?.content) { setCardList((prev) => { @@ -32,18 +36,49 @@ const Showcase = () => { return newArray }) } - if (data) console.log('data', data?.content) }, [isLoading, data?.content]) const removeCard = (recruit_id: number) => { - setCardList((prev: ICardData[]) => { - return prev.filter((card) => card.id !== recruit_id) - }) + if (cardList.length > 1) { + setDraggedCardList((prev: ICardData[]) => { + prev.push(cardList[cardList.length - 1]) + return prev + }) + draggedCardList[draggedCardList.length - 1].hasBeenRemoved = true + setCardList((prev: ICardData[]) => { + return prev.filter((card) => card.id !== recruit_id) + }) + } else if (cardList.length === 1) { + openToast({ + message: '넘길 수 있는 마지막 카드에요.', + severity: 'info', + }) + } if (cardList.length === 2) { setPage((prev) => (!data?.last ? prev + 1 : prev)) } } + const addCard = () => { + if (draggedCardList.length === 0) { + openToast({ + message: '되돌아 갈 수 있는 마지막 카드예요.', + severity: 'info', + }) + return + } + setCardList((prev: ICardData[]) => { + prev.push(draggedCardList[draggedCardList.length - 1]) + if (cardList.length > 1) prev[prev.length - 2].hasBeenRemoved = false + return prev + }) + setDraggedCardList((prev: ICardData[]) => { + return prev.filter( + (card) => card.id !== draggedCardList[draggedCardList.length - 1].id, + ) + }) + } + let message: string = '' if (!isLoading && !cardList.length) message = '쇼케이스 끝!' @@ -67,6 +102,7 @@ const Showcase = () => { cardList={cardList} removeCard={removeCard} message={message} + addCard={addCard} /> ) } diff --git a/src/app/showcase/panel/CardContainer.tsx b/src/app/showcase/panel/CardContainer.tsx index 2f543d3ed..469750cbc 100644 --- a/src/app/showcase/panel/CardContainer.tsx +++ b/src/app/showcase/panel/CardContainer.tsx @@ -6,20 +6,23 @@ import * as cardStyle from './ShowcaseCard.style' import * as containerStyle from './CardContainer.style' import CardStack from './CardStack' import { ICardData } from '@/app/showcase/panel/types' +import { BetaIcon } from '@/components/BetaBadge' const CardContainer = ({ cardList, removeCard, message, + addCard, }: { cardList: Array removeCard: (recruit_id: number) => void message: string + addCard?: () => void }) => { const { isPc } = useMedia() return ( 쇼케이스 + {!message ? ( - + ) : ( {message} )} diff --git a/src/app/showcase/panel/CardStack.tsx b/src/app/showcase/panel/CardStack.tsx index 2853231e9..4e85477e9 100644 --- a/src/app/showcase/panel/CardStack.tsx +++ b/src/app/showcase/panel/CardStack.tsx @@ -18,39 +18,33 @@ enum ESwipeDirection { const CardStack = ({ cardList, removeCard, + addCard, }: { cardList: Array removeCard: (recruit_id: number) => void + addCard?: () => void }) => { const [dragged, setDragged] = useState(false) const { isPc } = useMedia() const checkDragDirection = (x: number, y: number) => { - if (Math.abs(x) > Math.abs(y)) { - return x < 0 ? ESwipeDirection.left : ESwipeDirection.right - } else { - return y < 0 ? ESwipeDirection.up : ESwipeDirection.down - } + return y < 0 ? ESwipeDirection.up : ESwipeDirection.down } - const handleDragEnd = ( - e: any, - info: any, - recruit_id: number, - title: string, - ) => { + const handleDragEnd = (e: any, info: any, recruit_id: number) => { // 위로 조금만 움직였을 때 카드가 사라지지 않도록 처리 if ( - Math.abs(info.offset.y) < 150 || + Math.abs(info.offset.y) < 100 || checkDragDirection(info.offset.x, info.offset.y) !== ESwipeDirection.up ) { setDragged(false) - + if (addCard) { + addCard() + } return } removeCard(recruit_id) // TODO: backend api 연결 시 콘솔 삭제 및 api 호출 - console.log(`dislike api 호출 pathValue: ${recruit_id}, title: ${title}`) setDragged(false) } @@ -100,25 +94,29 @@ const CardStack = ({ initial={{ scale: 0.8, opacity: 0, + ...(card.hasBeenRemoved && { + y: -500, + }), }} animate={{ scale: i === cardList.length - 1 ? 1 : 0.8, opacity: i === cardList.length - 1 ? 1 : 0, + y: 0, }} - exit={{ opacity: 0 }} + exit={{ opacity: 0, y: -500 }} drag dragSnapToOrigin - whileDrag={{ scale: 1.2 }} - dragElastic={1} + dragElastic={0.5} dragConstraints={{ - left: 0, + top: 0, right: 0, + left: 0, bottom: 0, }} - dragTransition={{ bounceStiffness: 300, bounceDamping: 50 }} + dragTransition={{ bounceStiffness: 250, bounceDamping: 50 }} onDragStart={() => setDragged(true)} onDragEnd={(e: any, info: any) => - handleDragEnd(e, info, card.id, card.name) + handleDragEnd(e, info, card.id) } transition={{ duration: 0.3 }} > diff --git a/src/app/showcase/panel/Interest.tsx b/src/app/showcase/panel/Interest.tsx index afc9e4fae..f1a82b93e 100644 --- a/src/app/showcase/panel/Interest.tsx +++ b/src/app/showcase/panel/Interest.tsx @@ -3,11 +3,13 @@ import React, { useEffect, useState } from 'react' import useAxiosWithAuth from '@/api/config' import Favorite from '@mui/icons-material/Favorite' import { motion, useAnimationControls } from 'framer-motion' +import useToast from '@/states/useToast' const Interest = ({ id }: { id?: number }) => { const [favorite, setFavorite] = useState(false) const axiosInstance = useAxiosWithAuth() const control = useAnimationControls() + const { openToast } = useToast() const variants = { favorite: { @@ -22,7 +24,7 @@ const Interest = ({ id }: { id?: number }) => { if (!id) return try { await axiosInstance.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/favorite/${id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorite/${id}`, ) setFavorite((prev) => { if (!prev) control.start(variants.favorite) @@ -30,7 +32,10 @@ const Interest = ({ id }: { id?: number }) => { return !prev }) } catch (e) { - console.log('error', e) + openToast({ + severity: 'error', + message: '관심 등록에 실패했습니다.', + }) // TODO: error handling } } diff --git a/src/app/showcase/panel/PhoneFrame.tsx b/src/app/showcase/panel/PhoneFrame.tsx index 08944dbb0..9164633ad 100644 --- a/src/app/showcase/panel/PhoneFrame.tsx +++ b/src/app/showcase/panel/PhoneFrame.tsx @@ -1,9 +1,57 @@ -import { Box, Card, Stack } from '@mui/material' +import { Box, Stack } from '@mui/material' import Image from 'next/image' const PhoneFrame = ({ imageUrl }: { imageUrl: string | undefined }) => { return ( - + + + {imageUrl != undefined ? ( + + ) : ( + + logo + + )} + + + ) +} + +/** { src={imageUrl} sx={{ width: '22.5rem', - height: '50rem', + height: '40rem', + objectFit: 'contain', }} /> ) : ( @@ -58,8 +107,6 @@ const PhoneFrame = ({ imageUrl }: { imageUrl: string | undefined }) => { )} - - ) -} + */ export default PhoneFrame diff --git a/src/app/showcase/panel/PostCard.tsx b/src/app/showcase/panel/PostCard.tsx index e7a717833..26cbf9278 100644 --- a/src/app/showcase/panel/PostCard.tsx +++ b/src/app/showcase/panel/PostCard.tsx @@ -1,7 +1,6 @@ import { Box, Card, - CardActionArea, CardContent, CardHeader, CardMedia, @@ -56,11 +55,10 @@ function PostCard({ const clickFavorite = useCallback(() => { axiosWithAuth .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/favorite/${postId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/favorite/${postId}`, ) .then((res) => { if (res.status === 200) { - console.log(res) setFavorite(!favorite) } }) @@ -68,10 +66,9 @@ function PostCard({ const clickLike = useCallback(() => { axiosWithAuth - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/like/${postId}`) + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/like/${postId}`) .then((res) => { if (res.status === 200) { - console.log(res) if (liked === false) { setIsLiked(true) setLikeNum(likeNum + 1) @@ -92,7 +89,7 @@ function PostCard({ backfaceVisibility: 'hidden', }} ref={ref} - // onClick={onClick} + onClick={onClick} > - - - - - {title} - - - - - {tagList?.map(({ name, color }: IShowcaseTag, idx: number) => { - return ( - {name}} - size="small" - key={idx} - style={{ - backgroundColor: alpha(color, 0.3), - borderRadius: 2, - height: '1.25rem', - }} - /> - ) - })} - - - - + + + + + {title} + + + + + {tagList?.map(({ name, color }: IShowcaseTag, idx: number) => { + return ( + {name}} + size="small" + key={idx} + style={{ + backgroundColor: alpha(color, 0.3), + borderRadius: 2, + height: '1.25rem', + }} + /> + ) + })} + + + ) diff --git a/src/app/showcase/panel/ShowcaseCard.tsx b/src/app/showcase/panel/ShowcaseCard.tsx index 96cf18a8c..4ee85f68c 100644 --- a/src/app/showcase/panel/ShowcaseCard.tsx +++ b/src/app/showcase/panel/ShowcaseCard.tsx @@ -32,7 +32,6 @@ const ShowcaseCardBack = ({ title, name, image, - currentDomain, }: { postId: number sx?: SxProps @@ -47,6 +46,12 @@ const ShowcaseCardBack = ({ }) => { const router = useRouter() const { isPc } = useMedia() + const [currentPageUrl, setCurrentPageUrl] = useState('') + + //window is not defined 에러 방지 + useEffect(() => { + setCurrentPageUrl(window.location.href) + }, []) const getLineCount = (originHeight: number, lineHeight: number) => { const lineCount = Math.floor((cardWidth * originHeight) / 328 / lineHeight) @@ -97,10 +102,11 @@ const ShowcaseCardBack = ({ - {/* TODO : 모집글 작성자 아이디 가져올 수 있는 방법 찾기 */} + @@ -247,7 +253,7 @@ const ShowcaseCard = ({ > { const axiosWithAuth = useAxiosWithAuth() const [image, setImage] = useState([]) - const [previewImage, setPreviewImage] = useState( - data.image ?? '/images/defaultImage.png', - ) + const [previewImage, setPreviewImage] = useState(data.image || '') const { openToast } = useToast() const { isOpen: alertOpen, closeModal, openModal } = useModal() - const { links, addLink, isValid, setIsValid, changeLinkName, changeUrl } = - useLinks(data.links ? data.links : []) + const { links, addLink, deleteLink, changeLinkName, changeUrl } = useLinks( + data.links ? data.links : [], + ) const router = useRouter() const { isPc } = useMedia() const editorRef = useRef(null) + const validateUrl = (links: ILinkInformation[]) => { + const regex = + /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%.+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%+.~#?&//=]*)/ + + const validationResult = links.map((obj: ILinkInformation) => { + return regex.test(obj.link) + }) + const isInvalid = validationResult.some((result: any) => result === false) + return isInvalid + } + + const postHandler = async (linksWithoutId: any) => { + await axiosWithAuth.post( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/write`, + { + content: editorRef.current?.getMarkdown() ?? '', + teamId: teamId, + links: linksWithoutId, + image: image.length ? previewImage.split(',')[1] : null, + }, + ) + } + const putHandler = async (linksWithoutId: any) => { + await axiosWithAuth.put( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/edit/${showcaseId}`, + { + image: image.length ? previewImage.split(',')[1] : null, + content: editorRef.current?.getMarkdown() ?? '', + links: linksWithoutId, + }, + ) + } + + const errorsHandler = (error: any) => { + if (error.response) { + switch (error.response.status) { + case 400: + openToast({ + severity: 'error', + message: '요청이 올바르지 않습니다.', + }) + + break + case 403: + openToast({ + severity: 'error', + message: '접근이 거부되었습니다.', + }) + break + case 404: + openToast({ + severity: 'error', + message: '페이지를 찾을 수 없습니다.', + }) + break + case 409: + openToast({ + severity: 'error', + message: '이미 쇼케이스가 존재합니다.', + }) + break + default: + openToast({ + severity: 'error', + message: '알 수 없는 에러가 발생했습니다.', + }) + break + } + } else if (error.request) { + openToast({ + severity: 'error', + message: '서버에서 응답이 없습니다.', + }) + } else { + openToast({ + severity: 'error', + message: '요청을 설정하는 중에 에러가 발생했습니다.', + }) + } + } + const submitHandler = async () => { const linksWithoutId = links.map(({ ...rest }) => rest) - if (!isValid) { + if (validateUrl(linksWithoutId)) { + closeModal() + openToast({ + severity: 'error', + message: '유효하지 않는 URL이 포함되어 있습니다.', + }) return } try { if (requestMethodType === 'post') { - await axiosWithAuth.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/write`, - { - image: previewImage.split(',')[1], - content: editorRef.current?.getMarkdown() ?? '', - teamId: teamId, - links: linksWithoutId, - }, - ) + await postHandler(linksWithoutId) router.push(`/teams/${teamId}/showcase`) } else if (requestMethodType === 'put') { - await axiosWithAuth.put( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/edit/${showcaseId}`, - { - image: image.length ? previewImage.split(',')[1] : null, - content: editorRef.current?.getMarkdown() ?? '', - links: linksWithoutId, - }, - ) + await putHandler(linksWithoutId) router.push(`/showcase/detail/${showcaseId}`) } } catch (error: any) { closeModal() - if (error.response) { - switch (error.response.status) { - case 400: - openToast({ - severity: 'error', - message: '요청이 올바르지 않습니다.', - }) - - break - case 403: - openToast({ - severity: 'error', - message: '접근이 거부되었습니다.', - }) - break - case 404: - openToast({ - severity: 'error', - message: '페이지를 찾을 수 없습니다.', - }) - break - case 409: - openToast({ - severity: 'error', - message: '이미 쇼케이스가 존재합니다.', - }) - break - default: - openToast({ - severity: 'error', - message: '알 수 없는 에러가 발생했습니다.', - }) - break - } - } else if (error.request) { - openToast({ - severity: 'error', - message: '서버에서 응답이 없습니다.', - }) - } else { - openToast({ - severity: 'error', - message: '요청을 설정하는 중에 에러가 발생했습니다.', - }) - } + errorsHandler(error) } } @@ -168,19 +194,19 @@ const ShowcaseEditor = ({ - {/* */} - + + + - + - + diff --git a/src/app/showcase/panel/ShowcasePc/ShowcasePcView.tsx b/src/app/showcase/panel/ShowcasePc/ShowcasePcView.tsx index 3d2396494..c5b0c8542 100644 --- a/src/app/showcase/panel/ShowcasePc/ShowcasePcView.tsx +++ b/src/app/showcase/panel/ShowcasePc/ShowcasePcView.tsx @@ -1,14 +1,12 @@ 'use client' import { - Avatar, Button, Card, CardActions, CardContent, IconButton, Menu, - MenuItem, Stack, Typography, } from '@mui/material' @@ -22,6 +20,9 @@ import TagChip from '@/components/TagChip' import { useRouter } from 'next/navigation' import NoDataDolphin from '@/components/NoDataDolphin' import DynamicToastViewer from '@/components/DynamicToastViewer' +import ShareMenuItem from '@/components/dropdownMenu/ShareMenuItem' +import ReportMenuItem from '@/components/dropdownMenu/ReportMenuItem' +import CuAvatar from '@/components/CuAvatar' function leftPad(value: number) { if (value >= 10) { @@ -63,7 +64,7 @@ const ShowcasePcView = ({ data }: { data: ICardData | undefined }) => { if (!data) return alert('로그인이 필요합니다.') axiosWithAuth .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/like/${data.id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/like/${data.id}`, ) .then((res) => { if (res.status === 200) { @@ -84,7 +85,7 @@ const ShowcasePcView = ({ data }: { data: ICardData | undefined }) => { if (!data) return alert('로그인이 필요합니다.') axiosWithAuth .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/favorite/${data.id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/favorite/${data.id}`, ) .then((res) => { if (res.status === 200) { @@ -114,11 +115,12 @@ const ShowcasePcView = ({ data }: { data: ICardData | undefined }) => { height: '37rem', backgroundColor: 'background.tertiary', width: '30rem', + py: '1rem', }} > {data !== undefined ? ( - + { justifyContent={'space-between'} > - @@ -177,8 +179,13 @@ const ShowcasePcView = ({ data }: { data: ICardData | undefined }) => { onClose={handleMenuClose} anchorEl={anchorEl} > - 공유 - 신고 + + +
@@ -206,6 +213,7 @@ const ShowcasePcView = ({ data }: { data: ICardData | undefined }) => { width: '100%', wordBreak: 'break-word', height: '20rem', + boxSizing: 'border-box', }} />
@@ -250,7 +258,7 @@ const ShowcasePcView = ({ data }: { data: ICardData | undefined }) => { - 기술스택 + 관련 태그 {data.skill.map((skill, index) => ( diff --git a/src/app/showcase/panel/common/ImageInput.tsx b/src/app/showcase/panel/common/ImageInput.tsx index fdb79eac4..df1e80ae4 100644 --- a/src/app/showcase/panel/common/ImageInput.tsx +++ b/src/app/showcase/panel/common/ImageInput.tsx @@ -1,5 +1,5 @@ 'use client' -import { Stack, Box, Typography } from '@mui/material' +import { Stack, Box, Button } from '@mui/material' import React from 'react' import LabelWithIcon from '../../../../components/LabelWithIcon' import ImageIcon from '@/icons/ImageIcon' @@ -23,41 +23,48 @@ const ImageInput = ({ svgIcon={} message={'쇼케이스 대표 이미지'} /> - { - setImage(image) - }} - setPreviewImage={setPreviewImage} - sx={Style.ShowcaseImageStyle} - > - {previewImage ? ( - 쇼케이스 대표 이미지 - ) : ( + + {previewImage && ( - - 클릭해서 이미지를 -
- 업로드하세요 -
+ 쇼케이스 대표 이미지
)} -
+ { + setImage(image) + }} + setPreviewImage={setPreviewImage} + sx={{ color: 'primary' }} + > + + + + +
) } diff --git a/src/app/showcase/panel/common/LinkForm.tsx b/src/app/showcase/panel/common/LinkForm.tsx index 8a05e3ef3..64e50a831 100644 --- a/src/app/showcase/panel/common/LinkForm.tsx +++ b/src/app/showcase/panel/common/LinkForm.tsx @@ -1,40 +1,27 @@ -import { IconButton, Stack, TextField, Typography } from '@mui/material' -import React, { useState } from 'react' +import { IconButton, Stack, TextField } from '@mui/material' +import React from 'react' import LabelWithIcon from '../../../../components/LabelWithIcon' import LinkIcon from '@/icons/LinkIcon' import * as Style from './SkillInput.style' import PlusIcon from '@/icons/PlusIcon' import { ILinkInformation } from '@/types/IShowcaseEdit' +import { TrashIcon } from '@/icons' interface ILinkFormProps { links: ILinkInformation[] - addLink: (linkName: string, linkUrl: string) => void - isValid: boolean - setIsValid: (isValid: boolean) => void - changeLinkName: (id: number, content: string) => void - changeUrl: (id: number, content: string) => void + addLink: (linkName: string, linkUrl: string, id: string) => void + deleteLink: (id: string) => void + changeLinkName: (id: string, content: string) => void + changeUrl: (id: string, content: string) => void } const LinkForm = ({ links, addLink, - // isValid, - setIsValid, + deleteLink, changeLinkName, changeUrl, }: ILinkFormProps) => { - const [checker, setChecker] = useState(true) - const validateUrl = ( - e: React.FocusEvent, - ) => { - const completedUrl = e.target.value - const regex = - // eslint-disable-next-line no-useless-escape - /(https?:\/\/)?(www\.)?[-a-zA-Z0-9@:%.\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%\+.~#?&//=]*)/ // eslint-disable-next-line no-useless-escape - setChecker(regex.test(completedUrl)) - setIsValid(checker) - } - return ( } - message={'링크'} + message={'링크모음'} /> { if (links.length >= 5) return - addLink('', '') + addLink('', '', crypto.randomUUID()) }} > @@ -59,7 +46,6 @@ const LinkForm = ({ {links.map((link, index) => ( changeUrl(link.id, e.target.value)} - onBlur={(e) => validateUrl(e)} /> + { + deleteLink(link.id) + }} + > + + ))} - {!checker && ( - - 유효하지 않는 URL이 포함되어 있습니다. - - )} ) } diff --git a/src/app/showcase/panel/common/LinksViewer.tsx b/src/app/showcase/panel/common/LinksViewer.tsx index e10d076b0..19852b1a2 100644 --- a/src/app/showcase/panel/common/LinksViewer.tsx +++ b/src/app/showcase/panel/common/LinksViewer.tsx @@ -5,9 +5,12 @@ import { TagIcon } from '@/icons' import * as Style from './SkillInput.style' interface IlinksProps { - links: string[] | undefined + links: ILink[] | undefined +} +interface ILink { + link: string + name: string } - const LinksViewer = ({ links }: IlinksProps) => { const convertLink = (link: string) => { const httpPattern = /^https?:\/\//i @@ -34,20 +37,19 @@ const LinksViewer = ({ links }: IlinksProps) => { /> - {links?.map((link: any) => { + {links?.map((link: ILink) => { return ( - <> - - {link.name} - - + + {link.name} + ) })} diff --git a/src/app/showcase/panel/common/SkillInput.tsx b/src/app/showcase/panel/common/SkillInput.tsx index 63f1f9132..8c2727003 100644 --- a/src/app/showcase/panel/common/SkillInput.tsx +++ b/src/app/showcase/panel/common/SkillInput.tsx @@ -15,7 +15,7 @@ const SkillInput = ({ skills }: ISkillProps) => { } - message="기술 스택" + message="관련 태그" color="text.alternative" /> diff --git a/src/app/showcase/panel/common/StartEndDateViewer.style.ts b/src/app/showcase/panel/common/StartEndDateViewer.style.ts index d4720c379..e25eb346f 100644 --- a/src/app/showcase/panel/common/StartEndDateViewer.style.ts +++ b/src/app/showcase/panel/common/StartEndDateViewer.style.ts @@ -1,9 +1,10 @@ export const StartEndDateViewerBox = (isPc?: boolean) => ({ - display: isPc ? 'flex' : 'none', - justifyContent: isPc ? 'space-between' : 'none', + display: 'flex', + justifyContent: 'space-between', alignItems: 'center', gap: '1rem', gridArea: 'startEndDateViewer', width: '100%', height: isPc ? '6.25rem' : '3.375rem', + paddingTop: isPc ? '0' : '1.25rem', }) diff --git a/src/app/showcase/panel/common/StartEndDateViewer.tsx b/src/app/showcase/panel/common/StartEndDateViewer.tsx index 4fdc80a92..d19d9250e 100644 --- a/src/app/showcase/panel/common/StartEndDateViewer.tsx +++ b/src/app/showcase/panel/common/StartEndDateViewer.tsx @@ -21,7 +21,7 @@ const StartEndDateViewer = ({ start, end }: Idate) => { message="시작일" color="text.alternative" /> - + {start.split('T')[0]} (모집글 게시일) @@ -31,7 +31,7 @@ const StartEndDateViewer = ({ start, end }: Idate) => { message="종료일" color="text.alternative" /> - + {end.split('T')[0]} (진행 완료일) diff --git a/src/app/showcase/panel/common/TeamMembers.tsx b/src/app/showcase/panel/common/TeamMembers.tsx index bf88197a8..bc05fb84b 100644 --- a/src/app/showcase/panel/common/TeamMembers.tsx +++ b/src/app/showcase/panel/common/TeamMembers.tsx @@ -5,6 +5,7 @@ import ListIcon from '@/icons/ListIcon' import * as Style from './SkillInput.style' import { IMember } from '@/types/IShowcaseEdit' import CuAvatar from '@/components/CuAvatar' +import OthersProfile from '@/app/panel/OthersProfile' const MemberInformation = ({ member }: { member: IMember }) => { return ( @@ -15,12 +16,33 @@ const MemberInformation = ({ member }: { member: IMember }) => { width={'auto'} height={'auto'} > - + {member.nickname ? ( + + + + ) : ( + + )} + - {member.nickname} + {/* /탈퇴한 유저의 경우 image = null, nickname = 탈퇴한 유저, role = null */} + {member.nickname ?? '탈퇴한 유저'} {member.isLeader && ( diff --git a/src/app/showcase/panel/types.ts b/src/app/showcase/panel/types.ts index 58aa8ceb0..e5f7360bc 100644 --- a/src/app/showcase/panel/types.ts +++ b/src/app/showcase/panel/types.ts @@ -16,4 +16,5 @@ export interface ICardData { teamLogo: string | null start: Date end: Date + hasBeenRemoved?: boolean } diff --git a/src/app/showcase/write/page.tsx b/src/app/showcase/write/page.tsx index 1b651f881..859f79054 100644 --- a/src/app/showcase/write/page.tsx +++ b/src/app/showcase/write/page.tsx @@ -8,6 +8,8 @@ import useAxiosWithAuth from '@/api/config' import useSWR from 'swr' import CuCircularProgress from '@/components/CuCircularProgress' import { useRouter, useSearchParams } from 'next/navigation' +import NoDataDolphin from '@/components/NoDataDolphin' +import Link from 'next/link' const ShowCaseWritePage = () => { const router = useRouter() @@ -16,7 +18,7 @@ const ShowCaseWritePage = () => { const axiosWithAuth = useAxiosWithAuth() const { data, isLoading, error } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/showcase/write/${teamId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/showcase/write/${teamId}`, (url: string) => axiosWithAuth.get(url).then((res) => res.data), { shouldRetryOnError: false }, ) @@ -25,7 +27,17 @@ const ShowCaseWritePage = () => { if (error) { if (error.response && error.response.status === 409) { return ( - {error.response.data.message} + + + 팀설정으로 돌아가기 + ) } return 에러가 발생했습니다. diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx index 450dc97af..0ce8bf372 100644 --- a/src/app/signup/page.tsx +++ b/src/app/signup/page.tsx @@ -20,7 +20,7 @@ import EncryptedSender from '@/components/EncryptedSender' import { EApiType } from '@/types/EApiType' const SignUp = () => { - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const router = useRouter() const searchParams = useSearchParams() const socialEmail = searchParams.get('social-email') @@ -119,7 +119,6 @@ const SignUp = () => { }) .catch((error) => { setEmailSendStatus('error') - console.log(error) if (error.response.data.message) { openToast({ severity: 'error', diff --git a/src/app/signup/panel/CodeField.tsx b/src/app/signup/panel/CodeField.tsx index 30b06c1c6..dbdadc2e1 100644 --- a/src/app/signup/panel/CodeField.tsx +++ b/src/app/signup/panel/CodeField.tsx @@ -30,6 +30,7 @@ const CodeField = ({ inputProps={{ maxLength: 10, }} + sx={{ width: '100%' }} InputProps={{ endAdornment: ( diff --git a/src/app/signup/panel/EmailField.tsx b/src/app/signup/panel/EmailField.tsx index a9716affb..e8ca8c3e3 100644 --- a/src/app/signup/panel/EmailField.tsx +++ b/src/app/signup/panel/EmailField.tsx @@ -33,6 +33,7 @@ const EmailField = ({ inputProps={{ maxLength: 30, }} + sx={{ width: '100%' }} InputProps={{ endAdornment: ( diff --git a/src/app/signup/panel/NameField.tsx b/src/app/signup/panel/NameField.tsx index 59a2cefec..11ce57e65 100644 --- a/src/app/signup/panel/NameField.tsx +++ b/src/app/signup/panel/NameField.tsx @@ -14,7 +14,9 @@ const NameField = ({ }) => { return ( <> - 이름 + + 이름 + {error?.message || '\u00A0'} diff --git a/src/app/signup/panel/NickNameField.tsx b/src/app/signup/panel/NickNameField.tsx index c17e2e87e..01f30fcd4 100644 --- a/src/app/signup/panel/NickNameField.tsx +++ b/src/app/signup/panel/NickNameField.tsx @@ -24,7 +24,9 @@ const NickNameField = ({ }) => { return ( <> - 닉네임 + + 닉네임 + { @@ -35,6 +37,7 @@ const NickNameField = ({ error={nickNameSendStatus === 'error'} type="text" placeholder="닉네임을 입력하세요." + sx={{ width: '100%' }} inputProps={{ minLength: 2, maxLength: 30, diff --git a/src/app/signup/panel/PasswordField.tsx b/src/app/signup/panel/PasswordField.tsx index a20298a43..b317f3c93 100644 --- a/src/app/signup/panel/PasswordField.tsx +++ b/src/app/signup/panel/PasswordField.tsx @@ -50,6 +50,7 @@ const PasswordField = ({ pattern: '[A-Za-z0-9!@#$%^&*]*', type: showPassword, }} + sx={{ width: '100%' }} onFocus={() => { setShowValidating(true) }} @@ -60,7 +61,11 @@ const PasswordField = ({ showPassword={showPassword} setShowPassword={setShowPassword} /> - + diff --git a/src/app/team-list/layout.tsx b/src/app/team-list/layout.tsx index c270f0dd7..d0801934f 100644 --- a/src/app/team-list/layout.tsx +++ b/src/app/team-list/layout.tsx @@ -1,12 +1,17 @@ 'use client' -import useMedia from '@/hook/useMedia' -import { Stack } from '@mui/material' +import { Container, Stack, Box, Typography } from '@mui/material' import { ReactNode, useEffect } from 'react' +import ForceTutorial from '@/components/ForceTutorial' +import { TeamListTutorial } from '@/components/tutorialContent/TeamListTutorial' +import useShowTeams from '@/states/useShowTeams' +import { TeamStatus } from '@/app/teams/types/types' + import Sidebar from './panel/Sidebar' +import * as style from '@/components/NavBarLayout.style' const TeamsLayout = ({ children }: { children: ReactNode }) => { - const { isPc, isTablet } = useMedia() + const { showTeams } = useShowTeams() useEffect(() => { let vh = window.innerHeight * 0.01 @@ -14,22 +19,35 @@ const TeamsLayout = ({ children }: { children: ReactNode }) => { }, []) return ( - + - {children} + + + + {showTeams === TeamStatus.RECRUITING + ? '모집 중' + : showTeams === TeamStatus.COMPLETE + ? '진행 완료' + : showTeams === TeamStatus.ONGOING + ? '진행 중' + : '모집 완료'} + + } + /> + + + {children} + + - + ) } diff --git a/src/app/team-list/page.tsx b/src/app/team-list/page.tsx index cc0e5bf2d..2ff52a287 100644 --- a/src/app/team-list/page.tsx +++ b/src/app/team-list/page.tsx @@ -29,7 +29,7 @@ const TeamsListPage = () => { const { showTeams } = useShowTeams() const axiosInstance = useAxiosWithAuth() const { data, isLoading } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/list?teamStatus=${showTeams}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/list?teamStatus=${showTeams}`, (url: string) => axiosInstance(url).then((res) => res.data), ) diff --git a/src/app/team-list/panel/Sidebar.tsx b/src/app/team-list/panel/Sidebar.tsx index d4bf4a875..6e447cb31 100644 --- a/src/app/team-list/panel/Sidebar.tsx +++ b/src/app/team-list/panel/Sidebar.tsx @@ -1,15 +1,12 @@ 'use client' import { TeamStatus } from '@/app/teams/types/types' -import useMedia from '@/hook/useMedia' +import { Box } from '@mui/material' +import CuNavBar from '@/components/CuNavBar' import useShowTeams from '@/states/useShowTeams' -import { - ToggleButtonGroup, - ToggleButton, - Typography, - Stack, -} from '@mui/material' import { useEffect, useState } from 'react' +import useMedia from '@/hook/useMedia' +import * as style from '@/components/NavBarBox.style' const Sidebar = () => { const { isPc } = useMedia() @@ -19,155 +16,65 @@ const Sidebar = () => { const handleChange = (event: any, newAlignment: any) => { setAlignment(newAlignment) } - const onClickGather = () => setShowTeams(TeamStatus.RECRUITING) - const onClickBefore = () => setShowTeams(TeamStatus.BEFORE) - const onClickProgress = () => setShowTeams(TeamStatus.ONGOING) - const onClickComplete = () => setShowTeams(TeamStatus.COMPLETE) + const onClickGather = () => { + handleChange(null, TeamStatus.RECRUITING) + setShowTeams(TeamStatus.RECRUITING) + } + const onClickBefore = () => { + handleChange(null, TeamStatus.BEFORE) + setShowTeams(TeamStatus.BEFORE) + } + const onClickProgress = () => { + handleChange(null, TeamStatus.ONGOING) + setShowTeams(TeamStatus.ONGOING) + } + const onClickComplete = () => { + handleChange(null, TeamStatus.COMPLETE) + setShowTeams(TeamStatus.COMPLETE) + } + useEffect(() => { + setShowTeams(alignment) + }, [alignment, setShowTeams]) useEffect(() => { setShowTeams(alignment) }, [setShowTeams]) - return ( - <> - - - 나의 팀리스트 - - {isPc ? ( - - - 모집 중 - - - - 모집 완료 - - - - 진행 중 - - - - 진행 완료 - - - ) : ( - - - 모집 중 - + const getTabValue = () => alignment - - 시작 전 - - - - 진행 중 - - - - 진행 완료 - - - )} - - + return ( + + , + }, + { + label: '모집 완료', + value: TeamStatus.BEFORE, + onClick: onClickBefore, + icon: <>, + }, + { + label: '진행 중', + value: TeamStatus.ONGOING, + onClick: onClickProgress, + icon: <>, + }, + { + label: '진행 완료', + value: TeamStatus.COMPLETE, + onClick: onClickComplete, + icon: <>, + }, + ]} + /> + ) } diff --git a/src/app/team-list/panel/TeamCard.tsx b/src/app/team-list/panel/TeamCard.tsx index 824a298b5..4a4b51296 100644 --- a/src/app/team-list/panel/TeamCard.tsx +++ b/src/app/team-list/panel/TeamCard.tsx @@ -1,18 +1,26 @@ import { Box, Card, CardActionArea, Stack, Typography } from '@mui/material' import { ITeamInfo } from '../page' import { useRouter } from 'next/navigation' -import { TeamOperationForm } from '@/app/teams/types/types' +import { TeamOperationForm, TeamStatus } from '@/app/teams/types/types' import useMedia from '@/hook/useMedia' import { GeoIcon, TargetIcon, WifiIcon } from './Icons' const TeamType = (type: string) => { return ( - + {type === 'STUDY' ? '스터디' : '프로젝트'} @@ -30,10 +38,17 @@ const ApproveChip = ({ const isLeader = job === 'L' ? 'LEADER' : 'MEMBER' return ( theme.palette.purple.main + : (theme) => theme.palette.pink.main, + borderRadius: '0.25rem', + padding: '0.25rem 0.5rem', + height: 'fit-content', + alignItems: 'center', }} > @@ -43,10 +58,28 @@ const ApproveChip = ({ ) } -const TeamCard = ({ team }: { team: ITeamInfo }) => { +interface ITeamCard { + team: ITeamInfo +} + +const TeamCard = ({ team }: ITeamCard) => { const { isPc } = useMedia() const router = useRouter() + if (team.isApproved === false && team.status !== TeamStatus.RECRUITING) { + return <> + } + + const handleTeam = () => { + if (!team.isApproved) return + router.push(`/teams/${team.id}`) + } + + const handleRecruit = () => { + if (team.isApproved) return + router.push(`/recruit/${team.id}?type=${team.type}`) + } + return ( { boxShadow: 'none', borderRadius: '1.5rem', backgroundColor: 'background.secondary', + backgroundImage: 'none', }} > router.push(`/teams/${team.id}`)} + onClick={team.isApproved ? handleTeam : handleRecruit} > { my={'0.5rem'} justifyContent={'space-between'} > - + {TeamType(team.type)} {team.name} diff --git a/src/app/team-list/panel/TeamsList.tsx b/src/app/team-list/panel/TeamsList.tsx index c4a0781ba..96ccc90dd 100644 --- a/src/app/team-list/panel/TeamsList.tsx +++ b/src/app/team-list/panel/TeamsList.tsx @@ -1,33 +1,21 @@ -import { Stack, Typography } from '@mui/material' +import { Stack } from '@mui/material' import { ITeamInfo } from '../page' import { TeamStatus } from '@/app/teams/types/types' //icons -import useShowTeams from '@/states/useShowTeams' + import TeamCard from './TeamCard' import NoDataDolphin from '@/components/NoDataDolphin' const TeamsList = ({ prop }: { prop: ITeamInfo[] }) => { - const { showTeams } = useShowTeams() - return ( - - - {showTeams === TeamStatus.RECRUITING - ? '모집 중' - : showTeams === TeamStatus.COMPLETE - ? '진행 완료' - : showTeams === TeamStatus.ONGOING - ? '진행 중' - : '모집 완료'} - - { maxHeight={'55vh'} flex={'2rem'} > - {prop.length ? ( - prop.map((team, index) => ) + {prop.length && + prop.filter( + (team) => + team.isApproved === true || team.status === TeamStatus.RECRUITING, + ).length !== 0 ? ( + prop + .filter( + (team) => + team.isApproved === true || + team.status === TeamStatus.RECRUITING, + ) + .map((team, index) => ( + + )) ) : ( )} diff --git a/src/app/teams/[id]/board/@list/page.tsx b/src/app/teams/[id]/board/@list/page.tsx index c37c6acf3..54226f30a 100644 --- a/src/app/teams/[id]/board/@list/page.tsx +++ b/src/app/teams/[id]/board/@list/page.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react' import { AxiosResponse, isAxiosError } from 'axios' import { useRouter } from 'next/navigation' -import { Box, Stack } from '@mui/material' +import { Box, Stack, Typography } from '@mui/material' import useAxiosWithAuth from '@/api/config' import { ListPageContainer, @@ -34,9 +34,9 @@ const TeamBoard = ({ params }: { params: { id: string } }) => { `/api/v1/team-page/simple/${teamId}`, ) setBoardList(res.data) - if (!res.data || res.data.length == 0) - throw new Error('팀 페이지가 존재하지 않습니다.') - setBoard('LIST', res.data[0].boardId) + if (!res.data) throw new Error('팀 페이지가 존재하지 않습니다.') + if (res.data.length === 0) setBoard('LIST', undefined) + else setBoard('LIST', res.data[0].boardId) } catch (err: unknown) { if (isAxiosError(err) && err.response?.status === 403) { alert('팀 페이지에 접근할 권한이 없습니다.') @@ -52,7 +52,7 @@ const TeamBoard = ({ params }: { params: { id: string } }) => { return ( - {boardList && boardList.length > 0 && boardId && ( + {boardList && ( <> { /> - - - - } /> - - - { - setBoard('EDIT', boardId) - }} - /> - { - setBoard('EDIT', boardId) - }} - /> - - - + {boardList.length > 0 && boardId ? ( + <> + + + + } + /> + + + { + setBoard('EDIT', boardId) + }} + /> + { + setBoard('EDIT', boardId) + }} + /> + + + + + ) : ( + + 게시판이 존재하지 않습니다. 게시판 관리에서 게시판을 + 생성해보세요! (PC에서만 가능) + + )} )} diff --git a/src/app/teams/[id]/board/@setting/page.style.ts b/src/app/teams/[id]/board/@setting/page.style.ts index 85ee441cd..aecd0cb0c 100644 --- a/src/app/teams/[id]/board/@setting/page.style.ts +++ b/src/app/teams/[id]/board/@setting/page.style.ts @@ -11,4 +11,5 @@ export const mobilePage = { export const inputContainer = { background: (theme: Theme) => theme.palette.background.tertiary, padding: '0rem 0.75rem', + alignItems: 'center', } diff --git a/src/app/teams/[id]/board/@setting/page.tsx b/src/app/teams/[id]/board/@setting/page.tsx index ba224d899..5a245db4c 100644 --- a/src/app/teams/[id]/board/@setting/page.tsx +++ b/src/app/teams/[id]/board/@setting/page.tsx @@ -1,13 +1,15 @@ 'use client' import { useRef } from 'react' import { isAxiosError } from 'axios' -import useSWR from 'swr' +import useSWR, { useSWRConfig } from 'swr' import { Stack, TextField, Typography } from '@mui/material' import useAxiosWithAuth from '@/api/config' import BackgroundBox from '@/components/BackgroundBox' import CuButton from '@/components/CuButton' +import CuCircularProgress from '@/components/CuCircularProgress' import useMedia from '@/hook/useMedia' import useToast from '@/states/useToast' +import useTeamPageState from '@/states/useTeamPageState' import { ITeamBoard } from '@/types/TeamBoardTypes' import BoardItem from './panel/BoardItem' import * as style from './page.style' @@ -42,6 +44,8 @@ const TeamBoardSetting = ({ params }: { params: { id: string } }) => { const { isPc } = useMedia() const axiosWithAuth = useAxiosWithAuth() const { openToast } = useToast() + const { resetState } = useTeamPageState() + const { mutate } = useSWRConfig() const { data, isLoading, error } = useSWR( `/api/v1/team-page/simple/${teamId}`, @@ -70,6 +74,7 @@ const TeamBoardSetting = ({ params }: { params: { id: string } }) => { severity: 'success', message: '게시판을 추가했습니다.', }) + mutate(`/api/v1/team-page/simple/${teamId}`) }) .catch((e: unknown) => { if (isAxiosError(e)) { @@ -78,16 +83,42 @@ const TeamBoardSetting = ({ params }: { params: { id: string } }) => { severity: 'error', message: '이미 존재하는 게시판 이름입니다.', }) - return + } else if (e.response?.status === 403) { + openToast({ + severity: 'error', + message: '게시판 추가는 팀 리더만 가능합니다.', + }) + } else { + openToast({ + severity: 'error', + message: '게시판을 추가하지 못했습니다.', + }) } + } else { + openToast({ + severity: 'error', + message: '게시판을 추가하지 못했습니다.', + }) } - openToast({ - severity: 'error', - message: '게시판을 추가하지 못했습니다.', - }) }) } + if (error) { + if (isAxiosError(error) && error.response?.status === 403) { + alert('게시판 관리는 팀 리더만 가능합니다') + } else { + alert('게시판 목록을 불러오지 못했습니다.') + } + resetState() + return null + } + + if (!isLoading && !data) { + alert('게시판 목록을 불러오지 못했습니다.') + resetState() + return null + } + // 모바일에서는 게시판 관리가 불가능합니다. if (!isPc) return ( @@ -97,42 +128,69 @@ const TeamBoardSetting = ({ params }: { params: { id: string } }) => { ) - // TODO : 좀 더 구체적인 에러처리 - if (!data || isLoading || error) return null return ( - - - - - - - - - - - {data.map((board: ITeamBoard) => ( - - ))} + + + + {isLoading ? ( + + ) : ( + + + + + + + + + + {data?.map((board: ITeamBoard) => ( + + ))} + + - - - + )} + + ) } diff --git a/src/app/teams/[id]/board/@setting/panel/BoardItem.tsx b/src/app/teams/[id]/board/@setting/panel/BoardItem.tsx index d04414fb4..06eb0d4ae 100644 --- a/src/app/teams/[id]/board/@setting/panel/BoardItem.tsx +++ b/src/app/teams/[id]/board/@setting/panel/BoardItem.tsx @@ -1,3 +1,5 @@ +import { useSWRConfig } from 'swr' +import { isAxiosError } from 'axios' import useAxiosWithAuth from '@/api/config' import { ITeamBoard } from '@/types/TeamBoardTypes' import { IconButton, Stack, Typography } from '@mui/material' @@ -6,21 +8,47 @@ import useModal from '@/hook/useModal' import useToast from '@/states/useToast' import CuTextModal from '@/components/CuTextModal' -const BoardItem = ({ board }: { board: ITeamBoard }) => { +const BoardItem = ({ + board, + teamId, +}: { + board: ITeamBoard + teamId: string +}) => { const axiosWithAuth = useAxiosWithAuth() const { isOpen, closeModal, openModal } = useModal() const { openToast } = useToast() + const { mutate } = useSWRConfig() + const handleDeleteBoard = (boardId: number) => { axiosWithAuth .delete(`/api/v1/team/board/${boardId}`) .then(() => { - alert('게시판을 삭제했습니다.') - }) - .catch(() => { openToast({ - severity: 'error', - message: '게시판을 삭제하지 못했습니다.', + severity: 'success', + message: '게시판을 삭제했습니다.', }) + mutate(`/api/v1/team-page/simple/${teamId}`) + }) + .catch((e: unknown) => { + if (isAxiosError(e)) { + if (e.response?.status === 403) { + openToast({ + severity: 'error', + message: '게시판 추가는 팀 리더만 가능합니다.', + }) + } else { + openToast({ + severity: 'error', + message: '게시판을 추가하지 못했습니다.', + }) + } + } else { + openToast({ + severity: 'error', + message: '게시판을 추가하지 못했습니다.', + }) + } }) } return ( diff --git a/src/app/teams/[id]/board/layout.tsx b/src/app/teams/[id]/board/layout.tsx index deebe7215..618a2de29 100644 --- a/src/app/teams/[id]/board/layout.tsx +++ b/src/app/teams/[id]/board/layout.tsx @@ -1,5 +1,5 @@ 'use client' -import { ReactNode, useEffect } from 'react' +import { ReactNode } from 'react' import useTeamPageState from '@/states/useTeamPageState' interface ITeamLayoutProps { @@ -10,12 +10,7 @@ interface ITeamLayoutProps { } const TeamBoardMain = ({ list, detail, edit, setting }: ITeamLayoutProps) => { - const { boardType, resetState } = useTeamPageState() - useEffect(() => { - return () => { - resetState() - } - }, []) + const { boardType } = useTeamPageState() if (boardType === 'EDIT') { return edit } diff --git a/src/app/teams/[id]/layout.tsx b/src/app/teams/[id]/layout.tsx index 17095ff41..62bc17871 100644 --- a/src/app/teams/[id]/layout.tsx +++ b/src/app/teams/[id]/layout.tsx @@ -1,10 +1,11 @@ 'use client' import { ReactNode, useEffect } from 'react' -import { Stack } from '@mui/material' +import { Stack, Container, Box, useMediaQuery } from '@mui/material' import useTeamPageState from '@/states/useTeamPageState' -import useMedia from '@/hook/useMedia' import TeamSidebar from './panel/NavBar' +import * as style from '@/components/NavBarLayout.style' +import useMedia from '@/hook/useMedia' const TeamLayout = ({ params, @@ -13,40 +14,46 @@ const TeamLayout = ({ params: { id: string } children: ReactNode }) => { - const { isPc } = useMedia() const { layout, resetState } = useTeamPageState() const id = params.id useEffect(() => { + resetState() return () => { resetState() } }, []) + const isFourRow = useMediaQuery('(min-width:997px)') + const { isPc } = useMedia() + + if (layout === 'FULLPAGE') { + return ( + + {children} + + ) + } + return ( - + - {layout === 'SIDEBAR' && ( - - - - )} - + {children} - + - + ) } diff --git a/src/app/teams/[id]/notice/@edit/panel/NoticeEditForm.tsx b/src/app/teams/[id]/notice/@edit/panel/NoticeEditForm.tsx index ef9cbc0ae..d23d2a561 100644 --- a/src/app/teams/[id]/notice/@edit/panel/NoticeEditForm.tsx +++ b/src/app/teams/[id]/notice/@edit/panel/NoticeEditForm.tsx @@ -1,5 +1,6 @@ 'use client' import { FormEvent, useEffect, useRef, useState } from 'react' +import { isAxiosError } from 'axios' import { Editor } from '@toast-ui/editor' import useAxiosWithAuth from '@/api/config' import useTeamPageState from '@/states/useTeamPageState' @@ -36,7 +37,7 @@ const NoticeEditForm = ({ }) }) .catch(() => { - alert('게시글을 불러오는데 실패했습니다.') + alert('글을 불러오는데 실패했습니다.') setNotice('LIST') }) .finally(() => { @@ -67,11 +68,18 @@ const NoticeEditForm = ({ alert('공지사항을 수정했습니다.') setNotice('DETAIL', postId) }) - .catch(() => { - openToast({ - severity: 'error', - message: '공지사항 수정에 실패했습니다.', - }) + .catch((e: unknown) => { + if (isAxiosError(e) && e.response?.status === 403) { + openToast({ + severity: 'error', + message: '공지사항 수정은 팀 리더와 작성자만 가능합니다.', + }) + } else { + openToast({ + severity: 'error', + message: '공지사항 수정에 실패했습니다.', + }) + } }) } else { // 글 작성 @@ -84,11 +92,18 @@ const NoticeEditForm = ({ alert('공지사항이 등록되었습니다.') setNotice('DETAIL', res.data.postId) }) - .catch(() => { - openToast({ - severity: 'error', - message: '공지사항 수정에 실패했습니다.', - }) + .catch((e: unknown) => { + if (isAxiosError(e) && e.response?.status === 403) { + openToast({ + severity: 'error', + message: '공지사항 등록은 팀 리더와 작성자만 가능합니다.', + }) + } else { + openToast({ + severity: 'error', + message: '공지사항 등록에 실패했습니다.', + }) + } }) } } diff --git a/src/app/teams/[id]/notice/@list/page.tsx b/src/app/teams/[id]/notice/@list/page.tsx index f80460dd2..b6e1168be 100644 --- a/src/app/teams/[id]/notice/@list/page.tsx +++ b/src/app/teams/[id]/notice/@list/page.tsx @@ -35,7 +35,10 @@ const TeamNotice = ({ params }: { params: { id: string } }) => { 공지사항 - } /> + } + /> + if (isEmpty) + return ( + + ) + return ( {data?.map((page, index) => { diff --git a/src/app/teams/[id]/notice/layout.tsx b/src/app/teams/[id]/notice/layout.tsx index 2c2dc4457..215bc8143 100644 --- a/src/app/teams/[id]/notice/layout.tsx +++ b/src/app/teams/[id]/notice/layout.tsx @@ -1,5 +1,5 @@ 'use client' -import { ReactNode, useEffect } from 'react' +import { ReactNode } from 'react' import useTeamPageState from '@/states/useTeamPageState' interface ITeamLayoutProps { @@ -9,12 +9,7 @@ interface ITeamLayoutProps { } const TeamNoticeMain = ({ list, detail, edit }: ITeamLayoutProps) => { - const { boardType, resetState } = useTeamPageState() - useEffect(() => { - return () => { - resetState() - } - }, []) + const { boardType } = useTeamPageState() if (boardType === 'EDIT') { return edit } diff --git a/src/app/teams/[id]/page.tsx b/src/app/teams/[id]/page.tsx index ba0ae4d67..70dcedaef 100644 --- a/src/app/teams/[id]/page.tsx +++ b/src/app/teams/[id]/page.tsx @@ -1,23 +1,37 @@ 'use client' import { useRouter } from 'next/navigation' -import { Typography, Box, Stack } from '@mui/material' +import { Stack } from '@mui/material' import TeamInfoContainer from './panel/TeamInfoContainer' // import TeamDnD from './panel/TeamDnD' -import Image from 'next/image' +import CuButton from '@/components/CuButton' +import { useEffect, useState } from 'react' +import CuCircularProgress from '@/components/CuCircularProgress' +import ForbiddenDolphin from '@/components/WorkingDolphin' const TeamsPage = ({ params }: { params: { id: string } }) => { + const [isClient, setIsClient] = useState(false) const router = useRouter() const { id } = params + useEffect(() => { + setIsClient(true) // 모바일 환경에서 hydration을 막기 위한 변수 + }, []) + + if (!isClient) return + return ( - - router.push('/team-list')} - sx={{ color: '#9B9B9B', cursor: 'pointer' }} - > - 팀리스트로 돌아가기 - + + router.push('/team-list')} + message={'팀 리스트로 돌아가기'} + TypographyProps={{ + color: 'text.alternative', + variant: 'Caption', + }} + variant="text" + style={{ width: 'fit-content' }} + /> {/*준비중 메세지*/} { height={'100%'} alignItems={'center'} justifyContent={'center'} + sx={{ + borderRadius: '1rem', + backgroundColor: 'background.secondary', + }} > - 고래 이미지 - 메인 팀페이지는 준비중입니다! - (다른 기능은 이용 가능합니다) + - {/**/} - + {/* */} + ) } diff --git a/src/app/teams/[id]/panel/NavBar.tsx b/src/app/teams/[id]/panel/NavBar.tsx index 8110f2055..30ca7d490 100644 --- a/src/app/teams/[id]/panel/NavBar.tsx +++ b/src/app/teams/[id]/panel/NavBar.tsx @@ -10,64 +10,80 @@ import { SettingIcon, ShowcaseIcon, } from '@/icons/TeamPage' +import { Box } from '@mui/material' +import useMedia from '@/hook/useMedia' import * as style from './NavBar.style' +import * as navStyle from '@/components/NavBarBox.style' const getTabValue = (path: string) => { if (path.includes('/notice')) return 'notice' else if (path.includes('/board')) return 'board' else if (path.includes('/setting')) return 'setting' + else if (path.includes('/peerlog')) return 'peerlog' + else if (path.includes('/showcase')) return 'showcase' else return 'main' } const TeamSidebar = ({ id }: { id: string }) => { const router = useRouter() + const { isPc, isLargeTablet } = useMedia() + return ( - router.push(`/teams/${id}`), - value: 'main', - icon: , - }, - { - label: '공지사항', - onClick: () => router.push(`/teams/${id}/notice`), - value: 'notice', - icon: , - }, - { - label: '게시판', - onClick: () => router.push(`/teams/${id}/board`), - value: 'board', - icon: , - }, - { - label: '팀설정', - onClick: () => router.push(`/teams/${id}/setting`), - value: 'setting', - icon: , - }, - { - label: '피어로그', - onClick: () => router.push(`/teams/${id}/peerlog`), - value: 'peerlog', - icon: , - new: true, - }, - { - label: '쇼케이스', - onClick: () => router.push(`/teams/${id}/showcase`), - value: 'showcase', - icon: , - new: true, - // disabled: true, - }, - ]} - /> + + router.push(`/teams/${id}`), + value: 'main', + icon: , + }, + { + label: '공지사항', + onClick: () => router.push(`/teams/${id}/notice`), + value: 'notice', + icon: , + }, + { + label: '게시판', + onClick: () => router.push(`/teams/${id}/board`), + value: 'board', + icon: , + }, + { + label: '팀설정', + onClick: () => router.push(`/teams/${id}/setting`), + value: 'setting', + icon: , + }, + { + label: '피어로그', + onClick: () => router.push(`/teams/${id}/peerlog`), + value: 'peerlog', + icon: , + isSoon: true, + disabled: true, + }, + { + label: '쇼케이스', + onClick: () => router.push(`/teams/${id}/showcase`), + value: 'showcase', + icon: , + isNew: true, + }, + ]} + /> + ) } +const getNavStyle = (isTablet: boolean, isPc: boolean) => { + if (isTablet) return navStyle.tabletNavBar + if (isPc) return navStyle.pcNavBar + return navStyle.mobileNavBar +} + export default TeamSidebar diff --git a/src/app/teams/[id]/panel/TeamDnD.tsx b/src/app/teams/[id]/panel/TeamDnD.tsx index 1ccf985bd..10fb1c30e 100644 --- a/src/app/teams/[id]/panel/TeamDnD.tsx +++ b/src/app/teams/[id]/panel/TeamDnD.tsx @@ -1,4 +1,6 @@ -import { Stack, Typography } from '@mui/material' +'use client' + +import { Stack } from '@mui/material' import useAxiosWithAuth from '@/api/config' import 'react-grid-layout/css/styles.css' import { ITeamDnDLayout, SizeType, WidgetType } from '@/types/ITeamDnDLayout' @@ -9,6 +11,8 @@ import WidgetsRender from './WidgetsRender' import WidgetList from '@/app/teams/[id]/panel/WidgetList' import useDnDStore from '@/states/useDnDStore' import { useParams } from 'next/navigation' +import CuCircularProgress from '@/components/CuCircularProgress' +import NoDataDolphin from '@/components/NoDataDolphin' export const sizeRatio = { S: { w: 1, h: 1 }, @@ -31,7 +35,7 @@ const TeamDnD = ({ id }: { id: string }) => { const [size, setSize] = useState('S') const axiosInstance = useAxiosWithAuth() const { trigger, data, error, isMutating } = useSWRMutation( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/dnd-main/read`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/dnd-main/read`, (url: string) => axiosInstance .post(url, { teamId: id, type: 'team' }) @@ -50,8 +54,10 @@ const TeamDnD = ({ id }: { id: string }) => { }, [data]) // api 에러 생길 시 주석 처리 필요 - if (!data && isMutating) return 로딩중입니다... - if (!data && error) return 에러 발생 + if (!data && isMutating) return + + if (!data && error) + return return ( { - switch (status) { - case 'RECRUITING': - return ( - - 모집 중 - - } - sx={{ backgroundColor: '#FFFBDB' }} - /> - ) - case 'BEFORE': - return - case 'ONGOING': - return ( - - 진행 중 - - } - sx={{ backgroundColor: '#EADFFF' }} - /> - ) - case 'COMPLETE': - return ( - - 완료 -
- } - sx={{ backgroundColor: '#F7C5C5' }} - /> - ) - } +const teamStatusMessage = { + RECRUITING: { + message: '모집중', + color: 'yellow.strong', + }, + BEFORE: { + message: '시작전', + color: 'yellow.strong', + }, + ONGOING: { + message: '진행중', + color: 'yellow.strong', + }, + COMPLETE: { + message: '완료', + color: 'yellow.strong', + }, } type TIconType = 'MEMBER' | 'LEADER' | 'DATE' @@ -51,27 +28,47 @@ interface IIconInfoProps { text: string } +export const StatusIcon = ({ status }: { status: TTeamStatus }) => { + return ( + + {teamStatusMessage[status].message} + + ) +} + export const IconInfo = ({ type, text }: IIconInfoProps) => { switch (type) { case 'MEMBER': return ( - - - {text} + + + + {text} + ) case 'LEADER': return ( - - - {text} + + + + {text} + + + 리더 + ) case 'DATE': return ( - - - {text} ~ + + + + {text} ~ + ) } diff --git a/src/app/teams/[id]/panel/TeamInfoContainer.style.ts b/src/app/teams/[id]/panel/TeamInfoContainer.style.ts new file mode 100644 index 000000000..fa10a531b --- /dev/null +++ b/src/app/teams/[id]/panel/TeamInfoContainer.style.ts @@ -0,0 +1,5 @@ +export const teamAvatar = { + width: '7rem', + height: '7rem', + borderRadius: '0.5rem', +} diff --git a/src/app/teams/[id]/panel/TeamInfoContainer.tsx b/src/app/teams/[id]/panel/TeamInfoContainer.tsx index 682e4ba99..a5dfc2d8c 100644 --- a/src/app/teams/[id]/panel/TeamInfoContainer.tsx +++ b/src/app/teams/[id]/panel/TeamInfoContainer.tsx @@ -1,19 +1,20 @@ import { useRouter } from 'next/navigation' import useSWR from 'swr' -import { Avatar, Stack, Typography } from '@mui/material' +import { useEffect } from 'react' +import { Stack, Typography } from '@mui/material' import useAxiosWithAuth from '@/api/config' import CuCircularProgress from '@/components/CuCircularProgress' +import CuAvatar from '@/components/CuAvatar' +import useHeaderStore from '@/states/useHeaderStore' import { ITeamInfo } from '@/types/ITeamInfo' import { StatusIcon, IconInfo } from './TeamInfoComponent' -import { useEffect } from 'react' -import useHeaderStore from '@/states/useHeaderStore' - -const defaultLogoPath = '/images/profile.jpeg' // TODO : 기본 로고 path 확인하기 +import * as style from './TeamInfoContainer.style' +import { isAxiosError } from 'axios' const TeamInfoContainer = ({ id }: { id: number }) => { const axiosInstance = useAxiosWithAuth() const { data, error, isLoading } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/main/${id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/main/${id}`, (url: string) => axiosInstance(url).then((res) => res.data), ) const { setHeaderTitle } = useHeaderStore() @@ -30,8 +31,10 @@ const TeamInfoContainer = ({ id }: { id: number }) => { }, [data]) if (error) { - if (error.status === 403) alert('팀 페이지에 접근할 권한이 없습니다.') - else if (error.status === 404) alert('팀 페이지가 존재하지 않습니다.') + if (isAxiosError(error) && error.response?.status === 403) + alert('팀 페이지에 접근할 권한이 없습니다.') + else if (isAxiosError(error) && error.response?.status === 404) + alert('팀 페이지가 존재하지 않습니다.') else alert('팀 페이지에 접근할 수 없습니다.') router.push('/team-list') return @@ -45,28 +48,30 @@ const TeamInfoContainer = ({ id }: { id: number }) => { return ( <> - + {isLoading || !data ? ( ) : ( <> - - - - {data.name} + + + {data.name} - - - + + + diff --git a/src/app/teams/[id]/panel/WidgetUpdate.tsx b/src/app/teams/[id]/panel/WidgetUpdate.tsx index 4e193dfcd..37d1d3952 100644 --- a/src/app/teams/[id]/panel/WidgetUpdate.tsx +++ b/src/app/teams/[id]/panel/WidgetUpdate.tsx @@ -42,19 +42,18 @@ const WidgetUpdate = ({ } if (isCreate) { await axiosInstance.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/dnd-main/create`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/dnd-main/create`, teamWidgetInfo, ) } else await axiosInstance.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/dnd-main/update`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/dnd-main/update`, teamWidgetInfo, ) alert('저장되었습니다.') setModalOpen(false) setEdit(false) } catch (e) { - console.log('e', e) alert('저장에 실패하였습니다.') } }, [teamId, layouts, isCreate, axiosInstance, setEdit]) @@ -74,7 +73,7 @@ const WidgetUpdate = ({ text: '취소', onClick: () => setModalOpen(false), }} - content={'팀 페이지를 저장하시겠습니까?'} + content={'팀페이지를 저장하시겠습니까?'} /> {/* 팀페이지 수정 버튼 */} diff --git a/src/app/teams/[id]/panel/WidgetsRender.tsx b/src/app/teams/[id]/panel/WidgetsRender.tsx index b7f1f59c4..38ee56da3 100644 --- a/src/app/teams/[id]/panel/WidgetsRender.tsx +++ b/src/app/teams/[id]/panel/WidgetsRender.tsx @@ -1,6 +1,8 @@ +'use client' + import { Box, IconButton, useMediaQuery } from '@mui/material' import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' -import GridLayout, { Layout } from 'react-grid-layout' +import { Layout } from 'react-grid-layout' import { ITeamDnDLayout, IWidget, @@ -10,6 +12,7 @@ import { import RemoveCircleIcon from '@mui/icons-material/RemoveCircle' import WidgetUpdate from '@/app/teams/[id]/panel/WidgetUpdate' import SelectedWidget from './SelectedWidget' +import { Responsive as ResponsiveGridLayout } from 'react-grid-layout' interface IWidgetsRenderProps { data: ITeamDnDLayout | undefined @@ -27,7 +30,7 @@ const WidgetsRender = ({ data, type, size, - isDropping, + // isDropping, droppingItem, edit, setEdit, @@ -54,10 +57,10 @@ const WidgetsRender = ({ }, [data]) const [layouts, setLayouts] = useState(setInitLayouts) - const [prevLayouts, setPrevLayouts] = useState(null) + // const [prevLayouts, setPrevLayouts] = useState(null) /* tablet 보다 크면 4개, 작으면 2개 */ - const isFourRow = useMediaQuery('(min-width:900px)') + const isFourRow = useMediaQuery('(min-width:997px)') /* 지정된 레이아웃에서 벗어나지 않았는지 확인 */ const isValidLayout = useCallback((newLayout: Layout[]) => { @@ -73,11 +76,11 @@ const WidgetsRender = ({ * 그러나 onLayoutChange시에는 react-grid-layout에서 자동으로 아이템을 넣는 방식이기 때문에 제한 불가능 * 따라서 최대 높이를 제한하기 위해 위젯이 추가될 때마다 height를 계산하여 height가 제한 값을 넘은 경우 다시 재조정해줘야함 */ - useEffect(() => { - if (prevLayouts) { - setLayouts(prevLayouts) - } - }, [prevLayouts]) + // useEffect(() => { + // if (prevLayouts) { + // setLayouts(prevLayouts) + // } + // }, [prevLayouts]) /* 윈도우 resize시 위젯 다시 렌더링 */ useEffect(() => { @@ -114,26 +117,30 @@ const WidgetsRender = ({ [edit, isValidLayout, index, type, size, layouts], ) - /* 레이아웃이 변경될때마다 호출 */ - const onLayoutChange = useCallback( - (currentLayout: Layout[]) => { - //드롭중일 경우 이미 onDrop에서 처리하고 있으므로 처리x - if (isDropping) return - //레이아웃 범위를 넘어갈 시 처리 - if (!isValidLayout(currentLayout)) { - setPrevLayouts(layouts) - } - const updatedCurrentWidget: IWidget[] = currentLayout.map( - (grid: Layout, i: number) => ({ - ...layouts[i], - grid, - updatedAt: new Date(), - }), - ) - setLayouts(updatedCurrentWidget) - }, - [isDropping, isValidLayout, layouts], - ) + // /* 레이아웃이 변경될때마다 호출 */ + // const onLayoutChange = useCallback( + // (currentLayout: Layout[]) => { + // //드롭중일 경우 이미 onDrop에서 처리하고 있으므로 처리x + // if (isDropping) return + // //레이아웃 범위를 넘어갈 시 처리 + // if (!isValidLayout(currentLayout)) { + // setPrevLayouts(layouts) + // } + // const updatedCurrentWidget: IWidget[] = currentLayout.map( + // (grid: Layout, i: number) => ({ + // ...layouts[i], + // grid, + // updatedAt: new Date(), + // }), + // ) + // setLayouts(updatedCurrentWidget) + // // setToolbox({ + // // ...toolbox, + // // [currentBreakpoint]: updatedCurrentWidget, + // // }) + // }, + // [isDropping, isValidLayout, layouts], + // ) const removeWidget = useCallback( (idx: string) => { @@ -150,6 +157,14 @@ const WidgetsRender = ({ return isFourRow ? width / 4 : width / 2 }, [isFourRow, layoutRef?.current?.clientWidth]) + // const widgetHeight = useMemo(() => { + // const height = layoutRef?.current?.clientHeight + // if (!height) return 0 + // return isFourRow ? height / 4 : height / 8 + // }, [isFourRow, layoutRef?.current?.clientHeight]) + + const cols = { lg: 4, md: 4, sm: 4, xs: 4, xxs: 2 } + return ( - @@ -224,7 +237,7 @@ const WidgetsRender = ({ ) })} - + ) diff --git a/src/app/teams/[id]/panel/widgets/CalenderWidget/EditModalContent.tsx b/src/app/teams/[id]/panel/widgets/CalenderWidget/EditModalContent.tsx index 177b308d9..5f1871b52 100644 --- a/src/app/teams/[id]/panel/widgets/CalenderWidget/EditModalContent.tsx +++ b/src/app/teams/[id]/panel/widgets/CalenderWidget/EditModalContent.tsx @@ -90,9 +90,7 @@ const EditModalContent = ({ .then((res) => { scheduleData.eventId = res.data // eventId를 받아옴 }) - .catch((e) => { - console.error(e) - }) + .catch(() => {}) .finally(() => { // TODO : 위젯 업데이트 openToast({ diff --git a/src/app/teams/[id]/setting/page.tsx b/src/app/teams/[id]/setting/page.tsx index c85df610e..04988aaa7 100644 --- a/src/app/teams/[id]/setting/page.tsx +++ b/src/app/teams/[id]/setting/page.tsx @@ -1,18 +1,19 @@ 'use client' +import { isAxiosError } from 'axios' import { useRouter } from 'next/navigation' -import { Button, Card, Stack, Typography } from '@mui/material' +import { Button, Stack, Typography, Card } from '@mui/material' import { useEffect, useState } from 'react' import SetupMember from './panel/SettingTeamMember' import ApplicantList from './panel/ApplicantList' import useSWR from 'swr' import useAxiosWithAuth from '@/api/config' -import { ITeam, TeamStatus, TeamType } from '../../types/types' +import { ITeam, TeamStatus } from '../../types/types' +// import { ITeam, TeamStatus, TeamType } from '../../types/types' import RedirectionRecruit from './panel/RedirectRecruitPage' -import TeamJobAdd from './panel/SettingTeamJobs' +// import TeamJobAdd from './panel/SettingTeamJobs' import SetupInfo from './panel/SettingTeamInfo' import CuCircularProgress from '@/components/CuCircularProgress' -import useSocket from '@/states/useSocket' import Tutorial from '@/components/Tutorial' import TeamMemberTutorial from '@/components/tutorialContent/TeamMemberTutorial' @@ -24,36 +25,27 @@ export interface IMyInfo { } const TeamsSetupPage = ({ params }: { params: { id: string } }) => { - const { socket } = useSocket() const axiosWithAuth = useAxiosWithAuth() const [showApplicant, setShowApplicant] = useState(false) - const [myInfo, setMyInfo] = useState() - const { data, error, isLoading } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/${params.id}`, + const { data, error, isLoading, mutate } = useSWR( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/${params.id}`, (url: string) => axiosWithAuth(url).then((res) => res.data), ) const router = useRouter() + const [teams, setTeams] = useState() + + useEffect(() => { + if (data) { + setTeams(data) + } + }, [data]) const openApplicant = () => setShowApplicant(true) const closeApplicant = () => setShowApplicant(false) - useEffect(() => { - if (!socket) return - socket.emit( - 'whoAmI', - { - teamId: params.id, - teamName: data?.team.name, - }, - (data: any) => { - setMyInfo(data) - }, - ) - }, []) - if (error) { - if (error.status === 403) { - alert('팀 페이지에 접근할 권한이 없습니다.') + if (isAxiosError(error) && error.response?.status === 403) { + alert('팀 설정은 팀 리더만 가능합니다.') } else { alert('팀 페이지에 접근할 수 없습니다.') } @@ -70,32 +62,27 @@ const TeamsSetupPage = ({ params }: { params: { id: string } }) => { if (isLoading) return return ( - + 설정 - {data ? ( + {teams ? ( <> - - - {data.team.type === TeamType.PROJECT && ( + + + {/* {teams.team.type === TeamType.PROJECT && ( job.name != 'Leader')} - teamStatus={data.team.status} + jobList={teams.job.filter((job) => job.name != 'Leader')} + teamStatus={teams.team.status} /> - )} + )} */} {!showApplicant ? ( { > 팀원 목록 - } /> + } + /> ) : ( - + )} ) : ( diff --git a/src/app/teams/[id]/setting/panel/AddNewJob.tsx b/src/app/teams/[id]/setting/panel/AddNewJob.tsx index 521cb0fef..d730f2b04 100644 --- a/src/app/teams/[id]/setting/panel/AddNewJob.tsx +++ b/src/app/teams/[id]/setting/panel/AddNewJob.tsx @@ -6,6 +6,7 @@ import AddIcon from '@mui/icons-material/Add' import RemoveIcon from '@mui/icons-material/Remove' import { Job, TeamStatus } from '@/app/teams/types/types' import useAxiosWithAuth from '@/api/config' +import useToast from '@/states/useToast' interface NewJob { name: string @@ -20,6 +21,7 @@ interface Props { const AddNewJob = ({ onNewJob, teamId, teamStatus }: Props) => { const axiosWithAuth = useAxiosWithAuth() + const { openToast } = useToast() const [newJob, setNewJob] = useState({ name: '', max: 1, @@ -37,18 +39,19 @@ const AddNewJob = ({ onNewJob, teamId, teamStatus }: Props) => { const handleAddJob = () => { axiosWithAuth .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/job/add/${teamId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/job/add/${teamId}`, newJob, ) .then((res) => { - console.log(res) if (res.status === 200) { - console.log(res.data) onNewJob(res.data) } }) - .catch((err) => { - console.log(err) + .catch(() => { + openToast({ + severity: 'error', + message: '직업 추가에 실패했습니다.', + }) }) } diff --git a/src/app/teams/[id]/setting/panel/ApplicantList.tsx b/src/app/teams/[id]/setting/panel/ApplicantList.tsx index 3ed127fd4..a156aa621 100644 --- a/src/app/teams/[id]/setting/panel/ApplicantList.tsx +++ b/src/app/teams/[id]/setting/panel/ApplicantList.tsx @@ -9,32 +9,35 @@ import { Typography, } from '@mui/material' import { IApplicant } from '../../../types/types' -import { useEffect, useRef, useState } from 'react' +import { useCallback, useEffect, useRef, useState } from 'react' import useSWR from 'swr' -import useMedia from '@/hook/useMedia' import FormAnswer from './InterviewAnswerForm' import useAxiosWithAuth from '@/api/config' import { CloseIcon } from '@/icons' import { NextButton, PrevButton } from './Icons' import Tutorial from '@/components/Tutorial' import TeamApplicantTutorial from '@/components/tutorialContent/TeamApplicantTutorial' +import useToast from '@/states/useToast' +import CuCircularProgress from '@/components/CuCircularProgress' const ApplicantList = ({ + mutate, close, teamId, }: { + mutate: () => void close: () => void teamId: string }) => { - const { isPc } = useMedia() const [index, setIndex] = useState(0) const scrollRef = useRef(null) const axiosWithAuth = useAxiosWithAuth() + const { openToast } = useToast() // TODO: DTO 맞추기 const { data, isLoading } = useSWR( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/applicant/${teamId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/applicant/${teamId}`, (url: string) => axiosWithAuth.get(url).then((res) => res.data), ) const [members, setMembers] = useState([]) @@ -43,14 +46,13 @@ const ApplicantList = ({ ) useEffect(() => { - console.log(data) setMember(data ? data[index] : null) }, [index, data]) - const handleAccept = () => { + const handleAccept = useCallback(() => { axiosWithAuth .put( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/applicant/accept/${teamId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/applicant/accept/${teamId}`, { teamJobId: member!.applyId.teamJobId, teamUserId: member!.applyId.teamUserId, @@ -59,21 +61,36 @@ const ApplicantList = ({ .then((res) => { if (res.status === 200) { // TODO:백엔드에서 제외 시키는 걸 생각 - setMembers(data) - - if (index > 0) setIndex(index - 1) + setMembers(res.data) + if (index > 0) { + setIndex(index - 1) + } else { + close() + } + mutate() + openToast({ + severity: 'success', + message: '신청이 승인되었습니다.', + }) + } else if (res.status === 403) { + openToast({ + severity: 'error', + message: '권한이 없습니다.', + }) } }) - .catch((err) => { - console.log(err) + .catch(() => { + openToast({ + severity: 'error', + message: '승인에 실패했습니다.', + }) }) - } + }, [index, member, data, mutate]) - const handleReject = () => { - console.log('reject') + const handleReject = useCallback(() => { axiosWithAuth .put( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/applicant/reject/${teamId}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/applicant/reject/${teamId}`, { teamJobId: member!.applyId.teamJobId, teamUserId: member!.applyId.teamUserId, @@ -82,15 +99,32 @@ const ApplicantList = ({ .then((res) => { if (res.status === 200) { // TODO:백엔드에서 제외 시키는 걸 생각 - setMembers(data) + setMembers(res.data) - if (index > 0) setIndex(index - 1) + if (index > 0) { + setIndex(index - 1) + } else { + close() + } + mutate() + openToast({ + severity: 'success', + message: '신청이 거절되었습니다.', + }) + } else if (res.status === 403) { + openToast({ + severity: 'error', + message: '권한이 없습니다.', + }) } }) - .catch((err) => { - console.log(err) + .catch(() => { + openToast({ + severity: 'error', + message: '승인에 실패했습니다.', + }) }) - } + }, [index, member, data, mutate]) const handleNext = () => { if (index < members.length - 1) setIndex(index + 1) @@ -114,16 +148,19 @@ const ApplicantList = ({ }, [index, data]) if (isLoading) { - return ( - - 로딩중 - - ) + return } if (!data || data.length === 0) { return ( - + 신청 대기자 - } /> + } + /> @@ -145,16 +185,24 @@ const ApplicantList = ({ } return ( - + - - 신청 대기자 {index + 1} / {members.length} - + + + 신청 대기자 {index + 1} / {members.length} + + } + /> + @@ -171,7 +219,7 @@ const ApplicantList = ({ - A + {member && {member.name}} {member?.jobName && {member.jobName}} @@ -193,20 +241,14 @@ const ApplicantList = ({ - + 인터뷰 답변 - - {!member && 신청한 대기자가 없습니다.} + + {!member && 신청한 사람이 없습니다.} {member && member.answers ? ( member.answers.map((interview, index) => ( - {interview.question} + {interview.question} )) diff --git a/src/app/teams/[id]/setting/panel/InterviewAnswerForm.tsx b/src/app/teams/[id]/setting/panel/InterviewAnswerForm.tsx index 08e9de9b4..0c9e4e76c 100644 --- a/src/app/teams/[id]/setting/panel/InterviewAnswerForm.tsx +++ b/src/app/teams/[id]/setting/panel/InterviewAnswerForm.tsx @@ -19,6 +19,7 @@ const InterviewAnswerForm = ({ index: number }) => { const { control } = useForm() + return ( <> {interview.type === EInterviewType.OPEN && ( @@ -26,7 +27,7 @@ const InterviewAnswerForm = ({ )} {interview.type === EInterviewType.CLOSE && ( { const router = useRouter() return ( - - + + 모집글 + + } + /> + - + @@ -207,10 +281,6 @@ const SettingTeamJobs = ({ team }: { team: ISetupTeam }) => { onClick: closeConfirmModel, }} /> - - - {message} - ) } diff --git a/src/app/teams/[id]/setting/panel/SettingTeamJobs.tsx b/src/app/teams/[id]/setting/panel/SettingTeamJobs.tsx index e9980003e..70da3b7e2 100644 --- a/src/app/teams/[id]/setting/panel/SettingTeamJobs.tsx +++ b/src/app/teams/[id]/setting/panel/SettingTeamJobs.tsx @@ -26,6 +26,7 @@ import { SettingIcon } from '@/icons/TeamPage' import useAxiosWithAuth from '@/api/config' import Tutorial from '@/components/Tutorial' import TeamJobsTutorial from '@/components/tutorialContent/TeamJobsTutorial' +import useToast from '@/states/useToast' interface TableColumn { id: string @@ -56,6 +57,7 @@ const SettingTeamJobs = ({ teamId, jobList, teamStatus }: Props) => { max: 0, current: 0, }) + const { openToast } = useToast() useEffect(() => { setJobs(jobList) @@ -97,7 +99,7 @@ const SettingTeamJobs = ({ teamId, jobList, teamStatus }: Props) => { // const changeJob = () => { // axiosWithAuth.put( - // `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/job/change`, + // `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/job/change`, // job, // ) // } @@ -109,12 +111,11 @@ const SettingTeamJobs = ({ teamId, jobList, teamStatus }: Props) => { } axiosWithAuth .put( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/change`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/change`, editJob, ) .then((res) => { if (res.status === 200) { - console.log('역할 변경 완료') setJobs( jobs.map((job) => job.id === editJob.id @@ -124,10 +125,13 @@ const SettingTeamJobs = ({ teamId, jobList, teamStatus }: Props) => { ) setIsSettingButton('') setEditJob({ id: 0, name: '', max: 0, current: 0 }) - } else console.log(res.status) + } }) - .catch((err) => { - console.log(err) + .catch(() => { + openToast({ + severity: 'error', + message: '역할 수정에 실패했습니다.', + }) }) } @@ -136,7 +140,7 @@ const SettingTeamJobs = ({ teamId, jobList, teamStatus }: Props) => { 역할 추가 - } /> + } /> { - const { isPc } = useMedia() +const SettingTeamMember = ({ team, teamId, teamStatus }: ISetupMember) => { + const { isPc, isTablet } = useMedia() const { isOpen, closeModal, openModal } = useModal() // const { // isOpen: isChangeOpen, @@ -69,91 +60,117 @@ const SettingTeamMember = ({ // } = useModal() const [members, setMembers] = useState(team) const [member, setMember] = useState() - const [job, setJob] = useState(jobs) + // const [job, setJob] = useState(jobs) // const [selectedJobs, setSelectedJobs] = useState([]) const axiosWithAuth = useAxiosWithAuth() + const [canChangeLeader, setCanChangeLeader] = useState(false) + const { openToast } = useToast() + const { nickname } = useNicknameStore() // const changeJob = () => { // axiosWithAuth.put( - // `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/change`, + // `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/change`, // job, // ) // } useEffect(() => { - setJob(jobs) - console.log(job) - console.log(myInfo) - console.log(member?.id) - // if (selectedJobs.length > 0) { - // changeJob() - // } - }, [setJob, jobs, myInfo]) - - const handleGrant = (member: IMember) => { - console.log('리더 권한 변경') - if (member.role === TeamGrant.LEADER) { - axiosWithAuth - .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/grant/${teamId}?userId=${member.id}&role=member`, - ) - .then((res) => { - console.log(res) - if (res.status === 200) { - setMembers( - members.map((m) => - m.id === member.id ? { ...m, grant: TeamGrant.MEMBER } : m, - ), - ) - } else console.log(res.status) - }) - .catch((err) => { - console.log(err) - }) - } else { - axiosWithAuth - .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/grant/${teamId}?userId=${member.id}&role=leader`, - ) - .then((res) => { - console.log(res) - if (res.status === 200) { - setMembers( - members.map((m) => - m.id === member.id ? { ...m, grant: TeamGrant.LEADER } : m, - ), - ) - } else console.log(res.status) - }) - .catch((err) => { - console.log(err) - }) + setMembers(team) + if (team.length > 1) { + setCanChangeLeader(true) } - } + }, [team]) + + const handleGrant = useCallback( + (member: IMember) => { + if (member.role === TeamGrant.LEADER) { + axiosWithAuth + .post( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/grant/${teamId}?userId=${member.id}&role=member`, + ) + .then((res) => { + if (res.status === 200) { + const changedMembers = members.map((m) => + m.id === member.id ? { ...m, role: TeamGrant.MEMBER } : m, + ) + setMembers(changedMembers) + openToast({ + severity: 'success', + message: '리더 권한이 박탈되었습니다.', + }) + } + }) + .catch(() => { + openToast({ + severity: 'error', + message: '리더 권한 부여에 실패했습니다.', + }) + }) + } else { + axiosWithAuth + .post( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/grant/${teamId}?userId=${member.id}&role=leader`, + ) + .then((res) => { + if (res.status === 200) { + const changedMembers = members.map((m) => + m.id === member.id ? { ...m, role: TeamGrant.LEADER } : m, + ) + setMembers(changedMembers) + + openToast({ + severity: 'success', + message: '리더 권한이 부여되었습니다.', + }) + } + }) + .catch(() => { + openToast({ + severity: 'error', + message: '리더 권한 부여에 실패했습니다.', + }) + }) + } + }, + [members, setMembers], + ) const handleOpenDelete = (member: IMember) => { - console.log('팀원 삭제 모달 오픈') setMember(member) openModal() } const handleDelete = () => { - console.log('팀원 삭제') - if (!member) return console.log('팀원이 없습니다.') + if (!member) + return openToast({ + severity: 'error', + message: '팀원이 없습니다.', + }) axiosWithAuth .delete( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/delete/${teamId}?userId=${member.id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/delete/${teamId}?userId=${member.id}`, ) .then((res) => { if (res.status === 200) { - console.log('삭제 완료') - team = res.data - } else console.log(res.status) + setMembers(members.filter((m) => m.id !== member.id)) + openToast({ + severity: 'success', + message: '팀원이 삭제되었습니다.', + }) + } else if (res.status === 403) { + openToast({ + severity: 'error', + message: '자기 자신은 삭제시킬 수 없습니다.', + }) + } closeModal() }) - .catch((err) => { - console.log(err) + .catch(() => { + openToast({ + severity: 'error', + message: '팀원 삭제에 실패했습니다.', + }) closeModal() }) @@ -205,7 +222,7 @@ const SettingTeamMember = ({ component="div" key={index} item - xs={isPc ? 3 : 6} + xs={isPc && !isTablet ? 3 : 6} textAlign="center" > {/** TODO: 내가 누구인지를 알게 서버에서 받아야 함**/} - {myInfo && member.id.toString() !== myInfo.userId && ( - handleOpenDelete(member)} - style={{ + + {nickname !== member.name && ( + )} + - A + - {member.name} + + {member.name} + - 리더 권한 - handleGrant(member)} - checked={member.role === TeamGrant.LEADER ? true : false} - /> + {canChangeLeader ? ( + + 리더 권한 + handleGrant(member)} + checked={ + member.role === TeamGrant.LEADER ? true : false + } + /> + + ) : ( +
+ )}
{/* 역할이 있을 때만 버튼이 보이게끔 */} {/* {member.job && ( @@ -307,15 +353,20 @@ const SettingTeamMember = ({
*/} - - - - 정말 팀원을 내보내시겠습니까? - - - - - + ) } diff --git a/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamCompleteButton.tsx b/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamCompleteButton.tsx index 113d73884..b78106091 100644 --- a/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamCompleteButton.tsx +++ b/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamCompleteButton.tsx @@ -9,62 +9,66 @@ import { useRouter } from 'next/navigation' interface ITeamCompleteButton { teamStatus: TeamStatus teamId: string + mutate: () => void } -const TeamCompleteButton = ({ teamId, teamStatus }: ITeamCompleteButton) => { +const TeamCompleteButton = ({ + teamId, + teamStatus, + mutate, +}: ITeamCompleteButton) => { const router = useRouter() const { openToast } = useToast() const { isOpen, openModal, closeModal } = useModal() const axiosWithAuth = useAxiosWithAuth() const finishTeam = () => { - console.log('exit team') axiosWithAuth - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/complete`, { + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/complete`, { teamId: teamId, }) .then((res) => { if (res.status === 200) { - console.log(res) openToast({ severity: 'success', message: '팀 활동이 완료되었습니다.', }) + mutate() + } else if (res.status === 400) { + openToast({ + severity: 'error', + message: + '"활동 진행 전" 상태에서는 활동을 완료할 수 없습니다. 진행 중으로 변경 후 완료해주세요.', + }) } else if (res.status === 401) { - console.log(res) router.push('/login') openToast({ severity: 'error', message: '로그인이 필요합니다.', }) } else if (res.status === 403) { - console.log(res) openToast({ severity: 'error', message: '권한이 없습니다.', }) } else if (res.status === 404) { - console.log(res) openToast({ severity: 'error', message: '팀이 존재하지 않습니다.', }) } else if (res.status === 409) { - console.log(res) openToast({ severity: 'error', message: '모집을 완료 후 완료할 수 있습니다.', }) } else { - console.log(res) openToast({ severity: 'error', message: '팀 활동 완료에 실패하였습니다.', }) } }) - .catch((err) => { - console.log(err) + .catch(() => { openToast({ severity: 'error', message: '팀 활동 완료에 실패하였습니다.', @@ -80,7 +84,7 @@ const TeamCompleteButton = ({ teamId, teamStatus }: ITeamCompleteButton) => { justifyContent={'space-between'} alignItems={'center'} > - 팀 활동을 완료하겠습니까? + 팀 활동을 완료하겠습니까?
diff --git a/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamDisperseButton.tsx b/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamDisperseButton.tsx index 5e6fd96f2..472b62410 100644 --- a/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamDisperseButton.tsx +++ b/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamDisperseButton.tsx @@ -18,55 +18,48 @@ const TeamDisperseButton = ({ teamId, teamStatus }: ITeamDisperseButton) => { const axiosWithAuth = useAxiosWithAuth() const disperseTeam = () => { - console.log('exit team') axiosWithAuth - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/disperse`, { + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/disperse`, { teamId: teamId, }) .then((res) => { if (res.status === 200) { - console.log(res) router.push('/team-list') openToast({ severity: 'success', message: '팀이 해산되었습니다.', }) + router.push('/team-list') } else if (res.status === 401) { - console.log(res) router.push('/login') openToast({ severity: 'error', message: '잘못된 접근입니다.', }) } else if (res.status === 403) { - console.log(res) router.push('/login') openToast({ severity: 'error', message: '권한이 없습니다.', }) } else if (res.status === 404) { - console.log(res) openToast({ severity: 'error', message: '팀이 존재하지 않습니다.', }) } else if (res.status === 409) { - console.log(res) openToast({ severity: 'error', message: '모집을 완료 후 팀을 해산하셔야 합니다.', }) } else { - console.log(res) openToast({ severity: 'error', message: '팀 해산에 실패하였습니다.', }) } }) - .catch((err) => { - console.log(err) + .catch(() => { openToast({ severity: 'error', message: '팀 해산에 실패하였습니다.', @@ -82,7 +75,7 @@ const TeamDisperseButton = ({ teamId, teamStatus }: ITeamDisperseButton) => { justifyContent={'space-between'} alignItems={'center'} > - 팀을 해산시겠습니까? + 팀을 해산시겠습니까?
diff --git a/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamQuitButton.tsx b/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamQuitButton.tsx index 7787f6b3b..761c1505b 100644 --- a/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamQuitButton.tsx +++ b/src/app/teams/[id]/setting/panel/TeamEndProcess/TeamQuitButton.tsx @@ -18,48 +18,42 @@ const TeamQuitButton = ({ teamId, teamStatus }: ITeamQuitButton) => { const axiosWithAuth = useAxiosWithAuth() const quitTeam = () => { - console.log('exit team') axiosWithAuth - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/team/setting/quit`, { + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/team/setting/quit`, { teamId: teamId, }) .then((res) => { if (res.status === 200) { - console.log(res) openToast({ severity: 'success', message: '팀을 나갔습니다.', }) + router.push('/team-list') } else if (res.status === 401) { - console.log(res) router.push('/login') openToast({ severity: 'error', message: '잘못된 접근입니다.', }) } else if (res.status === 404) { - console.log(res) openToast({ severity: 'error', message: '팀이 존재하지 않습니다.', }) } else if (res.status === 409) { - console.log(res) openToast({ severity: 'error', message: '혼자 남았을 경우 팀을 나갈 수 없습니다. 해산절차를 진행해주세요.', }) } else { - console.log(res) openToast({ severity: 'error', message: '팀 나가기에 실패하였습니다.', }) } }) - .catch((err) => { - console.log(err) + .catch(() => { openToast({ severity: 'error', message: '팀 나가기에 실패하였습니다.', @@ -75,7 +69,7 @@ const TeamQuitButton = ({ teamId, teamStatus }: ITeamQuitButton) => { justifyContent={'space-between'} alignItems={'center'} > - 팀을 나가겠습니까? + 팀을 나가겠습니까?
diff --git a/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamActivity.tsx b/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamActivity.tsx index 706f6bdca..01ca273ae 100644 --- a/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamActivity.tsx +++ b/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamActivity.tsx @@ -2,16 +2,18 @@ import { MenuItem, Stack, Typography } from '@mui/material' import { WifiClearIcon } from '../Icons' import { Control, Controller } from 'react-hook-form' import { Select } from '@mui/material' -import { TeamOperationForm } from '@/app/teams/types/types' +import { TeamOperationForm, TeamStatus } from '@/app/teams/types/types' import { ISetupTeam } from '../SettingTeamInfo' import useMedia from '@/hook/useMedia' interface ISettingTeamActivity { + teamStatus: TeamStatus teamActivity: TeamOperationForm control: Control } const SettingTeamActivity = ({ + teamStatus, teamActivity, control, }: ISettingTeamActivity) => { @@ -24,9 +26,9 @@ const SettingTeamActivity = ({ mx={!isPc ? '0.5rem' : ''} spacing={'0.5rem'} > - + - 활동방식 + 활동방식 ( diff --git a/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamLocation.tsx b/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamLocation.tsx index 53e82a1e0..74774a4df 100644 --- a/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamLocation.tsx +++ b/src/app/teams/[id]/setting/panel/TeamInfoProcess/SettingTeamLocation.tsx @@ -1,20 +1,69 @@ +'use client' + import { MenuItem, Select, Stack, Typography } from '@mui/material' import { GeoClearIcon } from '../Icons' import { Control, Controller } from 'react-hook-form' import { locationData } from '@/api/location' import { ISetupTeam } from '../SettingTeamInfo' import useMedia from '@/hook/useMedia' +import { TeamOperationForm, TeamStatus } from '@/app/teams/types/types' interface ISettingTeamLocation { - teamLocation: string[] + teamStatus: TeamStatus + teamLocation: Array + teamActivity: TeamOperationForm control: Control } const SettingTeamLocation = ({ + teamStatus, teamLocation, + teamActivity, control, }: ISettingTeamLocation) => { const isPc = useMedia() + + if (teamActivity === 'ONLINE') { + return ( + + + + 활동지역 + + + + + + + ) + } return ( - + - 활동지역 + 활동지역 ( + setIsLogoEdit: (isLogoEdit: boolean) => void } -const SettingTeamLogo = ({ teamLogoImage, setValue }: ISettingTeamLogo) => { +const SettingTeamLogo = ({ + teamStatus, + teamLogoImage, + setValue, + setIsLogoEdit, +}: ISettingTeamLogo) => { const { isOpen, openModal, closeModal } = useModal() const [preview, setPreview] = useState( - teamLogoImage.length !== 0 ? teamLogoImage : '/images/teamLogo.png', + teamLogoImage.length !== 0 ? teamLogoImage : '', ) const deleteImage = () => { - setPreview('/images/teamLogo.png') - setValue('teamImage', '') + setPreview('') + setValue('teamImage', null) + setIsLogoEdit(true) closeModal() } @@ -33,6 +42,7 @@ const SettingTeamLogo = ({ teamLogoImage, setValue }: ISettingTeamLogo) => { reader.onload = () => { setPreview(reader.result as string) setValue('teamImage', reader.result as string) + setIsLogoEdit(true) } reader.readAsDataURL(file!) } @@ -40,21 +50,21 @@ const SettingTeamLogo = ({ teamLogoImage, setValue }: ISettingTeamLogo) => { return ( <> - + - + ) } diff --git a/src/components/CuModal.style.ts b/src/components/CuModal.style.ts index 9e0986442..7124d0b4c 100644 --- a/src/components/CuModal.style.ts +++ b/src/components/CuModal.style.ts @@ -14,6 +14,10 @@ export const pcWrapper = { padding: '1.5rem 2rem', borderRadius: '2rem', backgroundColor: (theme: Theme) => theme.palette.background.primary, + overflowY: 'scroll', + maxHeight: '70vh', + boxSizing: 'border-box', + scrollbarWidth: 'none', } export const mobileWrapper = { @@ -23,6 +27,10 @@ export const mobileWrapper = { borderRadius: '2rem', padding: '1.25rem 1.25rem 1.5rem 1.25rem', backgroundColor: (theme: Theme) => theme.palette.background.primary, + overflowY: 'scroll', + maxHeight: '70vh', + boxSizing: 'border-box', + scrollbarWidth: 'none', } export const mobileFullSizeWrapper = { @@ -32,13 +40,11 @@ export const mobileFullSizeWrapper = { padding: '0.44rem 1rem 1rem 1rem', backgroundColor: (theme: Theme) => theme.palette.background.primary, overflowY: 'scroll', + scrollbarWidth: 'none', } export const modalContent = { flexGrow: 1, - maxHeight: '70vh', - overflowY: 'auto', - scrollbarWidth: 'none', } export const headerMobileButton = { @@ -86,5 +92,5 @@ export const containedButton = { export const containedButtonTypo = { ...modalButtonTypoBase, - color: (theme: Theme) => theme.palette.text.normal, + color: "#ffffff", } diff --git a/src/components/CuNavBar.style.ts b/src/components/CuNavBar.style.ts index 9c1e26898..10f86f261 100644 --- a/src/components/CuNavBar.style.ts +++ b/src/components/CuNavBar.style.ts @@ -30,21 +30,23 @@ const tabBase = { const selectedTab = { '&.Mui-selected': { - backgroundColor: ['purple.tinted', 'background.tertiary'], + backgroundColor: 'purple.tinted', '& span': { - color: ['purple.strong', 'text.normal'], + color: 'purple.normal', }, '& svg': { - fill: (theme: Theme) => theme.palette.purple.strong, + fill: (theme: Theme) => theme.palette.purple.normal, }, }, } const disabledTab = { '&.Mui-disabled': { - color: 'text.disable', backgroundColor: 'transparent', border: 'none', + '& span': { + color: 'text.disable', + }, '& svg': { fill: (theme: Theme) => theme.palette.text.disable, }, @@ -58,15 +60,15 @@ export const pcTab: SxProps = { width: '100%', padding: '0 1.5rem', margin: '0.25rem 0', - '& span': { - color: 'text.assistive', - }, ...tabBase, ...selectedTab, ...disabledTab, + '& span': { + color: 'text.assistive', + }, } -export const newTab = { +export const tabWithBadge = { padding: '0 1.5rem 0 4.06rem', } @@ -93,20 +95,33 @@ export const iconBoxBase = { }, } -export const newTextBadge = { +const textBadge = { display: 'float', marginLeft: '1rem !important', // stack의 spacing을 덮어씌우기 위해 !important 사용 - color: 'yellow.strong', +} + +export const disabledTextBadge = { + ...textBadge, + color: (theme: Theme) => theme.palette.text.disable + ' !important', // 버튼 테마 설정을 덮어씌우기 위해 !important 사용 +} + +export const newTextBadge = { + ...textBadge, + color: (theme: Theme) => theme.palette.yellow.strong + ' !important', // 버튼 테마 설정을 덮어씌우기 위해 !important 사용 +} + +export const soonTextBadge = { + ...textBadge, + color: (theme: Theme) => theme.palette.text.disable + ' !important', // 버튼 테마 설정을 덮어씌우기 위해 !important 사용 } const BADGE_TRANSLATE = 'translate(130%, -50%)' -export const newBadge = { +export const badgeBase = { '& .MuiBadge-badge': { width: '3px', minWidth: '3px', // mui 기본 설정 디자인 오버라이딩 height: '3px', - backgroundColor: (theme: Theme) => theme.palette.yellow.strong, // mui 기본 설정 디자인 오버라이딩 transform: `scale(1) ${BADGE_TRANSLATE}`, WebkitTransform: `scale(1) ${BADGE_TRANSLATE}`, @@ -120,3 +135,27 @@ export const newBadge = { }, }, } + +export const newBadge = { + '& .MuiBadge-badge': { + backgroundColor: 'yellow.strong', + }, +} + +export const betaBadge = { + '& .MuiBadge-badge': { + backgroundColor: 'red.strong', + }, +} + +export const soonBadge = { + '& .MuiBadge-badge': { + backgroundColor: 'text.disable', + }, +} + +export const disabledBadge = { + '& .MuiBadge-badge': { + backgroundColor: 'text.disable', + }, +} diff --git a/src/components/CuNavBar.tsx b/src/components/CuNavBar.tsx index 079c2bf39..fd6966870 100644 --- a/src/components/CuNavBar.tsx +++ b/src/components/CuNavBar.tsx @@ -11,22 +11,33 @@ import { } from '@mui/material' import useMedia from '@/hook/useMedia' import { ChevronLeft } from '@/icons' +import { BetaIcon } from '@/components/BetaBadge' import * as style from './CuNavBar.style' -interface ITabInfo { +interface IBadgeInfo { + isNew?: boolean + isBeta?: boolean + isSoon?: boolean +} + +interface IButtonBadgeProps extends IBadgeInfo { + disabled?: boolean +} + +interface ITabInfo extends IBadgeInfo { label: string mobileLabel?: string onClick: () => void value: string icon: ReactElement disabled?: boolean - new?: boolean } interface ICuNavBarProps { getTabValue: (path: string) => string title: string prevButtonAction?: () => void + tabletMode?: boolean // 팀 페이지 navBar와 같이 태블릿 사이즈에서도 모바일 sidebar 형태로 보여줄 때 사용 tabData: ITabInfo[] } @@ -35,10 +46,12 @@ const CuNavBar = ({ title, prevButtonAction, tabData, + tabletMode, }: ICuNavBarProps) => { const pathName = usePathname() const [value, setValue] = useState(undefined) - const { isPc } = useMedia() + const { isPc, isLargeTablet } = useMedia() + const [isPcSidebar, setIsPcSidebar] = useState(false) const setTabValue = useCallback(() => { setValue(getTabValue(pathName)) @@ -48,9 +61,17 @@ const CuNavBar = ({ setTabValue() }, [setTabValue]) + useEffect(() => { + if (tabletMode) { + setIsPcSidebar(!isLargeTablet && isPc) + } else { + setIsPcSidebar(isPc) + } + }, [isPc, isLargeTablet, tabletMode]) + return ( - - {isPc && ( + + {isPcSidebar && ( )} - {isPc + {isPcSidebar ? [ tabData.map((tab) => ( )), ]} @@ -99,6 +120,7 @@ const CuNavBar = ({ ) } + const PcToggleButton = ({ tab, selected, @@ -106,34 +128,39 @@ const PcToggleButton = ({ tab: ITabInfo selected: boolean }) => { - const isNewTab = tab.new && !tab.disabled return ( + {tab.icon} {tab.label} - {isNewTab && ( - - NEW - - )} + ) } + const MobileToggleButton = ({ tab, selected, @@ -143,7 +170,6 @@ const MobileToggleButton = ({ selected: boolean width: number }) => { - const isNewTab = tab.new && !tab.disabled return ( - + {tab.icon} - + {tab.mobileLabel ?? tab.label} ) } +const PcButtonBadge = ({ + isNew, + isBeta, + isSoon, + disabled, +}: IButtonBadgeProps) => { + if (isNew) { + return ( + + NEW + + ) + } + if (isBeta) { + return + } + if (isSoon) { + return ( + + SOON + + ) + } + return null +} + +const getBadgeStyle = ( + isNew?: boolean, + isBeta?: boolean, + isSoon?: boolean, + disabled?: boolean, +) => { + if (disabled) return style.disabledBadge + if (isNew) return style.newBadge + if (isBeta) return style.betaBadge + if (isSoon) return style.soonBadge + return undefined +} + +const MobileButtonBadge = ({ + isNew, + isBeta, + isSoon, + disabled, + children, +}: IButtonBadgeProps & { + children: ReactElement +}) => { + const badgeStyle = getBadgeStyle(isNew, isBeta, isSoon, disabled) + const isInvisible = !isNew && !isBeta && !isSoon + return ( + + {children} + + ) +} + export default CuNavBar diff --git a/src/components/CuPhotoBox.tsx b/src/components/CuPhotoBox.tsx new file mode 100644 index 000000000..090dbc259 --- /dev/null +++ b/src/components/CuPhotoBox.tsx @@ -0,0 +1,55 @@ +'use client' +import { Box } from '@mui/material' +import Image from 'next/image' +import React, { useState } from 'react' + +interface ICuPhotoBoxProps { + onClick?: () => void + style?: React.CSSProperties + imgStyle?: React.CSSProperties + src: string + alt: string + objectStyle?: 'cover' | 'contain' | 'fill' | 'none' | 'scale-down' + priorityOption?: boolean +} + +const CuPhotoBox = ({ + style, + src, + alt, + priorityOption, + objectStyle = 'cover', + onClick, + imgStyle, +}: ICuPhotoBoxProps) => { + const [error, setError] = useState(false) + return ( + + {src && !error && ( + {alt} setError(true)} + /> + )} + + ) +} + +export default CuPhotoBox diff --git a/src/components/DropdownMenu.tsx b/src/components/DropdownMenu.tsx index 14633ceb4..ead8c1f81 100644 --- a/src/components/DropdownMenu.tsx +++ b/src/components/DropdownMenu.tsx @@ -6,7 +6,13 @@ import useMedia from '@/hook/useMedia' import * as style from './DropdownMenu.style' import * as dropdownMenuStyle from './dropdownMenu/dropdownMenu.styles' -const DropdownMenu = ({ children }: { children: React.ReactNode }) => { +const DropdownMenu = ({ + children, + rotateOn, +}: { + children: React.ReactNode + rotateOn?: boolean +}) => { const [anchorEl, setAnchorEl] = React.useState(null) const open = Boolean(anchorEl) @@ -17,7 +23,8 @@ const DropdownMenu = ({ children }: { children: React.ReactNode }) => { setAnchorEl(event.currentTarget) } - const handleClose = () => { + const handleClose = (e: React.MouseEvent) => { + e.stopPropagation() setAnchorEl(null) } @@ -34,7 +41,8 @@ const DropdownMenu = ({ children }: { children: React.ReactNode }) => { @@ -69,7 +77,10 @@ const DropdownMenu = ({ children }: { children: React.ReactNode }) => { ...style.dropdownMenuIconStyleBase, position: 'absolute', right: '0.6rem', - transform: isPc || anchorEl ? 'rotate(0deg)' : 'rotate(90deg)', + transform: + isPc || anchorEl || !rotateOn + ? 'rotate(0deg)' + : 'rotate(90deg)', color: 'text.alternative', }} /> diff --git a/src/components/DynamicToastEditor.tsx b/src/components/DynamicToastEditor.tsx index 10b7a0eaa..870a460fa 100644 --- a/src/components/DynamicToastEditor.tsx +++ b/src/components/DynamicToastEditor.tsx @@ -18,8 +18,12 @@ const ToastEditor = dynamic( */ const DynamicToastEditor = (props: Props) => { return ( - - + + ) } diff --git a/src/components/DynamicToastEditorAdmin.tsx b/src/components/DynamicToastEditorAdmin.tsx new file mode 100644 index 000000000..eb08b5466 --- /dev/null +++ b/src/components/DynamicToastEditorAdmin.tsx @@ -0,0 +1,31 @@ +// ToastEditorWrapper.tsx +import dynamic from 'next/dynamic' +import React from 'react' +import { Box } from '@mui/material' +import { IToastEditorProps } from '@toast-ui/editor' + +interface Props extends IToastEditorProps { + theme?: string +} + +const ToastEditorAdmin = dynamic( + () => import('./ToastUIEditorAdmin'), // ToastEditor 컴포넌트의 경로 + { ssr: false }, // 서버 사이드 렌더링 비활성화 +) + +/** + * SSR 환경에서 발생하는 충돌을 막기 위해서 dynamic import로 ToastEditor를 불러오는 컴포넌트 + */ +const DynamicToastEditorAdmin = (props: Props) => { + return ( + + + + ) +} + +export default DynamicToastEditorAdmin diff --git a/src/components/EncryptedSender.tsx b/src/components/EncryptedSender.tsx index 30d7bfc19..68cbc5222 100644 --- a/src/components/EncryptedSender.tsx +++ b/src/components/EncryptedSender.tsx @@ -36,7 +36,7 @@ const EncryptedSender = ({ const { initSecret, initCode }: { initSecret: string; initCode: string } = await axios - .get(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/main/init`) + .get(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/main/init`) .then((res) => { return { initSecret: res.data.secret, @@ -47,7 +47,7 @@ const EncryptedSender = ({ const initToken = await getToken({ apiType: apiType }, initSecret) const { verifyCode, verifySeed } = await axios - .post(`${process.env.NEXT_PUBLIC_API_URL}/api/v1/main/get`, { + .post(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/main/get`, { code: initCode, token: initToken, }) @@ -63,7 +63,7 @@ const EncryptedSender = ({ if (!needToken) { await axios .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/main/receive`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/main/receive`, { code: verifyCode, token: payloadToken, @@ -76,7 +76,7 @@ const EncryptedSender = ({ } else { await axiosWithAuth .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/main/receive`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/main/receive`, { code: verifyCode, token: payloadToken, @@ -99,7 +99,6 @@ const EncryptedSender = ({ if (onSuccess) onSuccess() if (setIsLoading) setIsLoading(false) } catch (e: any) { - console.log(e) if (onError) { onError(e?.response?.data?.message ?? '알 수 없는 오류가 발생했습니다.') } diff --git a/src/components/EyeIcon.tsx b/src/components/EyeIcon.tsx index 618aff816..34efcb46c 100644 --- a/src/components/EyeIcon.tsx +++ b/src/components/EyeIcon.tsx @@ -18,6 +18,7 @@ const EyeIcon = ({ onClick={() => { setShowPassword(showPassword === 'password' ? 'text' : 'password') }} + sx={{ paddingY: 0 }} > {showPassword === 'password' ? ( diff --git a/src/components/FavoriteButton.tsx b/src/components/FavoriteButton.tsx index 5ca29132b..36ec5c643 100644 --- a/src/components/FavoriteButton.tsx +++ b/src/components/FavoriteButton.tsx @@ -35,11 +35,10 @@ const FavoriteButton = ({ onFavorite() } else { await axiosInstance.post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/recruit/favorite/${recruit_id}`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/recruit/favorite/${recruit_id}`, ) } } catch (e) { - console.log('error', e) setIsFavorite(!isFavorite) } }, [ diff --git a/src/components/FieldWithLabel.tsx b/src/components/FieldWithLabel.tsx index a7da4ba9e..7d127d574 100644 --- a/src/components/FieldWithLabel.tsx +++ b/src/components/FieldWithLabel.tsx @@ -2,6 +2,7 @@ import { FormHelperText, InputLabel, Stack, + SxProps, Typography, TypographyProps, } from '@mui/material' @@ -14,30 +15,45 @@ interface IFieldWithLabelProps { labelProps?: TypographyProps children: React.ReactNode formHelperText?: string + sx?: SxProps } const FieldWithLabel = (props: IFieldWithLabelProps) => { return ( - - - - {props.labelIcon} - + + + - {props.label} - - {props.endIconButton} - - + {props.labelIcon} + + {props.label} + + + + {props.endIconButton} + {props.children} diff --git a/src/components/ForceTutorial.tsx b/src/components/ForceTutorial.tsx new file mode 100644 index 000000000..a9371e267 --- /dev/null +++ b/src/components/ForceTutorial.tsx @@ -0,0 +1,110 @@ +'use client' + +import { ReactNode, useEffect, useState } from 'react' +import { + Box, + Checkbox, + IconButton, + Modal, + Stack, + SxProps, + Typography, +} from '@mui/material' +import { Help } from '@mui/icons-material' +import useMedia from '@/hook/useMedia' +import { CloseIcon } from '@/icons' +import * as style from './Tutorial.style' + +interface ITutorialProps { + title?: string + content: ReactNode + sx?: SxProps +} + +const ForceTutorial = ({ title, content, sx }: ITutorialProps) => { + const [open, setOpen] = useState(false) + const [checked, setChecked] = useState(false) + const { isPc } = useMedia() + const handleCheck = () => { + setChecked(!checked) + } + + const handleOpen = () => { + setOpen(true) + } + + const handleClose = () => { + if (checked) { + localStorage.setItem('teamListTutorial', 'true') + } + setOpen(false) + } + + useEffect(() => { + if (!open) { + const tutorial = localStorage.getItem('teamListTutorial') + if (tutorial !== 'true') setOpen(true) + } + }, []) + + return ( + <> + + + + + + + {title} + + + + + {content} + + + + + 다시 보지 않기 + + + + + + + + ) +} + +export default ForceTutorial diff --git a/src/components/NavBarBox.style.ts b/src/components/NavBarBox.style.ts new file mode 100644 index 000000000..ab32e743c --- /dev/null +++ b/src/components/NavBarBox.style.ts @@ -0,0 +1,17 @@ +import { SxProps } from '@mui/material' + +export const pcNavBar: SxProps = { + width: '30%', + maxWidth: '19.25rem', + height: 'content-fit', +} + +export const mobileNavBar: SxProps = { + width: '100%', + height: 'content-fit', +} + +export const tabletNavBar: SxProps = { + width: '70%', + height: 'content-fit', +} diff --git a/src/app/my-page/layout.style.ts b/src/components/NavBarLayout.style.ts similarity index 77% rename from src/app/my-page/layout.style.ts rename to src/components/NavBarLayout.style.ts index 998aafec2..1cd76d0f2 100644 --- a/src/app/my-page/layout.style.ts +++ b/src/components/NavBarLayout.style.ts @@ -20,4 +20,12 @@ export const contentBox: SxProps = { width: [undefined, '70%'], padding: [undefined, '2rem'], boxSizing: [undefined, 'border-box'], + mb: '2rem', } + +export const fullPageContentBox: SxProps = { + ...contentBox, + marginTop: ['1rem', undefined], + maxWidth: [undefined, '100%'], + width: [undefined, '100%'], +} \ No newline at end of file diff --git a/src/components/ReportModal.tsx b/src/components/ReportModal.tsx index 63c39edea..f828ddcfb 100644 --- a/src/components/ReportModal.tsx +++ b/src/components/ReportModal.tsx @@ -155,7 +155,7 @@ const ReportModal = ({ // 초기 스킬 리스트 setSkillList: (value: Array) => void // 스킬 리스트 변경 함수 @@ -34,6 +37,7 @@ const SkillAutocomplete = ({ error?: boolean trigger?: UseFormTrigger placeholder?: string + autocompleteSx?: SxProps }) => { const [tagList, setTagList] = useState(skillList) // 검색 된 데이터 @@ -60,13 +64,11 @@ const SkillAutocomplete = ({ useEffect(() => { if (timeOut === 0 && text !== '' && isLoading) { - if (text.length < 2) { - setTimeOut(TIMEOUT) - return - } axiosWithAuth .get( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/skill/search?keyword=${text}`, + `${ + process.env.NEXT_PUBLIC_CSR_API + }/api/v1/skill/search?keyword=${convertNonAlphabeticToHex(text)}`, ) .then((res) => { setTagList((prev) => getUniqueArray(prev.concat(res.data), 'tagId')) @@ -90,6 +92,9 @@ const SkillAutocomplete = ({ } const handleInput = (_: any, value: string[]) => { + if (value.length < skillList.length) { + return + } const newSkillList: ISkill[] = [] value.map((newValue) => { newSkillList.push( @@ -99,6 +104,7 @@ const SkillAutocomplete = ({ setSkillList(newSkillList) if (trigger) trigger('tagList') } + return ( <> skill.name) as Array} + value={skillList.map((skill) => skill.name)} inputValue={text} options={tagList.map((tag) => tag.name)} onChange={handleInput} + // onInputChange={handleTextFieldChange} renderTags={() => <>} renderInput={(params) => ( { const axiosWithAuth = useAxiosWithAuth() - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API const themed = useTheme() const editorElementRef = useRef(null) + const toggleDark = () => { const editorEl = editorElementRef.current?.getElementsByClassName( 'toastui-editor-defaultUI', @@ -48,6 +49,7 @@ const ToastEditor = ({ previewStyle: previewStyle, height: height, initialValue: initialValue, + hooks: { addImageBlobHook: async ( blob: Blob, @@ -65,14 +67,14 @@ const ToastEditor = ({ }, }, ) - console.log('data', response.data) callback(response.data, '이미지 대체 텍스트') } catch (error) { - console.error('이미지 업로드 실패', error) + console.error('이미지 업로드 실패') } }, }, }) + toggleDark() // updateContent() @@ -82,12 +84,23 @@ const ToastEditor = ({ }, [initialValue]) return ( - diff --git a/src/components/ToastUIEditorAdmin.tsx b/src/components/ToastUIEditorAdmin.tsx new file mode 100644 index 000000000..0d3366651 --- /dev/null +++ b/src/components/ToastUIEditorAdmin.tsx @@ -0,0 +1,111 @@ +'use client' + +import React, { useEffect, useRef } from 'react' +import '@toast-ui/editor/dist/toastui-editor.css' +import '@toast-ui/editor/dist/theme/toastui-editor-dark.css' +import { Editor, IToastEditorProps } from '@toast-ui/editor' +import { Box } from '@mui/material' +import { useTheme } from '@mui/material/styles' +import useAxiosWithAuth from '@/api/config' + +/** + * WARNING: SSR 환경에서 사용할 경우 충돌이 나기 때문에 실제 사용하기 위해서는 dynamic import로 불러오는 DynamicToastEditor를 사용해야 합니다. + */ + +const ToastEditorAdmin = ({ + initialValue = '', + initialEditType = 'wysiwyg', + previewStyle = 'vertical', + height = '30rem', + editorRef, +}: IToastEditorProps) => { + const axiosWithAuth = useAxiosWithAuth() + const API_URL = process.env.NEXT_PUBLIC_CSR_API + const themed = useTheme() + const editorElementRef = useRef(null) + + const toggleDark = () => { + const editorEl = editorElementRef.current?.getElementsByClassName( + 'toastui-editor-defaultUI', + )[0] + + if (editorEl) { + if (themed.palette.mode === 'dark') { + editorEl.classList.add('toastui-editor-dark') + } else { + editorEl.classList.remove('toastui-editor-dark') + } + } + } + + useEffect(() => { + if (!editorElementRef.current) { + return + } + + editorRef.current = new Editor({ + el: editorElementRef.current, + initialEditType: initialEditType, + previewStyle: previewStyle, + height: height, + initialValue: initialValue, + + hooks: { + addImageBlobHook: async ( + blob: Blob, + callback: (url: string, text: string) => void, + ) => { + const formData = new FormData() + formData.append('image', blob) + try { + const response = await axiosWithAuth.post( + `${API_URL}/api/v1/admin/editor/image`, + formData, + { + withCredentials: true, + headers: { + 'Content-Type': 'multipart/form-data', + }, + }, + ) + callback(response.data, '이미지 대체 텍스트') + } catch (error) { + console.error('이미지 업로드 실패') + } + }, + }, + }) + + toggleDark() + + // updateContent() + return () => { + editorRef.current?.destroy() + } + }, [initialValue]) + + return ( + + ) +} + +export default ToastEditorAdmin diff --git a/src/components/ToastUIViewer.tsx b/src/components/ToastUIViewer.tsx index d9d39bdb2..86a3462d2 100644 --- a/src/components/ToastUIViewer.tsx +++ b/src/components/ToastUIViewer.tsx @@ -1,7 +1,7 @@ 'use client' import { useEffect, useRef } from 'react' -import { Box } from '@mui/material' +import { Box, useTheme } from '@mui/material' import Viewer, { IViewerOptions, } from '@toast-ui/editor/dist/toastui-editor-viewer' @@ -15,8 +15,11 @@ const ToastViewer = ({ initialValue = '', height = '30rem', sx, + typographySx, }: IViewerOptions) => { const viewerRef = useRef(null) + const theme = useTheme() + useEffect(() => { if (!viewerRef.current) { return @@ -32,18 +35,27 @@ const ToastViewer = ({ viewer.destroy() } }, [initialValue, viewerRef]) + return ( diff --git a/src/components/Tutorial.tsx b/src/components/Tutorial.tsx index 077a393dd..33dacd99d 100644 --- a/src/components/Tutorial.tsx +++ b/src/components/Tutorial.tsx @@ -1,22 +1,30 @@ import { ReactNode, useState } from 'react' -import { Box, IconButton, Modal, Stack, Typography } from '@mui/material' +import { + Box, + IconButton, + Modal, + Stack, + SxProps, + Typography, +} from '@mui/material' import { Help } from '@mui/icons-material' import useMedia from '@/hook/useMedia' import { CloseIcon } from '@/icons' import * as style from './Tutorial.style' interface ITutorialProps { - title?: string + title: string content: ReactNode + sx?: SxProps } -const Tutorial = ({ title, content }: ITutorialProps) => { +const Tutorial = ({ title, content, sx }: ITutorialProps) => { const [open, setOpen] = useState(false) const { isPc } = useMedia() return ( <> setOpen(true)}> - + setOpen(false)} keepMounted> diff --git a/src/components/board/EditPanel.tsx b/src/components/board/EditPanel.tsx index edc1d49dd..29f4e6c84 100644 --- a/src/components/board/EditPanel.tsx +++ b/src/components/board/EditPanel.tsx @@ -39,7 +39,7 @@ export const EditPage = ({ title, children, handleGoBack }: IEditPageProps) => { const { isPc } = useMedia() if (isPc) return ( - + {title} diff --git a/src/components/board/ListPanel.style.ts b/src/components/board/ListPanel.style.ts index e735dc67e..ec0e739ec 100644 --- a/src/components/board/ListPanel.style.ts +++ b/src/components/board/ListPanel.style.ts @@ -15,8 +15,7 @@ export const ListBoxContainer = { background: (theme: Theme) => theme.palette.background.secondary, } -export const PcListStack = { - // 페이징 방식이 페이지네이션이 될 경우 수정될 수 있음 +export const ListStack = { height: '100%', overflowY: 'scroll', } diff --git a/src/components/board/ListPanel.tsx b/src/components/board/ListPanel.tsx index e7ffbc2ad..0335202b1 100644 --- a/src/components/board/ListPanel.tsx +++ b/src/components/board/ListPanel.tsx @@ -35,7 +35,7 @@ export const ListPageContainer = ({ children }: IChildrenProps) => { const { isPc } = useMedia() return ( {children} @@ -168,9 +168,8 @@ export const ListBoxContainer = ({ children }: IChildrenProps) => { } export const ListStack = ({ children }: IChildrenProps) => { - const { isPc } = useMedia() return ( - + {children} ) diff --git a/src/components/dropdownMenu/IconMenuItem.tsx b/src/components/dropdownMenu/IconMenuItem.tsx index 85bf390c5..220b24064 100644 --- a/src/components/dropdownMenu/IconMenuItem.tsx +++ b/src/components/dropdownMenu/IconMenuItem.tsx @@ -7,10 +7,12 @@ const IconMenuItem = ({ icon, text, action, + disabled, }: { icon: React.ReactNode text: string action?: () => void + disabled?: boolean }) => { const handleClick = () => { if (action) { @@ -18,7 +20,7 @@ const IconMenuItem = ({ } } return ( - + { - console.error(e) - }) + .catch(() => {}) } else { if (navigator.clipboard) { navigator.clipboard .writeText(message || url) .then(() => alert('클립보드에 복사되었습니다.')) - .catch((e) => { - console.error(e) - }) + .catch(() => {}) } else { const textarea = document.createElement('textarea') textarea.value = message || url diff --git a/src/components/dropdownMenu/dropdownMenu.styles.ts b/src/components/dropdownMenu/dropdownMenu.styles.ts index f591958e9..c40128ab8 100644 --- a/src/components/dropdownMenu/dropdownMenu.styles.ts +++ b/src/components/dropdownMenu/dropdownMenu.styles.ts @@ -12,3 +12,9 @@ export const menuItemIconStyleBase: SxProps = { height: '1.5rem', boxSizing: 'border-box', } + +export const recruitMenuIcon: SxProps = { + ...menuItemIconStyleBase, + padding: '0.125rem', + color: 'text.alternative', +} diff --git a/src/components/tutorialContent/MainPageTutorial.tsx b/src/components/tutorialContent/MainPageTutorial.tsx index 9d2f0eb50..cc3de8929 100644 --- a/src/components/tutorialContent/MainPageTutorial.tsx +++ b/src/components/tutorialContent/MainPageTutorial.tsx @@ -10,19 +10,24 @@ export const MainPageTutorial = () => { + + + ) diff --git a/src/components/tutorialContent/RecruitEditPageTutorial.tsx b/src/components/tutorialContent/RecruitEditPageTutorial.tsx index f7ab359aa..de102aaf4 100644 --- a/src/components/tutorialContent/RecruitEditPageTutorial.tsx +++ b/src/components/tutorialContent/RecruitEditPageTutorial.tsx @@ -10,9 +10,17 @@ const RecruitEditPageTutorial = () => { + + diff --git a/src/components/tutorialContent/SkillsTutorial.tsx b/src/components/tutorialContent/SkillsTutorial.tsx new file mode 100644 index 000000000..fc378d7d0 --- /dev/null +++ b/src/components/tutorialContent/SkillsTutorial.tsx @@ -0,0 +1,20 @@ +import { + Content, + SubTitle, + TitleContianer, + TutorialContainer, +} from './TutorialComponent' + +export const SkillsTutorial = () => { + return ( + + + + + + + + ) +} diff --git a/src/components/tutorialContent/TeamAnnounceTutorial.tsx b/src/components/tutorialContent/TeamAnnounceTutorial.tsx index 15b15f463..b9c09303e 100644 --- a/src/components/tutorialContent/TeamAnnounceTutorial.tsx +++ b/src/components/tutorialContent/TeamAnnounceTutorial.tsx @@ -1,21 +1,13 @@ -import { - Content, - SubTitle, - TitleContianer, - TutorialContainer, -} from './TutorialComponent' +import { Content, TitleContianer, TutorialContainer } from './TutorialComponent' const TeamAnnounceTutorial = () => { return ( - + ) diff --git a/src/components/tutorialContent/TeamApplicantTutorial.tsx b/src/components/tutorialContent/TeamApplicantTutorial.tsx index 315489d31..8a37c2454 100644 --- a/src/components/tutorialContent/TeamApplicantTutorial.tsx +++ b/src/components/tutorialContent/TeamApplicantTutorial.tsx @@ -1,19 +1,17 @@ -import { - Content, - SubTitle, - TitleContianer, - TutorialContainer, -} from './TutorialComponent' +import { Content, TitleContianer, TutorialContainer } from './TutorialComponent' const TeamApplicantTutorial = () => { return ( - + + diff --git a/src/components/tutorialContent/TeamBoardTutorial.tsx b/src/components/tutorialContent/TeamBoardTutorial.tsx index 41b47c72c..c7f9323f1 100644 --- a/src/components/tutorialContent/TeamBoardTutorial.tsx +++ b/src/components/tutorialContent/TeamBoardTutorial.tsx @@ -9,13 +9,18 @@ const TeamBoardTutorial = () => { return ( - + + + + + + + ) diff --git a/src/components/tutorialContent/TeamEndingTutorial.tsx b/src/components/tutorialContent/TeamEndingTutorial.tsx index 3ad89ee3c..84c197282 100644 --- a/src/components/tutorialContent/TeamEndingTutorial.tsx +++ b/src/components/tutorialContent/TeamEndingTutorial.tsx @@ -9,21 +9,34 @@ const TeamEndingTutorial = () => { return ( - + + + + diff --git a/src/components/tutorialContent/TeamJobsTutorial.tsx b/src/components/tutorialContent/TeamJobsTutorial.tsx index a3ee60a32..346a7d8ab 100644 --- a/src/components/tutorialContent/TeamJobsTutorial.tsx +++ b/src/components/tutorialContent/TeamJobsTutorial.tsx @@ -1,19 +1,19 @@ -import { - Content, - SubTitle, - TitleContianer, - TutorialContainer, -} from './TutorialComponent' +import { Content, TitleContianer, TutorialContainer } from './TutorialComponent' const TeamJobsTutorial = () => { return ( - + + diff --git a/src/components/tutorialContent/TeamListTutorial.tsx b/src/components/tutorialContent/TeamListTutorial.tsx new file mode 100644 index 000000000..6a34c8acf --- /dev/null +++ b/src/components/tutorialContent/TeamListTutorial.tsx @@ -0,0 +1,34 @@ +import { + Content, + SubTitle, + TitleContianer, + TutorialContainer, +} from './TutorialComponent' + +export const TeamListTutorial = () => { + return ( + + + + + + + + + + + ) +} diff --git a/src/components/tutorialContent/TeamMemberTutorial.tsx b/src/components/tutorialContent/TeamMemberTutorial.tsx index 2aa1a8b3d..160acf739 100644 --- a/src/components/tutorialContent/TeamMemberTutorial.tsx +++ b/src/components/tutorialContent/TeamMemberTutorial.tsx @@ -1,20 +1,11 @@ -import { - Content, - SubTitle, - TitleContianer, - TutorialContainer, -} from './TutorialComponent' +import { Content, TitleContianer, TutorialContainer } from './TutorialComponent' const TeamMemberTutorial = () => { return ( - - + + ) diff --git a/src/components/tutorialContent/TeamStatusTutorial.tsx b/src/components/tutorialContent/TeamStatusTutorial.tsx index 0c4e0ad1d..e924851d5 100644 --- a/src/components/tutorialContent/TeamStatusTutorial.tsx +++ b/src/components/tutorialContent/TeamStatusTutorial.tsx @@ -9,35 +9,28 @@ const TeamStatusTutorial = () => { return ( - - + + + - - + + diff --git a/src/constant/ColorTheme.ts b/src/constant/ColorTheme.ts index 89ee8d606..7f9623c26 100644 --- a/src/constant/ColorTheme.ts +++ b/src/constant/ColorTheme.ts @@ -56,7 +56,7 @@ export const darkTheme = createTheme({ }, }, typography: { - fontFamily: 'Pretendard Variable, sans-serif', + fontFamily: 'var(--main-font), Pretendard Variable, sans-serif', }, components: { MuiCssBaseline: { @@ -99,7 +99,7 @@ export const lightTheme = createTheme({ }, }, typography: { - fontFamily: 'Pretendard Variable, sans-serif', + fontFamily: 'var(--main-font) Pretendard Variable sans-serif', }, components: { MuiCssBaseline: { diff --git a/src/hook/useLinks.tsx b/src/hook/useLinks.tsx index bedc2c300..7496b5fb8 100644 --- a/src/hook/useLinks.tsx +++ b/src/hook/useLinks.tsx @@ -3,24 +3,26 @@ import { useState } from 'react' export const useLinks = (initValue: ILinkInformation[]) => { const [links, setLinks] = useState(initValue) - const [isValid, setIsValid] = useState(true) const addLink = (name: string, link: string) => { - const newLink = { name, link, id: links.length } + const newLink = { name, link, id: crypto.randomUUID() } setLinks([...links, newLink]) } + const deleteLink = (id: string) => { + setLinks(links.filter((link) => link.id !== id)) + } - const changeLinkName = (id: number, content: string) => { + const changeLinkName = (id: string, content: string) => { setLinks( links.map((link) => (link.id === id ? { ...link, name: content } : link)), ) } - const changeUrl = (id: number, content: string) => { + const changeUrl = (id: string, content: string) => { setLinks( links.map((link) => (link.id === id ? { ...link, link: content } : link)), ) } - return { links, addLink, isValid, setIsValid, changeLinkName, changeUrl } + return { links, addLink, deleteLink, changeLinkName, changeUrl } } diff --git a/src/hook/useMedia.tsx b/src/hook/useMedia.tsx index ceeb4f6be..4500ea8da 100644 --- a/src/hook/useMedia.tsx +++ b/src/hook/useMedia.tsx @@ -5,8 +5,9 @@ import { useMediaQuery } from '@mui/material' const useMedia = () => { const isPc = useMediaQuery('(min-width:480px)') const isTablet = useMediaQuery('(min-width:480px) and (max-width:700px)') + const isLargeTablet = useMediaQuery('(min-width:480px) and (max-width:997px)') // 팀 페이지 navBar에서 사용 - return { isPc, isTablet } + return { isPc, isTablet, isLargeTablet } } export default useMedia diff --git a/src/icons/AccoutBox.tsx b/src/icons/AccoutBox.tsx new file mode 100644 index 000000000..9fa4e1fca --- /dev/null +++ b/src/icons/AccoutBox.tsx @@ -0,0 +1,21 @@ +'use client' +import React from 'react' +import { createSvgIcon } from '@mui/material' + +export const AccoutBox = createSvgIcon( + + + , + 'AccoutBox', +) + +export default AccoutBox diff --git a/src/icons/GroupIcon.tsx b/src/icons/GroupIcon.tsx new file mode 100644 index 000000000..57c31ce1e --- /dev/null +++ b/src/icons/GroupIcon.tsx @@ -0,0 +1,21 @@ +'use client' +import React from 'react' +import { createSvgIcon } from '@mui/material' + +export const GroupIcon = createSvgIcon( + + + , + 'GroupIcon', +) + +export default GroupIcon diff --git a/src/icons/TimeIcon.tsx b/src/icons/TimeIcon.tsx new file mode 100644 index 000000000..9327697f8 --- /dev/null +++ b/src/icons/TimeIcon.tsx @@ -0,0 +1,21 @@ +'use client' +import React from 'react' +import { createSvgIcon } from '@mui/material' + +export const TimeIcon = createSvgIcon( + + + , + 'TimeIcon', +) + +export default TimeIcon diff --git a/src/icons/index.ts b/src/icons/index.ts index 1ad9f6666..4f581293f 100644 --- a/src/icons/index.ts +++ b/src/icons/index.ts @@ -33,3 +33,6 @@ export { default as UnCheckedCheckBox } from './UnCheckedCheckBox' export { default as UnSelectedRadioButton } from './UnSelectedRadioButton' export { default as UserCheckIcon } from './UserCheckIcon' export { default as WifiIcon } from './WifiIcon' +export { default as AccountBox } from './AccoutBox' +export { default as TimeIcon } from './TimeIcon' +export { default as GroupIcon } from './GroupIcon' diff --git a/src/states/useAboutLayout.ts b/src/states/useAboutLayout.ts new file mode 100644 index 000000000..7f9ec2277 --- /dev/null +++ b/src/states/useAboutLayout.ts @@ -0,0 +1,39 @@ +import { create } from 'zustand' + +interface IAboutLayoutState { + boardType: TAboutBoardType + announceDetailId?: number + resetState: () => void + setBoard: (boardType: TAboutBoardType) => void + setAnnounceDetail: (announceId: number) => void +} + +export type TAboutBoardType = + | 'PEER' + | 'MIND' + | 'ANNOUNCE' + | 'DICTIONARY' + | 'CONTACT' + | 'PERSONAL' + | 'SERVICE' + | 'ANNOUNCE_DETAIL' + +const useAboutLayout = create((set) => ({ + boardType: 'PEER', + resetState: () => + set({ + boardType: 'PEER', + }), + setBoard: (boardType) => + set({ + boardType, + }), + setAnnounceDetail: (announceId) => + set((state) => ({ + ...state, + announceDetailId: announceId, + boardType: 'ANNOUNCE_DETAIL', + })), +})) + +export default useAboutLayout diff --git a/src/states/useAlarmStorage.ts b/src/states/useAlarmStorage.ts new file mode 100644 index 000000000..5095c14f4 --- /dev/null +++ b/src/states/useAlarmStorage.ts @@ -0,0 +1,137 @@ +import { create } from 'zustand' +import useAuthStore from './useAuthStore' +import axios from 'axios' + +export enum AlarmType { + ALL = 'ALL', + SYSTEM = 'SYSTEM', + MESSAGE = 'MESSAGE', + TEAM = 'TEAM', +} + +export interface IAlarm { + title: string + body: string + redirectUrl: string + issuedAt: string + notificationId: number + type: AlarmType + iconUrl: string + isEnd: boolean +} + +interface IStoreAlarmState { + isNew: boolean + + isNewAlarm: (isLogin: boolean) => void + checkNewAlarm: () => void + alarms: IAlarm[] + resetAlarms: () => void + getAlarms: (page: number, tabvalue: number) => void + deleteAlarm: (id: number) => void + deleteAllAlarms: (tabvalue: number) => void +} + +const useAlarmStorage = create((set) => { + const accessToken = useAuthStore.getState().accessToken + + return { + isNew: false, + isNewAlarm: (isLogin: boolean) => { + if (!isLogin) { + return + } + axios + .get(`${process.env.NEXT_PUBLIC_CSR_API}/api/v1/noti/summary`, { + headers: { Authorization: `Bearer ${accessToken}` }, + }) + .then((res) => { + if (res.status === 200) { + const newValue = res.data > 0 ? true : false + set(() => ({ isNew: newValue })) + } else if (res.status === 204) { + set(() => ({ isNew: false })) + } + }) + .catch(() => {}) + }, + checkNewAlarm: () => { + set(() => ({ isNew: false })) + }, + alarms: [], + resetAlarms: () => { + set(() => ({ alarms: [] })) + }, + getAlarms: (page: number, tabvalue: number) => { + const type = + tabvalue === 0 + ? AlarmType.ALL + : tabvalue === 1 + ? AlarmType.MESSAGE + : tabvalue === 2 + ? AlarmType.TEAM + : AlarmType.SYSTEM + + axios + .get( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/noti/spring?type=${type}&pgIdx=${page}&size=10`, + { + headers: { Authorization: `Bearer ${accessToken}` }, + }, + ) + .then((res) => { + if (res.status === 200) { + set((state) => ({ alarms: [...state.alarms, ...res.data] })) + } else if (res.status === 400) { + set((state) => ({ alarms: state.alarms })) + } + }) + .catch(() => {}) + }, + deleteAlarm: (id: number) => { + axios + .delete( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/noti/spring/delete-target?notificationId=${id}`, + { + headers: { Authorization: `Bearer ${accessToken}` }, + }, + ) + .then((res) => { + if (res.status === 200) { + set((state) => ({ + alarms: state.alarms.filter( + (alarm) => alarm.notificationId !== id, + ), + })) + } + }) + .catch(() => {}) + }, + deleteAllAlarms: (tabvalue) => { + const type = + tabvalue === 0 + ? AlarmType.ALL + : tabvalue === 1 + ? AlarmType.MESSAGE + : tabvalue === 2 + ? AlarmType.TEAM + : AlarmType.SYSTEM + + axios + .delete( + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/noti/spring/delete-all?type=${type}`, + { + headers: { Authorization: `Bearer ${accessToken}` }, + }, + ) + .then((res) => { + if (res.status === 200) { + set(() => ({ alarms: [] })) + } + }) + .catch(() => {}) + }, + } +}) + +export default useAlarmStorage diff --git a/src/states/useAuthStore.tsx b/src/states/useAuthStore.tsx index c503482da..604719b11 100644 --- a/src/states/useAuthStore.tsx +++ b/src/states/useAuthStore.tsx @@ -1,14 +1,13 @@ import { create } from 'zustand' import LocalStorage from './localStorage' import axios from 'axios' -import { setCookie } from 'cookies-next' import useNicknameStore from './useNicknameStore' interface IAuthStore { isLogin: boolean accessToken: string | null login: (accessToken: string) => void - logout: () => void + logout: (isRefreshing?: boolean) => void } const useAuthStore = create((set) => { @@ -17,7 +16,7 @@ const useAuthStore = create((set) => { ? JSON.parse(authDataJSON) : { accessToken: null } - const API_URL = process.env.NEXT_PUBLIC_API_URL + const API_URL = process.env.NEXT_PUBLIC_CSR_API return { isLogin: !!authData.accessToken, @@ -25,8 +24,6 @@ const useAuthStore = create((set) => { login: (accessToken) => { const authDataToSave = { accessToken } LocalStorage.setItem('authData', JSON.stringify(authDataToSave)) - console.log('accessToken', accessToken) - setCookie('accessToken', accessToken) axios .get(`${API_URL}/api/v1/profile`, { headers: { @@ -37,19 +34,24 @@ const useAuthStore = create((set) => { const nickname = res.data.nickname useNicknameStore.getState().setNickname(nickname) }) + .catch(() => {}) // set state set(() => ({ isLogin: true, accessToken, })) }, - logout: () => { - if (authData.accessToken) { - axios.get(`${API_URL}/api/v1/logout`, { - headers: { - Authorization: `Bearer ${authData.accessToken}`, - }, - }) + logout: (isRefreshing) => { + if (authData.accessToken && isRefreshing === undefined) { + axios + .get(`${API_URL}/api/v1/logout`, { + headers: { + Authorization: `Bearer ${authData.accessToken}`, + }, + }) + .catch(() => { + // console.log('만료된 토큰') -- do nothing + }) } LocalStorage.removeItem('authData') set(() => ({ diff --git a/src/states/useDarkMode.ts b/src/states/useDarkMode.ts index 0d992c2f8..4565283f6 100644 --- a/src/states/useDarkMode.ts +++ b/src/states/useDarkMode.ts @@ -54,27 +54,27 @@ export const useDarkMode = create((set, get) => { darkMode: EDisplayMode.light, useSystemTheme: false, })) - } else if (mode === 'dark') { - set(() => ({ - theme: darkTheme, - darkMode: EDisplayMode.dark, - useSystemTheme: false, - })) - } else { + } else if (mode === 'system') { set(() => ({ theme: getSystemTheme() === EDisplayMode.light ? lightTheme : darkTheme, darkMode: getSystemTheme(), useSystemTheme: true, })) + } else { + set(() => ({ + theme: darkTheme, + darkMode: EDisplayMode.dark, + useSystemTheme: false, + })) if (mode === null) { - LocalStorage.setItem('mode', EDisplayMode.system) + LocalStorage.setItem('mode', EDisplayMode.dark) } } } return { darkMode: EDisplayMode.dark, - useSystemTheme: true, + useSystemTheme: false, theme: darkTheme, isLightMode, toggleDarkMode, diff --git a/src/states/useDnDStore.ts b/src/states/useDnDStore.ts index 9f58236b2..9302b7e66 100644 --- a/src/states/useDnDStore.ts +++ b/src/states/useDnDStore.ts @@ -53,7 +53,7 @@ const useDnDStore = create((set) => { //요청 axios .post( - `${process.env.NEXT_PUBLIC_API_URL}/api/v1/dnd-main/update`, + `${process.env.NEXT_PUBLIC_CSR_API}/api/v1/dnd-main/update`, { teamId: state.teamId, type: 'team', @@ -65,8 +65,7 @@ const useDnDStore = create((set) => { alert('수정되었습니다.') return { storedWidgets: updatedWidgets } }) - .catch((err) => { - console.log(err) + .catch(() => { alert('수정에 실패하였습니다.') }) return state diff --git a/src/states/useSocket.tsx b/src/states/useSocket.tsx index 1a8f0dc31..e24133c06 100644 --- a/src/states/useSocket.tsx +++ b/src/states/useSocket.tsx @@ -3,14 +3,19 @@ import { create } from 'zustand' interface ISocket { socket: Socket | null - setSocket: (socket: Socket) => void + initSocket: () => void resetSocket: () => void + resetEvent: () => void } const useSocket = create((set) => ({ socket: null, - setSocket: (socket: Socket) => set({ socket: socket }), + initSocket: () => { + console.log('initSocket') + set({ socket: null }) + }, resetSocket: () => set({ socket: null }), + resetEvent: () => set({ socket: null }), })) export default useSocket diff --git a/src/states/useTeamPageState.ts b/src/states/useTeamPageState.ts index 94fc21816..7a2ec0c1b 100644 --- a/src/states/useTeamPageState.ts +++ b/src/states/useTeamPageState.ts @@ -21,15 +21,13 @@ interface ITeamPageState { postId: number | undefined resetState: () => void setNotice: (boardType: TboardType, postId?: number) => void - setBoard: (boardType: TboardType, boardId: number, postId?: number) => void + setBoard: (boardType: TboardType, boardId?: number, postId?: number) => void } const useTeamPageState = create((set) => ({ layout: 'SIDEBAR', - // boardType: 'NOTICE', boardType: 'LIST', - // boardId: undefined, - boardId: 1, + boardId: undefined, postId: undefined, resetState: () => set({ diff --git a/src/states/useToast.ts b/src/states/useToast.ts index 7d2850c51..2539422f5 100644 --- a/src/states/useToast.ts +++ b/src/states/useToast.ts @@ -48,7 +48,7 @@ const useToast = create((set, get) => { const defaultToastProps: IToastProps = { open: false, - autoHideDuration: 10000, + autoHideDuration: 3000, onClose: closeToast, severity: undefined, message: '', @@ -62,7 +62,7 @@ const useToast = create((set, get) => { return { toastProps: { open: false, - autoHideDuration: 10000, + autoHideDuration: 3000, onClose: closeToast, severity: undefined, message: '', diff --git a/src/stories/Button.stories.ts b/src/stories/Button.stories.ts new file mode 100644 index 000000000..2d33eca55 --- /dev/null +++ b/src/stories/Button.stories.ts @@ -0,0 +1,50 @@ +// import type { Meta, StoryObj } from '@storybook/react'; + +// // import { Button } from './Button'; + +// // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export +// const meta = { +// title: 'Example/Button', +// component: Button, +// parameters: { +// // Optional parameter to center the component in the Canvas. More info: https://storybook.js.org/docs/configure/story-layout +// layout: 'centered', +// }, +// // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs +// tags: ['autodocs'], +// // More on argTypes: https://storybook.js.org/docs/api/argtypes +// argTypes: { +// backgroundColor: { control: 'color' }, +// }, +// } satisfies Meta; + +// export default meta; +// type Story = StoryObj; + +// // More on writing stories with args: https://storybook.js.org/docs/writing-stories/args +// export const Primary: Story = { +// args: { +// primary: true, +// label: 'Button', +// }, +// }; + +// export const Secondary: Story = { +// args: { +// label: 'Button', +// }, +// }; + +// export const Large: Story = { +// args: { +// size: 'large', +// label: 'Button', +// }, +// }; + +// export const Small: Story = { +// args: { +// size: 'small', +// label: 'Button', +// }, +// }; diff --git a/src/stories/Button.tsx b/src/stories/Button.tsx new file mode 100644 index 000000000..affd8c342 --- /dev/null +++ b/src/stories/Button.tsx @@ -0,0 +1,56 @@ +// import React from 'react' +// import './button.css' + +// interface ButtonProps { +// /** +// * Is this the principal call to action on the page? +// */ +// primary?: boolean +// /** +// * What background color to use +// */ +// backgroundColor?: string +// /** +// * How large should the button be? +// */ +// size?: 'small' | 'medium' | 'large' +// /** +// * Button contents +// */ +// label: string +// /** +// * Optional click handler +// */ +// onClick?: () => void +// } + +// /** +// * Primary UI component for user interaction +// */ +// export const Button = ({ +// primary = false, +// size = 'medium', +// backgroundColor, +// label, +// ...props +// }: ButtonProps) => { +// const mode = primary +// ? 'storybook-button--primary' +// : 'storybook-button--secondary' +// return ( +// +// ) +// } diff --git a/src/stories/Configure.mdx b/src/stories/Configure.mdx new file mode 100644 index 000000000..055a3c564 --- /dev/null +++ b/src/stories/Configure.mdx @@ -0,0 +1,446 @@ +import { Meta } from "@storybook/blocks"; +import Image from "next/image"; + +import Github from "./assets/github.svg"; +import Discord from "./assets/discord.svg"; +import Youtube from "./assets/youtube.svg"; +import Tutorials from "./assets/tutorials.svg"; +import Styling from "./assets/styling.png"; +import Context from "./assets/context.png"; +import Assets from "./assets/assets.png"; +import Docs from "./assets/docs.png"; +import Share from "./assets/share.png"; +import FigmaPlugin from "./assets/figma-plugin.png"; +import Testing from "./assets/testing.png"; +import Accessibility from "./assets/accessibility.png"; +import Theming from "./assets/theming.png"; +import AddonLibrary from "./assets/addon-library.png"; + +export const RightArrow = () => + + + + + +
+
+ # Configure your project + + Because Storybook works separately from your app, you'll need to configure it for your specific stack and setup. Below, explore guides for configuring Storybook with popular frameworks and tools. If you get stuck, learn how you can ask for help from our community. +
+
+
+ A wall of logos representing different styling technologies +

Add styling and CSS

+

Like with web applications, there are many ways to include CSS within Storybook. Learn more about setting up styling within Storybook.

+ Learn more +
+
+ An abstraction representing the composition of data for a component +

Provide context and mocking

+

Often when a story doesn't render, it's because your component is expecting a specific environment or context (like a theme provider) to be available.

+ Learn more +
+
+ A representation of typography and image assets +
+

Load assets and resources

+

To link static files (like fonts) to your projects and stories, use the + `staticDirs` configuration option to specify folders to load when + starting Storybook.

+ Learn more +
+
+
+
+
+
+ # Do more with Storybook + + Now that you know the basics, let's explore other parts of Storybook that will improve your experience. This list is just to get you started. You can customise Storybook in many ways to fit your needs. +
+ +
+
+
+ A screenshot showing the autodocs tag being set, pointing a docs page being generated +

Autodocs

+

Auto-generate living, + interactive reference documentation from your components and stories.

+ Learn more +
+
+ A browser window showing a Storybook being published to a chromatic.com URL +

Publish to Chromatic

+

Publish your Storybook to review and collaborate with your entire team.

+ Learn more +
+
+ Windows showing the Storybook plugin in Figma +

Figma Plugin

+

Embed your stories into Figma to cross-reference the design and live + implementation in one place.

+ Learn more +
+
+ Screenshot of tests passing and failing +

Testing

+

Use stories to test a component in all its variations, no matter how + complex.

+ Learn more +
+
+ Screenshot of accessibility tests passing and failing +

Accessibility

+

Automatically test your components for a11y issues as you develop.

+ Learn more +
+
+ Screenshot of Storybook in light and dark mode +

Theming

+

Theme Storybook's UI to personalize it to your project.

+ Learn more +
+
+
+
+
+
+

Addons

+

Integrate your tools with Storybook to connect workflows.

+ Discover all addons +
+
+ Integrate your tools with Storybook to connect workflows. +
+
+ +
+
+ Github logo + Join our contributors building the future of UI development. + + Star on GitHub +
+
+ Discord logo +
+ Get support and chat with frontend developers. + + Join Discord server +
+
+
+ Youtube logo +
+ Watch tutorials, feature previews and interviews. + + Watch on YouTube +
+
+
+ A book +

Follow guided walkthroughs on for key workflows.

+ + Discover tutorials +
+
+ + diff --git a/src/stories/Header.stories.ts b/src/stories/Header.stories.ts new file mode 100644 index 000000000..046982e62 --- /dev/null +++ b/src/stories/Header.stories.ts @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { Header } from './Header'; + +const meta = { + title: 'Example/Header', + component: Header, + // This component will have an automatically generated Autodocs entry: https://storybook.js.org/docs/writing-docs/autodocs + tags: ['autodocs'], + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + layout: 'fullscreen', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const LoggedIn: Story = { + args: { + user: { + name: 'Jane Doe', + }, + }, +}; + +export const LoggedOut: Story = {}; diff --git a/src/stories/Header.tsx b/src/stories/Header.tsx new file mode 100644 index 000000000..6adf136ae --- /dev/null +++ b/src/stories/Header.tsx @@ -0,0 +1,71 @@ +import React from 'react' + +// import { Button } from './Button'; +import './header.css' + +type User = { + name: string +} + +interface HeaderProps { + user?: User + onLogin: () => void + onLogout: () => void + onCreateAccount: () => void +} + +export const Header = ({ + user, + // onLogin, + // onLogout, + // onCreateAccount, +}: HeaderProps) => ( +
+
+
+ + + + + + + +

Acme

+
+
+ {user ? ( + <> + + Welcome, {user.name}! + + {/*
+
+
+) diff --git a/src/stories/Page.stories.ts b/src/stories/Page.stories.ts new file mode 100644 index 000000000..f7a06817f --- /dev/null +++ b/src/stories/Page.stories.ts @@ -0,0 +1,32 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import { within, userEvent, expect } from '@storybook/test'; + +import { Page } from './Page'; + +const meta = { + title: 'Example/Page', + component: Page, + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + layout: 'fullscreen', + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const LoggedOut: Story = {}; + +// More on interaction testing: https://storybook.js.org/docs/writing-tests/interaction-testing +export const LoggedIn: Story = { + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + const loginButton = canvas.getByRole('button', { name: /Log in/i }); + await expect(loginButton).toBeInTheDocument(); + await userEvent.click(loginButton); + await expect(loginButton).not.toBeInTheDocument(); + + const logoutButton = canvas.getByRole('button', { name: /Log out/i }); + await expect(logoutButton).toBeInTheDocument(); + }, +}; diff --git a/src/stories/Page.tsx b/src/stories/Page.tsx new file mode 100644 index 000000000..d834f0470 --- /dev/null +++ b/src/stories/Page.tsx @@ -0,0 +1,91 @@ +import React from 'react' + +import { Header } from './Header' +import './page.css' + +type User = { + name: string +} + +export const Page: React.FC = () => { + const [user, setUser] = React.useState() + + return ( +
+
setUser({ name: 'Jane Doe' })} + onLogout={() => setUser(undefined)} + onCreateAccount={() => setUser({ name: 'Jane Doe' })} + /> + +
+

Pages in Storybook

+

+ We recommend building UIs with a{' '} + + component-driven + {' '} + process starting with atomic components and ending with pages. +

+

+ Render pages with mock data. This makes it easy to build and review + page states without needing to navigate to them in your app. Here are + some handy patterns for managing page data in Storybook: +

+
    +
  • + Use a higher-level connected component. Storybook helps you compose + such data from the args of child component stories +
  • +
  • + Assemble data in the page component from your services. You can mock + these services out using Storybook. +
  • +
+

+ Get a guided tutorial on component-driven development at{' '} + + Storybook tutorials + + . Read more in the{' '} + + docs + + . +

+
+ Tip Adjust the width of the canvas with + the{' '} + + + + + + Viewports addon in the toolbar +
+
+
+ ) +} diff --git a/src/stories/assets/accessibility.png b/src/stories/assets/accessibility.png new file mode 100644 index 000000000..6ffe6feab Binary files /dev/null and b/src/stories/assets/accessibility.png differ diff --git a/src/stories/assets/accessibility.svg b/src/stories/assets/accessibility.svg new file mode 100644 index 000000000..a3288830e --- /dev/null +++ b/src/stories/assets/accessibility.svg @@ -0,0 +1,5 @@ + + Accessibility + + + \ No newline at end of file diff --git a/src/stories/assets/addon-library.png b/src/stories/assets/addon-library.png new file mode 100644 index 000000000..95deb38a8 Binary files /dev/null and b/src/stories/assets/addon-library.png differ diff --git a/src/stories/assets/assets.png b/src/stories/assets/assets.png new file mode 100644 index 000000000..cfba6817a Binary files /dev/null and b/src/stories/assets/assets.png differ diff --git a/src/stories/assets/avif-test-image.avif b/src/stories/assets/avif-test-image.avif new file mode 100644 index 000000000..530709bc1 Binary files /dev/null and b/src/stories/assets/avif-test-image.avif differ diff --git a/src/stories/assets/context.png b/src/stories/assets/context.png new file mode 100644 index 000000000..e5cd249a2 Binary files /dev/null and b/src/stories/assets/context.png differ diff --git a/src/stories/assets/discord.svg b/src/stories/assets/discord.svg new file mode 100644 index 000000000..1204df998 --- /dev/null +++ b/src/stories/assets/discord.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/stories/assets/docs.png b/src/stories/assets/docs.png new file mode 100644 index 000000000..a749629df Binary files /dev/null and b/src/stories/assets/docs.png differ diff --git a/src/stories/assets/figma-plugin.png b/src/stories/assets/figma-plugin.png new file mode 100644 index 000000000..8f79b08cd Binary files /dev/null and b/src/stories/assets/figma-plugin.png differ diff --git a/src/stories/assets/github.svg b/src/stories/assets/github.svg new file mode 100644 index 000000000..158e0268a --- /dev/null +++ b/src/stories/assets/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/stories/assets/share.png b/src/stories/assets/share.png new file mode 100644 index 000000000..8097a3707 Binary files /dev/null and b/src/stories/assets/share.png differ diff --git a/src/stories/assets/styling.png b/src/stories/assets/styling.png new file mode 100644 index 000000000..d341e8263 Binary files /dev/null and b/src/stories/assets/styling.png differ diff --git a/src/stories/assets/testing.png b/src/stories/assets/testing.png new file mode 100644 index 000000000..d4ac39a0c Binary files /dev/null and b/src/stories/assets/testing.png differ diff --git a/src/stories/assets/theming.png b/src/stories/assets/theming.png new file mode 100644 index 000000000..1535eb9b8 Binary files /dev/null and b/src/stories/assets/theming.png differ diff --git a/src/stories/assets/tutorials.svg b/src/stories/assets/tutorials.svg new file mode 100644 index 000000000..4b2fc7c44 --- /dev/null +++ b/src/stories/assets/tutorials.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/stories/assets/youtube.svg b/src/stories/assets/youtube.svg new file mode 100644 index 000000000..33a3a61f6 --- /dev/null +++ b/src/stories/assets/youtube.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/stories/button.css b/src/stories/button.css new file mode 100644 index 000000000..dc91dc763 --- /dev/null +++ b/src/stories/button.css @@ -0,0 +1,30 @@ +.storybook-button { + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 700; + border: 0; + border-radius: 3em; + cursor: pointer; + display: inline-block; + line-height: 1; +} +.storybook-button--primary { + color: white; + background-color: #1ea7fd; +} +.storybook-button--secondary { + color: #333; + background-color: transparent; + box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 0px 1px inset; +} +.storybook-button--small { + font-size: 12px; + padding: 10px 16px; +} +.storybook-button--medium { + font-size: 14px; + padding: 11px 20px; +} +.storybook-button--large { + font-size: 16px; + padding: 12px 24px; +} diff --git a/src/stories/header.css b/src/stories/header.css new file mode 100644 index 000000000..d9a70528a --- /dev/null +++ b/src/stories/header.css @@ -0,0 +1,32 @@ +.storybook-header { + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + padding: 15px 20px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.storybook-header svg { + display: inline-block; + vertical-align: top; +} + +.storybook-header h1 { + font-weight: 700; + font-size: 20px; + line-height: 1; + margin: 6px 0 6px 10px; + display: inline-block; + vertical-align: top; +} + +.storybook-header button + button { + margin-left: 10px; +} + +.storybook-header .welcome { + color: #333; + font-size: 14px; + margin-right: 10px; +} diff --git a/src/stories/page.css b/src/stories/page.css new file mode 100644 index 000000000..098dad118 --- /dev/null +++ b/src/stories/page.css @@ -0,0 +1,69 @@ +.storybook-page { + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 48px 20px; + margin: 0 auto; + max-width: 600px; + color: #333; +} + +.storybook-page h2 { + font-weight: 700; + font-size: 32px; + line-height: 1; + margin: 0 0 4px; + display: inline-block; + vertical-align: top; +} + +.storybook-page p { + margin: 1em 0; +} + +.storybook-page a { + text-decoration: none; + color: #1ea7fd; +} + +.storybook-page ul { + padding-left: 30px; + margin: 1em 0; +} + +.storybook-page li { + margin-bottom: 8px; +} + +.storybook-page .tip { + display: inline-block; + border-radius: 1em; + font-size: 11px; + line-height: 12px; + font-weight: 700; + background: #e7fdd8; + color: #66bf3c; + padding: 4px 12px; + margin-right: 10px; + vertical-align: top; +} + +.storybook-page .tip-wrapper { + font-size: 13px; + line-height: 20px; + margin-top: 40px; + margin-bottom: 40px; +} + +.storybook-page .tip-wrapper svg { + display: inline-block; + height: 12px; + width: 12px; + margin-right: 4px; + vertical-align: top; + margin-top: 3px; +} + +.storybook-page .tip-wrapper svg path { + fill: #1ea7fd; +} diff --git a/src/types/IComment.ts b/src/types/IComment.ts index 648d88f6f..2ab7525ea 100644 --- a/src/types/IComment.ts +++ b/src/types/IComment.ts @@ -8,9 +8,11 @@ export interface CommentProps { } export interface IComment { authorImage: string + authorId: number authorNickname: string commentId: number content: string createAt: string isAuthor: boolean + id: number } diff --git a/src/types/IPostCard.ts b/src/types/IPostCard.ts index 6c29e5167..643550640 100644 --- a/src/types/IPostCard.ts +++ b/src/types/IPostCard.ts @@ -20,6 +20,8 @@ export interface IPostCardHitchhiking { recruitId: number // 글 id tagList: ITag[] image: string // 글 대표 이미지 (썸네일) + favorite?: boolean + hasBeenRemoved?: boolean } export interface IPostCardShowcase { diff --git a/src/types/IPostDetail.ts b/src/types/IPostDetail.ts index 8afaa1d39..b78b19565 100644 --- a/src/types/IPostDetail.ts +++ b/src/types/IPostDetail.ts @@ -20,7 +20,7 @@ export interface IMainCard { tagList: ITag[] favorite?: boolean recruit_id: number - type: ProjectType | undefined + type: ProjectType href?: string onFavorite?: () => void sx?: SxProps @@ -56,6 +56,7 @@ export interface IPostDetail { place: string image: string totalNumber: number + current?: number favorite: boolean teamName: string } diff --git a/src/types/IRecruitWriteField.ts b/src/types/IRecruitWriteField.ts index e62f3c86b..541a0de7c 100644 --- a/src/types/IRecruitWriteField.ts +++ b/src/types/IRecruitWriteField.ts @@ -9,17 +9,15 @@ export interface IFormInterviewField { export interface IRecruitWriteField { place: string - image: string | null + image: string title: string name: string due: string type: string - region: Array | null + region: { large: string; small: string } link: string tagList: Array roleList: Array interviewList: Array - // interviewList: Array - max: string | undefined - // content: string + max: string } diff --git a/src/types/IShowcaseEdit.ts b/src/types/IShowcaseEdit.ts index 9ecd165f3..59e82e487 100644 --- a/src/types/IShowcaseEdit.ts +++ b/src/types/IShowcaseEdit.ts @@ -7,14 +7,15 @@ // content: string // } export interface IMember { - nickname: string + id: string + nickname?: string isLeader?: boolean - role: string - image: string + role?: string + image?: string } export interface ILinkInformation { - id: number + id: string name: string link: string } diff --git a/src/types/IUserProfile.ts b/src/types/IUserProfile.ts index 045140565..cc6fe4014 100644 --- a/src/types/IUserProfile.ts +++ b/src/types/IUserProfile.ts @@ -21,11 +21,15 @@ export interface IUserProfile { } export interface IUserProfileLink { - id: number + id?: number linkName: string linkUrl: string } +export interface IUserProfileLinkField { + linkList: Array<{ linkName: string; linkUrl: string }> +} + export interface IProfileCard { profileImageUrl: string | null nickname: string diff --git a/src/types/ToastUI/toastui-editor-viewer.d.ts b/src/types/ToastUI/toastui-editor-viewer.d.ts index c57660283..c6d432194 100644 --- a/src/types/ToastUI/toastui-editor-viewer.d.ts +++ b/src/types/ToastUI/toastui-editor-viewer.d.ts @@ -4,12 +4,14 @@ declare module '@toast-ui/editor/dist/toastui-editor-viewer' { * @description viewer에 필요한 옵션들을 추가해주세요. * @see https://nhn.github.io/tui.editor/latest/ToastUIEditorViewer * @property sx - viewer 컴포넌트(box)에 적용할 수 있는 스타일 속성 + * @property typographySx - viewer 컴포넌트 내부의 글자에 적용할 수 있는 스타일 속성 */ export interface IViewerOptions { el?: HTMLElement initialValue?: string height?: string sx?: SxProps + typographySx?: SxProps } /** * @description viewer에 필요한 메소드나 속성을 추가해주세요. diff --git a/src/utils/convertNonAlpbabetToHex.ts b/src/utils/convertNonAlpbabetToHex.ts new file mode 100644 index 000000000..287de491a --- /dev/null +++ b/src/utils/convertNonAlpbabetToHex.ts @@ -0,0 +1,14 @@ +// 주소값에 아스키코드인 특수문자가 들어가면 검색이 안되는 문제 해결을 위한 함수. 해당 특문은 모두 hexa 코드로 변환 및 앞에 %를 붙여야 합니다. +export const convertNonAlphabeticToHex = (inputString: string): string => { + let result = '' + for (let i = 0; i < inputString.length; i++) { + const char = inputString[i] + if ((char.charCodeAt(0) <= 127 && /[^\w\s]/.test(char)) || char === ' ') { + const hexCode = char.charCodeAt(0).toString(16) + result += '%' + hexCode.padStart(2, '0') + } else { + result += char + } + } + return result +} diff --git a/styles/global.css b/styles/global.css index ab1392e89..b031143f7 100644 --- a/styles/global.css +++ b/styles/global.css @@ -1,6 +1,7 @@ /* pretendard variable 폰트 */ @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css'); + html, body { width: 100%; diff --git a/styles/reset.css b/styles/reset.css index 4e96ea02e..bea5f5855 100644 --- a/styles/reset.css +++ b/styles/reset.css @@ -85,6 +85,7 @@ video { font-size: 100%; font: inherit; vertical-align: baseline; + font-family: var(--main-font); } /* HTML5 display-role reset for older browsers */ article, @@ -122,3 +123,18 @@ table { border-collapse: collapse; border-spacing: 0; } + +/* 모든 웹킷(WebKit) 기반 브라우저에서 스크롤바 숨기기 */ +::-webkit-scrollbar { + display: none; +} + +/* 파이어폭스(Firefox)에서 스크롤바 숨기기 */ +* { + scrollbar-width: none; +} + +/* IE 및 엣지(Edge)에서 스크롤바 숨기기 */ +* { + -ms-overflow-style: none; +}