From 71eb4123c58261f08ce64ba9d8aaa15b6dcba93c Mon Sep 17 00:00:00 2001 From: ramong26 Date: Thu, 17 Apr 2025 14:47:06 +0900 Subject: [PATCH 01/12] Initial commit from Create Next App --- .gitignore | 41 + README.md | 36 + eslint.config.mjs | 16 + next.config.ts | 7 + package-lock.json | 5234 +++++++++++++++++++++++++++++++++++++++ package.json | 25 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + src/app/favicon.ico | Bin 0 -> 25931 bytes src/app/globals.css | 42 + src/app/layout.tsx | 32 + src/app/page.module.css | 168 ++ src/app/page.tsx | 95 + tsconfig.json | 27 + 17 files changed, 5728 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 eslint.config.mjs create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 src/app/favicon.ico create mode 100644 src/app/globals.css create mode 100644 src/app/layout.tsx create mode 100644 src/app/page.module.css create mode 100644 src/app/page.tsx create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5ef6a520 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md new file mode 100644 index 00000000..e215bc4c --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..c85fb67c --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,16 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 00000000..e9ffa308 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..ba7a6af4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5234 @@ +{ + "name": "sprintnext", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sprintnext", + "version": "0.1.0", + "dependencies": { + "next": "15.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.0", + "typescript": "^5" + } + }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", + "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.24.0.tgz", + "integrity": "sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", + "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", + "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", + "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", + "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", + "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.1.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", + "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", + "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", + "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", + "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", + "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", + "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", + "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@next/env": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.0.tgz", + "integrity": "sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.0.tgz", + "integrity": "sha512-511UUcpWw5GWTyKfzW58U2F/bYJyjLE9e3SlnGK/zSXq7RqLlqFO8B9bitJjumLpj317fycC96KZ2RZsjGNfBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.0.tgz", + "integrity": "sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.0.tgz", + "integrity": "sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.0.tgz", + "integrity": "sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.0.tgz", + "integrity": "sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.0.tgz", + "integrity": "sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.0.tgz", + "integrity": "sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.0.tgz", + "integrity": "sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.0.tgz", + "integrity": "sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.17.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.30.tgz", + "integrity": "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/react": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", + "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.2.tgz", + "integrity": "sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.30.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.5.0.tgz", + "integrity": "sha512-YmocNlEcX/AgJv8gI41bhjMOTcKcea4D2nRIbZj+MhRtSH5+vEU8r/pFuTuoF+JjVplLsBueU+CILfBPVISyGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.5.0.tgz", + "integrity": "sha512-qpUrXgH4e/0xu1LOhPEdfgSY3vIXOxDQv370NEL8npN8h40HcQDA+Pl2r4HBW6tTXezWIjxUFcP7tj529RZtDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.5.0.tgz", + "integrity": "sha512-3tX8r8vgjvZzaJZB4jvxUaaFCDCb3aWDCpZN3EjhGnnwhztslI05KSG5NY/jNjlcZ5QWZ7dEZZ/rNBFsmTaSPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.5.0.tgz", + "integrity": "sha512-FH+ixzBKaUU9fWOj3TYO+Yn/eO6kYvMLV9eNJlJlkU7OgrxkCmiMS6wUbyT0KA3FOZGxnEQ2z3/BHgYm2jqeLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.5.0.tgz", + "integrity": "sha512-pxCgXMgwB/4PfqFQg73lMhmWwcC0j5L+dNXhZoz/0ek0iS/oAWl65fxZeT/OnU7fVs52MgdP2q02EipqJJXHSg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.5.0.tgz", + "integrity": "sha512-FX2FV7vpLE/+Z0NZX9/1pwWud5Wocm/2PgpUXbT5aSV3QEB10kBPJAzssOQylvdj8mOHoKl5pVkXpbCwww/T2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.5.0.tgz", + "integrity": "sha512-+gF97xst1BZb28T3nwwzEtq2ewCoMDGKsenYsZuvpmNrW0019G1iUAunZN+FG55L21y+uP7zsGX06OXDQ/viKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.5.0.tgz", + "integrity": "sha512-5bEmVcQw9js8JYM2LkUBw5SeELSIxX+qKf9bFrfFINKAp4noZ//hUxLpbF7u/3gTBN1GsER6xOzIZlw/VTdXtA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.5.0.tgz", + "integrity": "sha512-GGk/8TPUsf1Q99F+lzMdjE6sGL26uJCwQ9TlvBs8zR3cLQNw/MIumPN7zrs3GFGySjnwXc8gA6J3HKbejywmqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.5.0.tgz", + "integrity": "sha512-5uRkFYYVNAeVaA4W/CwugjFN3iDOHCPqsBLCCOoJiMfFMMz4evBRsg+498OFa9w6VcTn2bD5aI+RRayaIgk2Sw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.5.0.tgz", + "integrity": "sha512-j905CZH3nehYy6NimNqC2B14pxn4Ltd7guKMyPTzKehbFXTUgihQS/ZfHQTdojkMzbSwBOSgq1dOrY+IpgxDsA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.5.0.tgz", + "integrity": "sha512-dmLevQTuzQRwu5A+mvj54R5aye5I4PVKiWqGxg8tTaYP2k2oTs/3Mo8mgnhPk28VoYCi0fdFYpgzCd4AJndQvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.5.0.tgz", + "integrity": "sha512-LtJMhwu7avhoi+kKfAZOKN773RtzLBVVF90YJbB0wyMpUj9yQPeA+mteVUI9P70OG/opH47FeV5AWeaNWWgqJg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.8" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.5.0.tgz", + "integrity": "sha512-FTZBxLL4SO1mgIM86KykzJmPeTPisBDHQV6xtfDXbTMrentuZ6SdQKJUV5BWaoUK3p8kIULlrCcucqdCnk8Npg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.5.0.tgz", + "integrity": "sha512-i5bB7vJ1waUsFciU/FKLd4Zw0VnAkvhiJ4//jYQXyDUuiLKodmtQZVTcOPU7pp97RrNgCFtXfC1gnvj/DHPJTw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.5.0.tgz", + "integrity": "sha512-wAvXp4k7jhioi4SebXW/yfzzYwsUCr9kIX4gCsUFKpCTUf8Mi7vScJXI3S+kupSUf0LbVHudR8qBbe2wFMSNUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001714", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz", + "integrity": "sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": 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", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.24.0.tgz", + "integrity": "sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.24.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.0.tgz", + "integrity": "sha512-+Z3M1W9MnJjX3W4vI9CHfKlEyhTWOUHvc5dB89FyRnzPsUkJlLWZOi8+1pInuVcSztSM4MwBFB0hIHf4Rbwu4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.3.0", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.0.tgz", + "integrity": "sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.12", + "unrs-resolver": "^1.3.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.0.tgz", + "integrity": "sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.3.0", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.3.0", + "@next/swc-darwin-x64": "15.3.0", + "@next/swc-linux-arm64-gnu": "15.3.0", + "@next/swc-linux-arm64-musl": "15.3.0", + "@next/swc-linux-x64-gnu": "15.3.0", + "@next/swc-linux-x64-musl": "15.3.0", + "@next/swc-win32-arm64-msvc": "15.3.0", + "@next/swc-win32-x64-msvc": "15.3.0", + "sharp": "^0.34.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", + "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.7.1" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.1", + "@img/sharp-darwin-x64": "0.34.1", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.1", + "@img/sharp-linux-arm64": "0.34.1", + "@img/sharp-linux-s390x": "0.34.1", + "@img/sharp-linux-x64": "0.34.1", + "@img/sharp-linuxmusl-arm64": "0.34.1", + "@img/sharp-linuxmusl-x64": "0.34.1", + "@img/sharp-wasm32": "0.34.1", + "@img/sharp-win32-ia32": "0.34.1", + "@img/sharp-win32-x64": "0.34.1" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.5.0.tgz", + "integrity": "sha512-6aia3Oy7SEe0MuUGQm2nsyob0L2+g57w178K5SE/3pvSGAIp28BB2O921fKx424Ahc/gQ6v0DXFbhcpyhGZdOA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.5.0", + "@unrs/resolver-binding-darwin-x64": "1.5.0", + "@unrs/resolver-binding-freebsd-x64": "1.5.0", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.5.0", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.5.0", + "@unrs/resolver-binding-linux-arm64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-arm64-musl": "1.5.0", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-s390x-gnu": "1.5.0", + "@unrs/resolver-binding-linux-x64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-x64-musl": "1.5.0", + "@unrs/resolver-binding-wasm32-wasi": "1.5.0", + "@unrs/resolver-binding-win32-arm64-msvc": "1.5.0", + "@unrs/resolver-binding-win32-ia32-msvc": "1.5.0", + "@unrs/resolver-binding-win32-x64-msvc": "1.5.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..2d1bcb3e --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "sprintnext", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "next": "15.3.0" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.0", + "@eslint/eslintrc": "^3" + } +} diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 00000000..004145cd --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 00000000..567f17b0 --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 00000000..77053960 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 00000000..b2b2a44f --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/favicon.ico b/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 00000000..e3734be1 --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,42 @@ +:root { + --background: #ffffff; + --foreground: #171717; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: var(--foreground); + background: var(--background); + font-family: Arial, Helvetica, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 00000000..42fc323e --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,32 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/src/app/page.module.css b/src/app/page.module.css new file mode 100644 index 00000000..a11c8f31 --- /dev/null +++ b/src/app/page.module.css @@ -0,0 +1,168 @@ +.page { + --gray-rgb: 0, 0, 0; + --gray-alpha-200: rgba(var(--gray-rgb), 0.08); + --gray-alpha-100: rgba(var(--gray-rgb), 0.05); + + --button-primary-hover: #383838; + --button-secondary-hover: #f2f2f2; + + display: grid; + grid-template-rows: 20px 1fr 20px; + align-items: center; + justify-items: center; + min-height: 100svh; + padding: 80px; + gap: 64px; + font-family: var(--font-geist-sans); +} + +@media (prefers-color-scheme: dark) { + .page { + --gray-rgb: 255, 255, 255; + --gray-alpha-200: rgba(var(--gray-rgb), 0.145); + --gray-alpha-100: rgba(var(--gray-rgb), 0.06); + + --button-primary-hover: #ccc; + --button-secondary-hover: #1a1a1a; + } +} + +.main { + display: flex; + flex-direction: column; + gap: 32px; + grid-row-start: 2; +} + +.main ol { + font-family: var(--font-geist-mono); + padding-left: 0; + margin: 0; + font-size: 14px; + line-height: 24px; + letter-spacing: -0.01em; + list-style-position: inside; +} + +.main li:not(:last-of-type) { + margin-bottom: 8px; +} + +.main code { + font-family: inherit; + background: var(--gray-alpha-100); + padding: 2px 4px; + border-radius: 4px; + font-weight: 600; +} + +.ctas { + display: flex; + gap: 16px; +} + +.ctas a { + appearance: none; + border-radius: 128px; + height: 48px; + padding: 0 20px; + border: none; + border: 1px solid transparent; + transition: + background 0.2s, + color 0.2s, + border-color 0.2s; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 16px; + line-height: 20px; + font-weight: 500; +} + +a.primary { + background: var(--foreground); + color: var(--background); + gap: 8px; +} + +a.secondary { + border-color: var(--gray-alpha-200); + min-width: 158px; +} + +.footer { + grid-row-start: 3; + display: flex; + gap: 24px; +} + +.footer a { + display: flex; + align-items: center; + gap: 8px; +} + +.footer img { + flex-shrink: 0; +} + +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + a.primary:hover { + background: var(--button-primary-hover); + border-color: transparent; + } + + a.secondary:hover { + background: var(--button-secondary-hover); + border-color: transparent; + } + + .footer a:hover { + text-decoration: underline; + text-underline-offset: 4px; + } +} + +@media (max-width: 600px) { + .page { + padding: 32px; + padding-bottom: 80px; + } + + .main { + align-items: center; + } + + .main ol { + text-align: center; + } + + .ctas { + flex-direction: column; + } + + .ctas a { + font-size: 14px; + height: 40px; + padding: 0 16px; + } + + a.secondary { + min-width: auto; + } + + .footer { + flex-wrap: wrap; + align-items: center; + justify-content: center; + } +} + +@media (prefers-color-scheme: dark) { + .logo { + filter: invert(); + } +} diff --git a/src/app/page.tsx b/src/app/page.tsx new file mode 100644 index 00000000..84af2cb0 --- /dev/null +++ b/src/app/page.tsx @@ -0,0 +1,95 @@ +import Image from "next/image"; +import styles from "./page.module.css"; + +export default function Home() { + return ( +
+
+ Next.js logo +
    +
  1. + Get started by editing src/app/page.tsx. +
  2. +
  3. Save and see your changes instantly.
  4. +
+ + +
+ +
+ ); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..c1334095 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From d0e5982b96fbdd93161c286da9826e954139eb52 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Wed, 14 May 2025 00:31:26 +0900 Subject: [PATCH 02/12] =?UTF-8?q?feat:=EB=84=A5=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc | 6 + components/common/Button.tsx | 157 ++++++ components/common/ButtonImage.tsx | 143 ++++++ components/common/DropDown.tsx | 147 ++++++ components/common/ItemsNavVar.tsx | 159 ++++++ components/common/Tag.tsx | 53 ++ components/common/TextInputPlaceholder.tsx | 61 +++ hooks/useCommentService.tsx | 37 ++ hooks/useProductService.tsx | 26 + next.config.ts | 16 +- package-lock.json | 241 ++++++++- package.json | 9 +- public/assets/image/ArrowDown.png | Bin 0 -> 298 bytes public/assets/image/HeartActive.png | Bin 0 -> 454 bytes public/assets/image/HeartInactive.png | Bin 0 -> 706 bytes public/assets/image/Logo.png | Bin 0 -> 2223 bytes public/assets/image/LogoFace.png | Bin 0 -> 3785 bytes public/assets/image/NoImage.png | Bin 0 -> 3623 bytes public/assets/image/home_bottom.png | Bin 0 -> 67108 bytes public/assets/image/home_hot_items.png | Bin 0 -> 13477 bytes public/assets/image/home_register.png | Bin 0 -> 9873 bytes public/assets/image/home_search.png | Bin 0 -> 27268 bytes public/assets/image/home_top.png | Bin 0 -> 56807 bytes public/assets/images.d.ts | 25 + public/assets/svg/ArrowLeft.svg | 3 + public/assets/svg/ArrowRight.svg | 3 + public/assets/svg/BackIcon.svg | 4 + public/assets/svg/Best_Badge.svg | 6 + public/assets/svg/Delete.svg | 5 + public/assets/svg/Google.svg | 10 + public/assets/svg/InquiryEmpty.svg | 17 + public/assets/svg/Kakao.svg | 12 + public/assets/svg/Plus.svg | 4 + public/assets/svg/ProfileIcon.svg | 24 + public/assets/svg/Search.svg | 3 + public/assets/svg/Setting.svg | 5 + public/assets/svg/Sort.svg | 6 + public/assets/svg/btn_visibillity.svg | 3 + public/assets/svg/btn_visibillity_off.svg | 11 + public/assets/svg/facebook.svg | 3 + public/assets/svg/instagram.svg | 3 + public/assets/svg/twitter.svg | 3 + public/assets/svg/youtube.svg | 10 + public/file.svg | 1 - public/globe.svg | 1 - public/next.svg | 1 - public/vercel.svg | 1 - public/window.svg | 1 - src/app/AddItem/AddItem.tsx | 167 +++++++ src/app/Boards/Boards.tsx | 7 + src/app/ClientLayout.tsx | 18 + src/app/Faq/Faq.jsx | 7 + src/app/Home/Home.style.ts | 463 ++++++++++++++++++ src/app/Home/Home.tsx | 194 ++++++++ src/app/Items/BestItems.tsx | 161 ++++++ src/app/Items/Items.tsx | 322 ++++++++++++ src/app/Items/RecentItems.tsx | 136 +++++ src/app/ItemsDetail/ItemsDetail.tsx | 67 +++ .../ItemsDetail/ItemsDetailDescription.tsx | 211 ++++++++ .../ItemsDetail/ItemsDetailQuestionArrary.tsx | 279 +++++++++++ .../ItemsDetailQuestionTextarea.tsx | 132 +++++ src/app/LoginAndSignup/Login.tsx | 219 +++++++++ src/app/LoginAndSignup/LoginField.tsx | 116 +++++ src/app/LoginAndSignup/Signup.tsx | 252 ++++++++++ src/app/Nav/NavVArLayout.tsx | 19 + "src/app/Privacy/Privacy\342\200\231.jsx" | 7 + src/app/api/client/interceptors.tsx | 25 + src/app/api/client/requestor.tsx | 12 + src/app/api/services/articleService.jsx | 44 ++ src/app/api/services/authService.jsx | 29 ++ src/app/api/services/commentService.tsx | 56 +++ src/app/api/services/imageService.jsx | 16 + src/app/api/services/productService.tsx | 48 ++ src/app/api/services/userService.jsx | 37 ++ src/app/layout.tsx | 37 +- src/app/page.style.ts | 463 ++++++++++++++++++ src/app/page.tsx | 281 +++++++---- styles/GlobalStyles.tsx | 30 ++ styles/reset.css | 131 +++++ styles/textStyle.ts | 17 + styles/theme.d.ts | 44 ++ styles/theme.ts | 91 ++++ tsconfig.json | 8 +- types/comment.ts | 16 + types/product.ts | 20 + utils/datetime.ts | 23 + 86 files changed, 5292 insertions(+), 133 deletions(-) create mode 100644 .prettierrc create mode 100644 components/common/Button.tsx create mode 100644 components/common/ButtonImage.tsx create mode 100644 components/common/DropDown.tsx create mode 100644 components/common/ItemsNavVar.tsx create mode 100644 components/common/Tag.tsx create mode 100644 components/common/TextInputPlaceholder.tsx create mode 100644 hooks/useCommentService.tsx create mode 100644 hooks/useProductService.tsx create mode 100644 public/assets/image/ArrowDown.png create mode 100644 public/assets/image/HeartActive.png create mode 100644 public/assets/image/HeartInactive.png create mode 100644 public/assets/image/Logo.png create mode 100644 public/assets/image/LogoFace.png create mode 100644 public/assets/image/NoImage.png create mode 100644 public/assets/image/home_bottom.png create mode 100644 public/assets/image/home_hot_items.png create mode 100644 public/assets/image/home_register.png create mode 100644 public/assets/image/home_search.png create mode 100644 public/assets/image/home_top.png create mode 100644 public/assets/images.d.ts create mode 100644 public/assets/svg/ArrowLeft.svg create mode 100644 public/assets/svg/ArrowRight.svg create mode 100644 public/assets/svg/BackIcon.svg create mode 100644 public/assets/svg/Best_Badge.svg create mode 100644 public/assets/svg/Delete.svg create mode 100644 public/assets/svg/Google.svg create mode 100644 public/assets/svg/InquiryEmpty.svg create mode 100644 public/assets/svg/Kakao.svg create mode 100644 public/assets/svg/Plus.svg create mode 100644 public/assets/svg/ProfileIcon.svg create mode 100644 public/assets/svg/Search.svg create mode 100644 public/assets/svg/Setting.svg create mode 100644 public/assets/svg/Sort.svg create mode 100644 public/assets/svg/btn_visibillity.svg create mode 100644 public/assets/svg/btn_visibillity_off.svg create mode 100644 public/assets/svg/facebook.svg create mode 100644 public/assets/svg/instagram.svg create mode 100644 public/assets/svg/twitter.svg create mode 100644 public/assets/svg/youtube.svg delete mode 100644 public/file.svg delete mode 100644 public/globe.svg delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg create mode 100644 src/app/AddItem/AddItem.tsx create mode 100644 src/app/Boards/Boards.tsx create mode 100644 src/app/ClientLayout.tsx create mode 100644 src/app/Faq/Faq.jsx create mode 100644 src/app/Home/Home.style.ts create mode 100644 src/app/Home/Home.tsx create mode 100644 src/app/Items/BestItems.tsx create mode 100644 src/app/Items/Items.tsx create mode 100644 src/app/Items/RecentItems.tsx create mode 100644 src/app/ItemsDetail/ItemsDetail.tsx create mode 100644 src/app/ItemsDetail/ItemsDetailDescription.tsx create mode 100644 src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx create mode 100644 src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx create mode 100644 src/app/LoginAndSignup/Login.tsx create mode 100644 src/app/LoginAndSignup/LoginField.tsx create mode 100644 src/app/LoginAndSignup/Signup.tsx create mode 100644 src/app/Nav/NavVArLayout.tsx create mode 100644 "src/app/Privacy/Privacy\342\200\231.jsx" create mode 100644 src/app/api/client/interceptors.tsx create mode 100644 src/app/api/client/requestor.tsx create mode 100644 src/app/api/services/articleService.jsx create mode 100644 src/app/api/services/authService.jsx create mode 100644 src/app/api/services/commentService.tsx create mode 100644 src/app/api/services/imageService.jsx create mode 100644 src/app/api/services/productService.tsx create mode 100644 src/app/api/services/userService.jsx create mode 100644 src/app/page.style.ts create mode 100644 styles/GlobalStyles.tsx create mode 100644 styles/reset.css create mode 100644 styles/textStyle.ts create mode 100644 styles/theme.d.ts create mode 100644 styles/theme.ts create mode 100644 types/comment.ts create mode 100644 types/product.ts create mode 100644 utils/datetime.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..d32bd455 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "singleQuote": true, + "trailingComma": "es5", + "tabWidth": 2, + "semi": false +} diff --git a/components/common/Button.tsx b/components/common/Button.tsx new file mode 100644 index 00000000..f6f5178a --- /dev/null +++ b/components/common/Button.tsx @@ -0,0 +1,157 @@ +import styled from 'styled-components' +import { Link } from 'react-router-dom' +import { ReactNode } from 'react' + +interface ButtonProps { + size: number + width?: number + paddingHeight?: number + paddingWidth?: number + onClick?: () => void + disabled?: boolean + children?: ReactNode + prefix?: ReactNode + suffix?: ReactNode + as?: 'button' | typeof Link + to?: string +} + +const Button = ({ + size = 43, + width, + paddingHeight, + paddingWidth, + onClick, + disabled, + children, + prefix, + suffix, + as = 'button', + to, +}: ButtonProps) => { + const isLink = as === Link + + if (isLink && !to) { + console.error('Error: "to" prop is required when "as" is Link.') + return null + } + + return ( + + + {prefix && {prefix}} + {children} + {suffix && {suffix}} + + + ) +} + +export default Button + +interface StyledButtonWrapper { + size?: number + width?: number + paddingHeight?: number + paddingWidth?: number +} + +const ButtonWrapper = styled.button` + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border: none; + background: ${({ theme }) => theme.colors.PrimaryBlue[100]}; + color: ${({ theme }) => theme.colors.SecondaryGray[50]}; + font-weight: ${({ size }) => ButtonSize[size!]?.fontWeight || 600}; + border-radius: ${({ size }) => ButtonSize[size!]?.borderRadius || '40px'}; + height: ${({ size }) => (size === 43 ? '48px' : 'auto')}; + width: ${({ width }) => (width ? `${width}px` : '100%')}; + font-size: ${({ size }) => ButtonSize[size!]?.fontSize || '16px'}; + padding: ${({ paddingHeight, paddingWidth }) => + paddingHeight && paddingWidth + ? `${paddingHeight}px ${paddingWidth}px` + : `16px`}; + transition: all 0.3s ease-in-out; + &:hover { + background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; + transform: scale(1.01); + } + &:active { + transform: scale(0.95); + } + &:disabled { + background: ${({ theme }) => theme.colors.SecondaryGray[400]}; + cursor: not-allowed; + } +` +const ButtonInner = styled.span` + display: flex; + align-items: center; + gap: 0.3rem; +` +const ButtonInnerText = styled.span` + display: flex; + align-items: center; + justify-content: center; +` + +//Record는 TypeScript의 내장 제네릭 유틸리티 타입: 객체의 키와 값의 타입을 명확하게 정의 +// theme.d.ts와 다른 이유는 DefaultTheme 타입을 확장했고 여기는 안 함 +type ButtonSizeType = Record< + number, + { + height: string + fontSize: string + fontWeight: number + padding?: string + borderRadius: string + } +> +const ButtonSize: ButtonSizeType = { + 56: { + height: '56px', + fontSize: '20px', + fontWeight: 600, + padding: '12px 124px', + borderRadius: '40px', + }, + 48: { + height: '48px', + fontSize: '18px', + fontWeight: 600, + padding: '11px 71px', + borderRadius: '40px', + }, + + 42.5: { + height: '42px', + fontSize: '16px', + fontWeight: 600, + padding: '9px 20px', + borderRadius: '8px', + }, + 48.5: { + height: '48px', + fontSize: '16px', + fontWeight: 600, + padding: '11px 30px', + borderRadius: '8px', + }, + 0: { + height: '40px', + fontSize: '16px', + fontWeight: 600, + borderRadius: '40px', + }, +} diff --git a/components/common/ButtonImage.tsx b/components/common/ButtonImage.tsx new file mode 100644 index 00000000..04e48692 --- /dev/null +++ b/components/common/ButtonImage.tsx @@ -0,0 +1,143 @@ +import React, { useRef, useState } from 'react' + +import Plus from '../../public/assets/svg/Plus.svg' +import Delete from '../../public/assets/svg/Delete.svg' + +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' +import Image from 'next/image' + +const ButtonImage = () => { + const fileInputRef = useRef(null) + const [imagePreview, setImagePreview] = useState('') + const [errorMeassage, setErrorMeassage] = useState('') + + const handleButton = () => { + if (fileInputRef.current) { + // if문을 쓰는 이유는 useRef 값이 null일 수도 있기 때문문 + fileInputRef.current.click() + } + } + + const handleImageChange = (e: React.ChangeEvent) => { + const file = e.target.files?.[0] + if (file) { + if (imagePreview) { + setErrorMeassage('*이미지 등록은 최대 1개까지 가능합니다.') + return + } + const imageUrl = URL.createObjectURL(file) + setImagePreview(imageUrl) + setErrorMeassage('') + } + } + + const handleDeleteClick = () => { + setImagePreview('`') + } + console.log(imagePreview) + return ( + <> + + + + + 이미지 등록 + + + {imagePreview && ( +
+ 미리보기 이미지 + <> + + +
+ )} +
+ {errorMeassage && {errorMeassage}} + + + ) +} + +export default ButtonImage + +const ImageWrapper = styled.div` + width: 100%; + height: auto; + display: flex; + gap: 24px; + @media (max-width: 1199px) { + gap: 10px; + } + @media (max-width: 743px) { + width: 21.625rem; + position: relative; + } +` +const Bone = styled.div` + width: 17.625rem; + height: 17.625rem; + background-color: #e5e7eb; + border-radius: 12px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + @media (max-width: 1199px) { + width: 10.5rem; + height: 10.5rem; + } + @media (max-width: 743px) { + width: 10.5rem; + height: 10.5rem; + } +` +const Container = styled.div` + width: fit-content; + height: 5.375rem; + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: column; +` +const ImageInput = styled.input` + display: none; +` +const Text = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; +` +const PreviewImage = styled.img` + width: 17.625rem; + height: 17.625rem; + border-radius: 12px; + object-fit: cover; + @media (max-width: 1199px) { + width: 10.5rem; + height: 10.5rem; + } +` +const DeleteIcon = styled.img` + width: 1.375rem; + height: 1.5rem; + position: absolute; + right: 0.75rem; + top: 0.75rem; + cursor: pointer; +` +const ErrorMessage = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.error}; + margin-top: 1rem; +` diff --git a/components/common/DropDown.tsx b/components/common/DropDown.tsx new file mode 100644 index 00000000..b2a43c24 --- /dev/null +++ b/components/common/DropDown.tsx @@ -0,0 +1,147 @@ +import React, { useRef, useState, useEffect } from 'react' +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' +import ArrowDown from '../../public/assets/image/ArrowDown.png' +import Sort from '../../public/assets/svg/Sort.svg' + +type OptionType = { + name: string + value: string +} + +type DropDownProps = { + selectList: OptionType[] + selected: string + onChange: (value: string) => void +} + +const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { + const [isOpen, setIsOpen] = useState(false) + const selectRef = useRef(null) + const [windowWidth, setWindowWidth] = useState(window.innerWidth) + + const toggleDropdown = () => { + setIsOpen(!isOpen) + } + + const handleSelect = (value: string) => { + onChange(value) + setIsOpen(false) + } + + useEffect(() => { + const handleResize = () => { + setWindowWidth(window.innerWidth) + } + + window.addEventListener('resize', handleResize) // resize: 창 크기가 변경될 때 발생하는 이벤트 / handleResize: 이벤트가 발생할 때 실행할 함수 + return () => window.removeEventListener('resize', handleResize) + }, []) + + return ( +
+ + {window.innerWidth <= 743 ? ( + + ) : ( + selectList.find((item) => item.value === selected)?.name + )} + + + + {isOpen && ( + + {selectList.map((item) => ( + + ))} + + )} +
+ ) +} + +export default DropDown + +const SelectBox = styled.div` + width: 8.125rem; + height: 100%; + cursor: pointer; + padding: 0.5rem 1.25rem; + border: 1px solid ${theme.colors.SecondaryGray[200]}; + border-radius: 0.75rem; + background-color: white; + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + @media (max-width: 743px) { + width: 2.625rem; + height: 2.625rem; + justify-content: center; + position: relative; + left: 14px; + top: 10px; + } +` +const SortImage = styled.img` + width: 0; + height: 0; + @media (max-width: 743px) { + width: 24px; + height: 24px; + } +` +const ArrowDownImage = styled.img<{ isOpen: boolean }>` + width: 1.5rem; + height: 1.5rem; + cursor: pointer; + transition: transform 0.3s ease; + transform: ${({ isOpen }) => (isOpen ? 'rotate(180deg)' : 'rotate(0deg)')}; + @media (max-width: 743px) { + width: 0; + height: 0; + } +` +const SelectOption = styled.ul` + position: absolute; + top: 3.8rem; + left: 0; + width: 100%; + border: 1px solid #cccccc; + border-radius: 12px; + background-color: #ffffff; + color: #181818; + ${(props) => textStyle(16, 400)(props)} + max-height: 300px; + overflow-y: auto; + z-index: 10; + list-style: none; + padding: 0; + display: flex; + align-items: center; + flex-direction: column; + + justify-content: space-around; + @media (max-width: 743px) { + position: absolute; + top: 62px; + left: -72px; + z-index: 1; + width: 130px; + height: 84px; + } +` +const Option = styled.li` + ${(props) => textStyle(16, 400)(props)} + padding: 8px 35px; + cursor: pointer; + &:hover { + background-color: #f6f6f6; + } + @media (max-width: 743px) { + padding: 7px 35px; + } +` diff --git a/components/common/ItemsNavVar.tsx b/components/common/ItemsNavVar.tsx new file mode 100644 index 00000000..8844f3cd --- /dev/null +++ b/components/common/ItemsNavVar.tsx @@ -0,0 +1,159 @@ +import { Link } from 'react-router-dom' +import React from 'react' + +import LogoFace from '../../public/assets/image/LogoFace.png' +import Logo from '../../public/assets/image/Logo.png' +import ProfileIcon from '../../public/assets/svg/ProfileIcon.svg' + +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' +import Image from 'next/image' + +interface ItemsNavVarProps { + isItemsPage: boolean + isBoardsPage: boolean +} + +const ItemsNavVar = ({ isItemsPage, isBoardsPage }: ItemsNavVarProps) => { + return ( + <> + + + + + 판다마켓 로고 사진 + + + 판다마켓 로고 사진 + + + + + 자유게시판 + + + 중고마켓 + + + + 프로필 아이콘 + + + ) +} + +export default ItemsNavVar + +const Bone = styled.div` + height: 4.375rem; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12.5rem 0 12.5rem; + position: sticky; + border-bottom: 1px solid #dfdfdf; + @media (max-width: 1199px) { + margin: auto 1.5rem; + padding: 0; + } + @media (max-width: 743px) { + margin: auto 1rem; + } +` +const LeftWrapper = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + width: 24.125rem; + ${(props) => textStyle(18, 700)(props)} + color: ${theme.colors.SecondaryGray[600]}; + @media (max-width: 1199px) { + width: 23.375rem; + } + @media (max-width: 743px) { + width: 14rem; + } +` +const HeaderLogo = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + @media (max-width: 743px) { + position: relative; + left: -8px; + } +` +const NavContent = styled.div` + display: flex; + align-items: center; + justify-content: space-around; + width: 12.438rem; + @media (max-width: 743px) { + width: 8.4375rem; + justify-content: space-between; + } +` +interface LinkProps { + $isActive: boolean +} +const MarketLink = styled.div` + display: flex; + align-items: center; + justify-content: space-around; + padding: 21px 15px; + ${(props) => textStyle(18, 700)(props)} + &:hover { + color: ${({ theme }) => theme.colors.SecondaryGray[600]}; + } + color: ${({ $isActive, theme }) => + $isActive + ? theme.colors.PrimaryBlue[100] + : theme.colors.SecondaryGray[600]}; + @media (max-width: 743px) { + ${(props) => textStyle(16, 700)(props)} + padding: 21px 0px; + } +` +const FreeBordLink = styled.div` + display: flex; + align-items: center; + justify-content: space-around; + padding: 21px 15px; + ${(props) => textStyle(18, 700)(props)} + &:hover { + color: ${({ theme }) => theme.colors.SecondaryGray[600]}; + } + color: ${({ $isActive, theme }) => + $isActive + ? theme.colors.PrimaryBlue[100] + : theme.colors.SecondaryGray[600]}; + @media (max-width: 743px) { + ${(props) => textStyle(16, 700)(props)} + padding: 21px 0px; + } +` +const LogoFaceImage = styled.img` + width: 2.5rem; + height: 2.5rem; + margin-right: 0.537rem; + @media (max-width: 743px) { + width: 0; + height: 0; + } +` +const LogoImage = styled.img` + width: 6.438rem; + height: 2.188rem; + @media (max-width: 743px) { + width: 5.062rem; + height: 1.3125rem; + display: flex; + align-items: center; + justify-content: center; + } +` +const ProfileIconImage = styled.img` + width: 2.5rem; + height: 2.5rem; +` diff --git a/components/common/Tag.tsx b/components/common/Tag.tsx new file mode 100644 index 00000000..7cf46dfe --- /dev/null +++ b/components/common/Tag.tsx @@ -0,0 +1,53 @@ +import React from 'react' +import Delete from '../../public/assets/svg/Delete.svg' +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' + +interface TagProps { + tag: string + onClick?: (tag: string) => void + showDelete?: boolean +} + +const Tag = ({ tag, onClick, showDelete = false }: TagProps) => { + console.log('Tag 컴포넌트에 전달된 productTags:', tag) + return ( + <> +
+ + #{tag} + {showDelete && ( + onClick?.(tag)} + /> + )} + +
+ + ) +} + +export default Tag + +const Bone = styled.div` + width: fit-content; + height: fit-content; + display: flex; + align-items: center; + justify-content: center; + padding: 5px 12px 5px 16px; + background-color: ${theme.colors.SecondaryGray[100]}; + border-radius: 26px; +` +const Text = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[800]}; + margin-right: 0.5rem; +` +const DeleteIcon = styled.img` + width: fit-content; + height: fit-content; +` diff --git a/components/common/TextInputPlaceholder.tsx b/components/common/TextInputPlaceholder.tsx new file mode 100644 index 00000000..8b5418b0 --- /dev/null +++ b/components/common/TextInputPlaceholder.tsx @@ -0,0 +1,61 @@ +import React from 'react' +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' + +interface TextInputPlaceholderProps { + placeholder?: string + height?: string + padding?: string + value: string + onChange: (e: React.ChangeEvent) => void + onKeyDown?: React.KeyboardEventHandler +} + +const TextInputPlaceholder = ({ + placeholder, + height, + padding, + value, + onChange, + onKeyDown, +}: TextInputPlaceholderProps) => { + return ( + + ) +} + +export default TextInputPlaceholder + +const Bone = styled.textarea<{ $height?: string; $padding?: string }>` + width: 100%; + height: ${(props) => props.$height ?? '56px'}; + padding: ${(props) => props.$padding ?? '15px 24px'}; + background-color: ${theme.colors.SecondaryGray[100]}; + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[800]}; + border-radius: 12px; + border: none; + resize: none; + box-sizing: border-box; + display: block; + cursor: text; + word-break: break-word; + overflow-wrap: break-word; + white-space: pre-wrap; + + ::placeholder { + color: ${theme.colors.SecondaryGray[400]}; + } + + @media (max-width: 743px) { + ${(props) => textStyle(14, 400)(props)} + } +` diff --git a/hooks/useCommentService.tsx b/hooks/useCommentService.tsx new file mode 100644 index 00000000..8f425df4 --- /dev/null +++ b/hooks/useCommentService.tsx @@ -0,0 +1,37 @@ +import { useEffect, useState } from 'react' +import { PostCommentType } from '../types/comment' + +import commentService from '../src/app/api/services/commentService' + +interface ProductComment { + list: PostCommentType[] + nextCursor: number | null +} + +export const useGetCommentService = (productId: number, limit = 3) => { + const [productQuestion, setProductQuestion] = useState({ + list: [], + nextCursor: null, + }) + + useEffect(() => { + const getProductsComments = async () => { + try { + const response = await commentService.getProductComment( + productId, + limit + ) + + setProductQuestion({ + list: response.data.list, + nextCursor: response.data.nextCursor, + }) + } catch (error) { + console.log(error) + } + } + getProductsComments() + }, [productId, limit]) + + return productQuestion +} diff --git a/hooks/useProductService.tsx b/hooks/useProductService.tsx new file mode 100644 index 00000000..7d260d17 --- /dev/null +++ b/hooks/useProductService.tsx @@ -0,0 +1,26 @@ +'use client' + +import { useEffect, useState } from 'react' + +import productService from '../src/app/api/services/productService' +import { GetProductIdTypes } from '../types/product' + +export const useGetProductId = (productId: number) => { + const [productsId, setProductsId] = useState() + + useEffect(() => { + const getProductsComments = async () => { + try { + const response = await productService.getProductId(productId) + + setProductsId(response.data) + console.log(productId) + } catch (error) { + console.log(error) + } + } + getProductsComments() + }, [productId]) + + return productsId +} diff --git a/next.config.ts b/next.config.ts index e9ffa308..0bcedd13 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,15 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next' const nextConfig: NextConfig = { - /* config options here */ -}; + reactStrictMode: true, + // 추가적인 설정들 + webpack(config, { isServer }) { + // 예시로 웹팩 설정 + if (!isServer) { + config.resolve.fallback = { fs: false } // 예시 설정 + } + return config + }, +} -export default nextConfig; +export default nextConfig diff --git a/package-lock.json b/package-lock.json index ba7a6af4..e737fa5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,12 @@ "name": "sprintnext", "version": "0.1.0", "dependencies": { + "@types/styled-components": "^5.1.34", "next": "15.3.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "react-router-dom": "^7.5.0", + "styled-components": "^6.1.17" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -55,6 +58,27 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", @@ -894,6 +918,12 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", @@ -901,6 +931,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -929,7 +969,6 @@ "version": "19.1.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.2.tgz", "integrity": "sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -945,6 +984,23 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/styled-components": { + "version": "5.1.34", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.34.tgz", + "integrity": "sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.30.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", @@ -1794,6 +1850,15 @@ "node": ">=6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001714", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz", @@ -1889,6 +1954,15 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1904,11 +1978,30 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -3100,6 +3193,15 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4160,6 +4262,12 @@ "node": "^10 || ^12 || >=14" } }, + "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==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4238,9 +4346,48 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, + "node_modules/react-router": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.5.0.tgz", + "integrity": "sha512-estOHrRlDMKdlQa6Mj32gIks4J+AxNsYoE0DbTTxiMy2mPzZuWSDU+N85/r1IlNR7kGfznF3VCUlvc5IUO+B9g==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.5.0.tgz", + "integrity": "sha512-fFhGFCULy4vIseTtH5PNcY/VvDJK5gvOWcwJVHQp8JQcWVr85ENhJ3UpuF/zP1tQOIFYNRJHzXtyhU1Bdgw0RA==", + "license": "MIT", + "dependencies": { + "react-router": "7.5.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -4435,6 +4582,12 @@ "node": ">=10" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -4484,6 +4637,12 @@ "node": ">= 0.4" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/sharp": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", @@ -4794,6 +4953,68 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-components": { + "version": "6.1.17", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.17.tgz", + "integrity": "sha512-97D7DwWanI7nN24v0D4SvbfjLE9656umNSJZkBkDIWL37aZqG/wRQ+Y9pWtXyBIM/NSfcBzHLErEsqHmJNSVUg==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", @@ -4817,6 +5038,12 @@ } } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4933,6 +5160,12 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 2d1bcb3e..562bddf2 100644 --- a/package.json +++ b/package.json @@ -9,17 +9,20 @@ "lint": "next lint" }, "dependencies": { + "@types/styled-components": "^5.1.34", + "next": "15.3.0", "react": "^19.0.0", "react-dom": "^19.0.0", - "next": "15.3.0" + "react-router-dom": "^7.5.0", + "styled-components": "^6.1.17" }, "devDependencies": { - "typescript": "^5", + "@eslint/eslintrc": "^3", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9", "eslint-config-next": "15.3.0", - "@eslint/eslintrc": "^3" + "typescript": "^5" } } diff --git a/public/assets/image/ArrowDown.png b/public/assets/image/ArrowDown.png new file mode 100644 index 0000000000000000000000000000000000000000..7a907603dbcacc849abb1ec70a8622af6cf5d6d6 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O)#{hlt4Ar*{oFDUXIG7w>V@SUwGk%6(zp=
    pzccIV5zTOGoc0^c!T p^vivC&coz(&*GnAHs^~!u_aEkJL;}}@D9)`44$rjF6*2UngEJha4`S? literal 0 HcmV?d00001 diff --git a/public/assets/image/HeartActive.png b/public/assets/image/HeartActive.png new file mode 100644 index 0000000000000000000000000000000000000000..cc8f80df89304b79e8e545b9131b25c84766bcea GIT binary patch literal 454 zcmV;%0XhDOP)3io)(CGFc!daNcOq6*>_D~^(gCgQK-q1Bjbdu z)2C7c?#(7LbdX(67i>(yEB8k@i6@1$qe4;!B0iR(k31MYhA^r{B(nIqjWe{#zXXD@lR7S+@lUR{CStOT^dGx1~ zB{8yB7Hv(g-s&)n=hB-S^i8P?vYOLu-=crR)Lg$7n0U!>OQKLf*m$V6l(DEH9%^7u w_+~zmzC_2*k;J@=5>p#N^Z9z##{r#u1BY64>@-Rp`~Uy|07*qoM6N<$f~_*Yf&c&j literal 0 HcmV?d00001 diff --git a/public/assets/image/HeartInactive.png b/public/assets/image/HeartInactive.png new file mode 100644 index 0000000000000000000000000000000000000000..99696ccfaa8b9beb71b58be71cd1a55367a6d799 GIT binary patch literal 706 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 z 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 LlldZL9{N83(<3I* literal 0 HcmV?d00001 diff --git a/public/assets/image/home_register.png b/public/assets/image/home_register.png new file mode 100644 index 0000000000000000000000000000000000000000..9576d19ad939fb9546a797688b3e5052a7df81a6 GIT binary patch literal 9873 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 literal 0 HcmV?d00001 diff --git a/public/assets/image/home_search.png b/public/assets/image/home_search.png new file mode 100644 index 0000000000000000000000000000000000000000..ee1a052ff91d07bd9a58b0b3af2b4b0508af78fc GIT binary patch literal 27268 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 H_5A)H3=}8_ literal 0 HcmV?d00001 diff --git a/public/assets/image/home_top.png b/public/assets/image/home_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c31164abf6a939005e2d813dbafb4aa55b0ed9aa GIT binary patch literal 56807 zcmb4qgO%)B%6JToU;?Y%r99xWaU3JT#n1sM$#6trCw6x0tmSimQas!zm$ zZ@6C+^qf#o@W~&)P*GBT(f}W#I%&vDp_Gr%?*PAGSW2o$qM%eof?gT{v5B)nCu^!9Q!E7%_=9p@>c@~9%Dzo0z)7f_* z`M(%v4(q!0QpemUh>ro)>ei1rg?5Yuv5RBfIze$klz&#_Z2oMA*M9{zyI<*p7Im)@bl*Af`};b?t7%d zY)PxQP=pGHjVc{x^`h}f593W4pT!5Xt*xm>OJl2njMNFx9MJvLw(3yVUl06cCNo0| zqLKfw6`CXIcbo2u+)+0Hq|hyVNzhXpFv!;;6@DffL{?G$r3`P@BRb*jXQt(c{kBny z!qn(Y=$A-}m4>%B`8h07g>>Z4X+yfw(j29``3WX){(FKz%qpc0g~R&=cG2ZwHSD-T zO0N3)KogxUs-a-FKUwA&y8%fk1c&0scM}HwrZoB3rdcDv&1`X$ViX^-LEQmH;o5kv zA0;~oX-$Pq%Pm$<4S&o&qLd^SRmw)7s*j;Yis14 zfYiMh!2dn)G%L)w8Ml@^48QrvM96ajm+VOvh(C@j4wiljHXyh~r&JoSRn%XD6t7$Z z%J!GHeEx6BJ{0zu^c=fm&jsJE7kGa^Zpz(j@;Bg|^IozwX?2Zrm z?&`SqF3Zp)qL+i0xF3+&@PC(*eDrF;}a?tjnr z|LD-8=GhXaR$N=`79c2wI&U_s0O$eM{huC)DDX6UM&Es?EH;Mi&rQ+k`GuAK zVSrz`VGJA4f$}hpA6;gYZj)p1odK?np@Zyslg*@}Zq-LjL$4EAkw2ps(`~lOhl7TJ zcfHic^sw`)-#JH|s_AjQ1uLUjJ!4mz1@F85^@QduAD|OSF0WuA%qajLZ^obkcF6C7 z8k&V^=&?b0dZgI6Tde!tm^&E3o@huPe)^0?5vgJ5*v~#@%pPa;fQ(h`;^tn-@Y=O@ z*YMF{L2@J7W*73s}a=F}!kmTSzM1_B&tFJvzRU$)n?IvJPYzpd9*%fXw8-cGpJzsu8b9=jqB!ut{cX!VS}3-T0`@9e zzTL#Su@A_~=`D63hOz&R$umXWt=P&2)$~?XRRum;5c7W)1Y8B&QIe2&Xyt(PPlfKf zmw51UjUn^E2Y&MFTOT=#L)d5Dh$Dyi9_@9WZq(CmEL41Hy+LUEj$Gr#lmSft zr{)qfR2QDHYOo9=X}?%$_=miu-c{-s@C-M6oiL#LaK9fOz^uG&)z@-orgGcwH{i;84Hx*+r18c|OYv%Gf%|zDP zDtqvVKK^xw@p?EHxRy`~*V$a`AvLrey@O9eFLye`F%r=uaV@5oz8sPYZ6|#+IfJV= z5M+x;moH=y89b)trJc%aYWC0Fd~Z}4@I?b?W;-5cJs%B%ZxZ=<;-hd#)^;@wMmz4N zMfGxpP&cU73}%$rfBwH%t$ueM{Q!r!E#GsluJ^|VSTlqYF_3v)?l&p?B} zG$6$gnwmZ3DKz!2nNByiL6mNNS@#qk2;9B)KOy5QDcf?MB>JY#G>`Brb9PZZ#z#Eh zLmn5>c-DjCt{2ZHbG5;tt;eRqqe`jgKsVW)7GJ#1#*HyNkZ(N>TCB^e-cMfRrm~ITjk6lroo~=gm{piqnOYBfkTMESl9z)dwM3AI( z4n3V)qHUA7r@rfB^8ZF7Ls$9>(nAU|d_>5$0c(W7s-z+=OUj#HkR9t7dB~pMvv99e z{8(7KDcGRd`Yxo_(`z?ppodJzf9Z zlcOnf(-ZyXSuo<;AK232>Koz>#+;zrvWBJc{_M0~z|g$^9cD4vmdJC?jJSj|><+@K z1t;k5h_g3wRvib^5>&WXk>GY55rRk21sMJlo!|g89)EE+k%827m+`qo6Iyg;^;+4a zV;x(P{4Wg_J)ZG=PAi?5azlf|Ss(D53;4unWMOzAYl9bteL{AdG)>IM`^Q9RjrJJs zcVIsfXZHPGN#UNi&UP zWyCLNcX3vIW5>Wp`j1uOsE=ov1vp?yhq6sA6j{B6l!iW+Td!&qj8V=w-%I}6ex7vS z_1sD`V$|aB1CXMa{*zfTSI|54ZU%*y?PqG>OYG=Qa$<=o7bV_TKLn`_QJ5Zd9yo5q zZ+9`2#U9YYnmnweLt@_zJTB!AF$RK~NUl3=4Aa$H{AAHrq~Xe>Azy4x1@0n^A86=- z)L=4@BXjeBTwD$n+%oN)lF6B+2 zzn;kW{%>cpGEP=*8Nd4pQD>zm6u0vr9Z_^V4@*PS0_p>X^uuA6b(?5$p6%v z6%Q8Fh-I=gg7H=tCa(P%1S?e`Q}?lAGlLNFz9&7$|E{1R!Q&z2{0&M~?Sw!y+{JjT zq?!YMZI~12ckY+ixct~{V~o>%7@`)(Cic3O+%{jj+-&G9s9!Len#?1!-qO|3(%=jchIK4erq=)^ueWczIv5FK(k377efSgHGAHR2m>P$23?17mHkl*RsI zl3aXDbjrUco+T#kuvT>5g-@vA4>Y&$i4u2PN<6&Yc8$Zl4{?J~BXXuwO)8lZ${`bc zAH8KFF8+(k|CJOIW3>Ytd5kP+*_bWW)o!W55Zv=+xsQ;h&eAn4z?q9E zsdkm6Nj`aonD84h66-+eu|up$%D#9MH7H!EfApSqYbT8MJ;L4o5GVXV$~`p6HfE#k zSVV2dHr4Ph%SZIFm_xyL$>(G1_CgO^!Fs#!w1FUYalAN4H0wh%9eAmcnkN5!?P{-F z6x9xexw+2Ad(r4O^xpMn)!!7q8n+`gW}JsbSJEVIK2>hson>j&#^~yhD>eQ7L}M`q z*qbU!xY<&dDEySTBEAD&GRMI$hT+73dO2y_(u%iDz}9F4-+OGY9%lIm&Fb%EkZ1z4h3j()BN z^(Mepa%HnP*n^{yL8oIw+a!tB>Jno-n6GPwATIdcntMuBHT|1-JhX-ExL_S>9#zqc zRv~j0v0*98Q_H2!s5dlSmYD73U0aqWzBF&5N3*7{8fksj*e zqV1B;Shxq`g)8=WW*b&_OO7x?^e~3g--@_>Mzb&y$4Uz$+Z$WnnfOxu^^0*)5JJyV zcG+O3UIQAZrW4Q>T&V>FS6LveKWFpVOqImY8BECv@*t%RMk(^@c4@R{t%&FZ(Qw1# zjc;%S{J+=}jnE4loXi@OXnB%T^E`)vnmrm#7pbx>F&9qsk=pE5SO; zgakDxDb^~{GB;g0Pd7LHcMJpAy-(IP5VI^Z#UuPf*(O;_(ln+-U0+_HI@9P!(DY8y zxgUR|l6hISGi>-T*cudU9vGtwW&W&XNn_DfsdnU;9k0jV*nEkbN%*!CqrBwLjB2F~agbz>iWUFwTp64U^}((Q=_npK!araaZzCFy2zQ0kY9K6T(?s{}zvQ!5aZ zSojxzS6@&|^7Etc2K={&u!Pt9&o7wCHU~Q1IGVrHwjezSFSFox#Y8l3iNYzzqF0g;{3WIB<DoXIct3Xq7ZA^-Z;O&iLdWt0)2xoI1SWh0+^T0Y|o7Er~N)$uY>_`xh74|6&zp zQ$}k46qiqZ=tx@xvJ*G;1s;`$S*N@P zRPHAj`-tGplRm^dEtNB?rYkr=yt@@fEx0sS2tW6QEY4lViH@$}|HhiEWs zMJs{)`s?wt5A$AAf1ET8t9-njeG)4=YT37nmbB*{n)AWX5k6mnp19y(Sb$!#EQU@h zZe|R}QCTR_M;|Q3g6MbtK4jfHvETTwk~4&9y{A-4Lu2?qWsO*s2V-R~NfqD4(uI>1 zEF*sV`dRk%t(+W*F-s7?io#J=odLjHXiJ9hH!cr#5`-m;{-LMIuSU;|=Vl>|~yf2L(HY<&(b*wZ~YK{xj= zy$2c9U}tcmv?=1X8ug57n!iGB$?KSSB4Z9w6pah@*A5ICRNqfRa!&!6GFflx?NWrCqu7}L3F zTdON^7vICo6C77MUlhiVuRkv&mvvb0uj@Pqg?P!I^i56<=Fr3d3O@qas62!ss|RPx!sMoxGdFK54-=eGC<7DLG)h`|dtm!Kkz=pv zEw<|EfkSx+mPU#QdR^sS7ql+8B~taJH$3%#*qCs4Q?l%>CNW$yk)y}S32@n5A!OSz zyJY!LlW%3aZAxn#Ki;cI^A-xW&d0k_{T-Iko3w39#@pK5L%t|g#9^Kh?&4RD0E}?< zPkI#NRNI1Eg&|VgQXRQDA>VF1=4(g_g5cI^aHqj?)r$+%r~|xTd6JB+>@kjjmc;hp z>pS(SZxyZc)r=jqJ(nrGwwNAJZSvq=SJaQ8|J|6A6a#pv(9oFnGy=A9Q}sPw@7Dss zQ2UKnuX`X82FkeBpS|zuJZ-)%nkEEvrxh{!*5*Xa{_->wKd(s28=*Hk0$&SJ92%C4 zGQLb`Ha)WnBKR}-Kc?Xr;Oaq7ZEKj(#Y<9v>Y(Wmg6 znL4$3y5gl_ecI7-BqY_OCPu)?`krQ*Mab@NEGNfZCY! zB3_NfPKDGLjoR#wSQP+?+;G`OrGarfHBQ9>DzH7}nda|ID3|g2Glw#-KelP5Mc=@n zzZn9w2cCBHR6ReO`25=`waW9wqIa45_ca^4R`w#%3W@9WlwGw|hxYW9GfSXRIZF$M}Rhr*l;SXujQ zb_8x-a2HJZ64c?v!uO;Qrcu=Fp|)3Xm0=LnB?t{*w=^bjDUe=f8HE2L5eWNI-&Eob z?;aLf-o7(xa%4AjTWrbHR72#kK%gzin?2xXRTCSBczq1Ql3M_n@`>Gb=iDHQJ}slb z103HK)qYg0bfyH12$}sc>APg!w3QRoRQ;33RJ_rZmEe!+1zRQ~PoG)#9X$H*308h0 zmsDWkq|_X|KZQp-x1Kv|{(b4|hkym|fdg~q`S}F0M--;71jfH;=AF>pV^a=J;(pMD zAd04&pD77zBF4O*mhA>6w#wpNDzWM$v};kzb$jhJGlf4citXYaYdvW)Iy&9|(oUX~ zR;EmRci5TNV?9P*b3WbclzW>ZF7kas>WHSQ7~ycHk&u?D)3k==BY2Boq}t`jb74sj z(xV$tZKGGDnZCIkwdt+Hn{GJu+Lm~DvF*Fqyou+O0VFt6n|$rDx<~k@y@)xyD5!)5sAQvJ%p{G$Rrx%G*VkE zC)T4|5xk=yA|`Qyj_ZHXpzS0J@ZZMG0DP2zQl0X26wo>SZtuq4lr)4Z-VdnC;?JvP zA&9rry{cl>uG7~VEbQYvZDJI*x&?+R6k5m)2JC^~U4eIf;`tX`rgI~ZzHV*;TPGNS&)&)@bIFk2hO^zHIw`XGM2lz{P4zV=>28-mx)o4gCaWh5~D!nIjCPL#c~ z%|R)#1l7{+2SePGuIUaz*z1_;?B#UGkwiB?x9}?b$Y(OADWWKRK8J_lTTz z-=Gb4Y*4o?pB^p-2hjNii_|CtuwU%$A~y(yI=2{StYz#=)K_bN(nSnxm1B2cwlE>( z-7WUtY9X|#Zmx{oyk+;!^KE@<%Yts?CC*JB$!!kUyga0;)MvG#^3G5fq&TX5DgniY zE5&Yde(OH}chr+y_1k3gPb|Oh9ZApxXOx0YA^%IT7`h8OX2sq3{a0!1Oi=#;8xGXn zvONhI2@zds>v)6ad)|S>euMnGTynE16?`8(kEB_;D)e~{^#^}WUwl{th7DJ6IA0mTaPmRgFxL+lYnQZ;R|2JCz zLHmdrfO=0)fCk>satpV6DBrP7yye1oMB;JcT%ZlgT$I=yJO9f84qHg+c|dSJam;T3 z?SynnL72NCYMcpN%ll4z4y9|mqL5_sF$a~2}9FOEado0r5 zS^gOJ7k0J-lOF-rtU8Y;gUesve!0NDr7b@d*X3Kr-04v^ZmmaQcxhQ}aY+GPRI?rq z)@@eupI2W<0QbSUc-iF4zj~d{oJ6#1-yeoyueQByP8JV_2}4qEBbr|qX+HV7wp%id zI#Gwi{6X|{SmeZzQbpIo$&Dw~o8tp$7iYsF=CGXJM0{9z2sYy#mDg5GXbx^(yqXXr z0CfaTdn&a3O0>+7y><^m0;$1qT~g{(=NnLv6nXM@sr%1>Gci}HsglTN%q*6Hr__0B z!jid@GTu-vzLB9q#&1b4N1Q!l6m>ec=2Dq-CC*7_D|A`j>vnd3Rjzr4mt-%4cOj-0 zx}i~%lq$@=cUCfrlfpX{pJ#wD({v-=P(}9J`O+hDd2C@*1|PI&1YZl-dc0#F1^UQ$ zbnaWxNUKdvG{NT=PQ?2W3DCRijvJvOe&1_}2hZ9LJpqke9=ySX?(w>ktnmGKDR0*Q zeBh#2Edw|2z>jQgte8hW<2g@F5^knr#?4QlKDG+5Vh`}2W7;dB3vPZ+!#nZE8N4?7 z6mKw5D#!hyr9AY(=_*5D*z$g@`F?#s9bqnb>nF5I9!cE!R z0-Blq60P^``+%x6?{ZfxD=vFM7I}4q zlUr1?E@4XsJ z*rum0MEXb`r@crSk0 z#<`*+e!`?NA5ZB$>`~>eP31O_@7Bs%-O8i%TDI+2A?6|=7t}x(ajNrRo*WJ9AW>{u z@Uj^^AkX%B9N!cXe6MGWFXvm zSjuaoZbjVX#(A>4`G>-Eq0;&8K>hU-{lN z>pcnhpoI|Qb0AUnRDb%wK-rWd*z!Odc{mWCPX#}Xvw1fl@|>k?_X=&oMIoy^-AZu3 zKY=TlAF(ei5UY>b;&`QooSDSaG9Ozy&5+R2X1fh&q2;-j;+?BYZ%{k}cwwEZhA8cx zm6S8Hj5@TGaEhHbj4ugd14OX`9=X)HBsXb%97_(?5*J}nT*(JVuAeUNwV=<+exHW# z1}p6z6nYdkM2;wwz<3Lt^qMcr)R=y`8n*q@Hfbi~p3`II6**sQ3p)a!%i$S%j* z#qX_}$T~;6%Z{!jA|4 zifn^V!&I;55h31%CuUM5{PcD>|B>%l_^w#+wn!<;t^XkRnL2@EK}ZP;p9}esm)DPObJp zV;p;%#!q}gW8Pi46;a}cPn!s%c6+hAKL$(Vr$TMd5)_nfI#ULerl*qaGzyoAfQ-Zl zf{Xo%;dDib7*?~4`x6z^RO`co?;;4jEgj%BKNU>!-q9-zwz-4vRi!s8vT}WDGA7wC zSQ2dgN2p`R75=40Aa9w&mk8oCJpb=3Z9MTtdyeN~frOWg4RG6x7u*;DNmgbRX@;P#rP!_V%5HWjG~um~7jf~Hw&mBk zO6AUP;@U&xB^tH2P$XO`#Q0#dsaB`McCCe7ioYqrEJl6bA6z8wh{M^&slv{2sdfM+ zqf2VhQoPhQ^vTGu%w8&Z%1)-KFHSmq8KzsrQ&C`KK-*}B^2Ou{Jj&gLBp+SRcQ)Q& z${27l*{u+Q-@bkZ^}?oEP1){+^MSw1?==k~$KkDQM@NhfPOwo$7?g>bWK z8*@2;e$P0+z2)V4xKPBnAG9$NuM$A$&*J9o66WpZn>-hySIpIMEYsshiKb(t~!1F^Ff)`*`}tQK&0zH*Kw<4{MBc!l#_Rr@(89j}1A zCuQICN0FP;n44dN&p+Ba*(b}F*?w)NB;TkNk4HZ-`F#CNl+S9Cm5#Z(lp8gz{Ism! zG)g4Xc@yJ2o^)4{1UxlYHs-Utfl&twv`&w1quT5m*HWV~)a!Vcv$2g|j_GsYI-djD zQOuQ&XMtob7$X(+C!q`o909Vr=HJQaq2`Ok{yUI31!#<*H$_r4mxFkd*Ji>~f>)}m z`&blRB%`SM7$(}8)2WkK%nxeY2fIn8{=#3gQB0ra`uW~s;L!)89fDK{59d7hwlVmX z>AFkW&7OWcCH*0{x88^ z)Hag1D|vf9xu27oK7q9l5`M@-5>-EAF*K*cyjXF1#>t%PYOnu@aA5E9FN9Lt?TZ*s zK28e7Y`GJI$k^fWCQyNw;5Lr=zqlqa{EgFU=lkC3XuJMqy!kwZEss}0f2O@=@2IR1 z?Szt-Q7pzjmeAoYYUIL^fofpL1?EzRB?1Kzt77 zd+O-HO|b8e+1Pq5Fj!n}HA$zGJVg?IUT3S{bVF<~fjhl$6>G45FwUUCO>DjA_Elj) zclAhW_E)eaDQ8$*P_%gq*&5DNd3yEVNHftsH|#JQBnrN3{zYXpjBhmyhI`R{T4S5O z&uzhhI#52Kk(zPy!zpq!CX=GWZgVRc=ZsJzX&Gg}@f!)4T@O*;$W^hcHvf=_idlD={dOnTBI|Qf&^DCa1_EDFC$>+hp9@?OY*P}6EHyyIB&jFo> z^p1HO^p0`5_LzJzG`d)Hq@VdHa}&^MO2Y-3gXA)BQ3?I|J+%q|tjGD6tS2VSVZRLc zM~RiM#<5r+4xIeQSlq3BnIXR~IT)=s#9v<0 zzyru818s#8(khD*0zMpqH%fOEllB03`x3Qw1SiQa`3t0`?5~aWAFIh^E3vEX4J8*n zx8+Y5I>w7J(Gc4Um8<`zdm0g&edQ(PqY^h-r8FDiVD&!1tVM;fdgJ1;SR};5Y zPO^9d(?D@jZI+2>cj33?bbU`3m}QUD1~lKCh+QrIc`4h9U|)c22M;-#VXL;7GL|wA7Puyp7scF1j42qwUJz}X>9CU*4ey~8} zTB(cSQDjIj1@W;y)_}!+}*gjy}FRo0Eyf+ma;MwYOb? zg%g)0Kt-<236--O@nzx@6B64e8hhf)jC>n?;Du+MlURb-2c8-bmlrh5Sq)t6N2}g# zNWWC0M?dSPvwli(o4g#W%*7{Fg0nf-jqS^fQL~C=g)-l;Os4{}&= z3ZQJDolO((`#nzUq=cUu=uEk|2Jg_{jOb&bQ>QH#3yypD<)Ij2i$##_oURd>$4zOU z;hewG{JI?OB0JW;zAM~jA9+Fhw>rn*fpYg9ItTq*nC;wjU+WCTj>w+FO`nRK9VlFd z*mwH~=qAzv82}GHq3R9r1zOq;?BloE5FF*#&u)uK;`MS5%!FMnt!FSsZ^r$>F8aPZ z8)&qDv~(a(!Y{N*MuvfoguLVsulqH^mYPo5 z7S?a_zOWj#RyXl5SU{PmHw_cRUZfcO^i4G& zLVE{oi{~}pMQB`VP)AA8y=fv!QXOt9?k0803{g9fdrX1am1dI>+tHYwd+KQ3{Y@p= zxH)#Kn^LpmEiCt9y(rxbuI+{VKFb#P&8u`{kW=>RMovDiZ5&tS*_kona?inbt_-J- zxbh4bV~w>a`tObc-U@|giY*1Zl&czj3v&AS`&g_eRSwEuvcbrG53O;jbXKVf0Typ}k0kTxN28-CbH7eL|7-u8^7;;yfm+Vqh$W z|7>Qo{|II_N3^SAOPMHYA*ZdbjLo7POHXk8tiHQ} z0jyQ)o(Uz%o?)2u1Y`7%&Km?+d3DU_cuXi~vCi!^iAS_{D89E${RirPIqlVZEkT==K+B{58t`a}(!Z*^CtNmybCeg>Ig2ss!r)M4C}j z3n2GL@C4YrcfHDeEz*>3h6`fMy}kP1&HUlxS8g+LvKJ)iUV3h1j#Ts#YUQ3{LElI3sIM~dRveY48m! z2#keXT2`R3_uYnQ|4E(Q7^9OF-Nx+=qu9BUBG&9Skw-a%J%dlqU#Hn(Q?jH))xE)u zQs7J=sQGNf38Fn!+0{B%%AJ5wxS#J3-UeK?@xy3r0lu1 zLS>30JZoWsPJ)F z#h=SFC40G=xs7eo6@woiDErXLNfl&Vfu07x&k~HPuqrSoegEC~^H+|sQjS*Dl;NkY zrCVrzxn)k=3TkN{5MYJsW*$WGDBtz~`UQ9>j%a{a z1*ZCLO{)qwUMH4&+fp*mFRQjqQn^Iw6K(=Pyr!OVFFp+8cHvD})9W)x+vlR#1&g?A zJ^})i%PUzhb2qzEX6Ayfh(X-#=U87i#h9ft*JZ z=@}%bCCU3=kFWbTrp^mRa45-&$azjnrAPF)7RSkzudykK{aBRLofEh@%Kw z++re7`6;Yc{PQIwXe1(PCDMb(@xQ^N($AkO;wKauxb6wBF<**({Dn}AMV;M!{72uL6+T`QOxMEBr7`jO8<%9 zVA~1X2^Q$R10BLxN-)cMmxt>iQ_(qz1HRaahP~p zE6%vF$_u;_?Ld?0+oO@W{D);xdW9EOcINKw%&sw+VKnvzMa*-eG@J;g;$maUxlE$$ z)!)EIq>Lz`i>xQ@?>GAZ*S=(1{PhHKg#SZuk~QOuZQ1^tmH6}O^S!eP+fLhu6srt3 z#?xhHn%x#cntUwXLNEsDA$tBN?zGpaH4-$DG9GM0#*0jP-De4^ABLDDDD-9rNk14? z<)yT0F~dniOi1QDHLTN&iL_PWG7}limk_&?0Ji)bwQR4FyZJxme6tGb&983+OK4tu)B4ZNN;VHv*=(5y5>>t1M_Vk^` zIM6o{HolqqWv1;sg1?t^85DejroeGp#h!<*o^X=Ps@e^(byTfh+4}K$^gx?GWtpE2 zQKSt^U`hSUwdsijGN2% zyoR5~1Ey)S!!gtKJ6?Xvw=FLCyerp=-jDucw0xod0gq0KZOY|`8=LXMn^E^p6{QYq z!P#d}f{z~7FRLF!V*6dgbex`G=Ywb{?8ELm`d8N# zI6`UN>~xHNcQ2fgsbZA7suu9n|B98_`4PsEt5^Ko$X9GOa*DK%EvYo7{EF_%6@|6? zVmzjguun!|=`-HpkEnk8O55J2V(+ZEQ#4cl*>6jQ96e!7q2(g{l%dP>bm1w!Nnq;- z>D^5gD%bU5YoqOF-MD(DeXPs(Bv&Dl!i-_#?TDS4%R_Ssq#;RC1b}NJsvQ@f+NM&x z8~aqs0_@h&O+DdUU$^;Cen5YCi}RbD_+ecpNBL!juil0qF!Kj=g$-P7pzb|%uj0B* zh@EK^D}8|h`F|<4OGL_lv*+TfGna>_&UQVP(T|v76|=2gjRNTAv@oX;f&l$2`e{{< zh6pj?{GP()tiKc)Q%$nev3)@K1ThfJns2e6jSa&uw1?G=T3P!`1z- z%2o?SazcFeA4#=0bWBp|xP>ET)}8Rih~v z*UzGZF)4g?se23VIcP$5+Rl?c=K9QyMQUsB_FUl6%v8I+a z$WnHtoO@dv+JYu#Nj-YoJu(<=lgWJa(cxl1l^-<-1|o?_J&A|2;W5^$U}la zDbKkKM9MxC+38H^^xG(?iPq4V!n=eo2svHGLnl|psA>PvMiA6?ZPV#*zJZQA6JlH5 z&M+7Eh?-gF)#W?hY4Pq9%80h~I`b-ij~?i-dn4(5a<`A3Dx?$>KQxl>YOYfM#m(Cw ztVe-mI|w({iL1_pT!&`sX^mk{{V``2MnC!Um6q&9%DItLrPzZiDz^+298Y4Bmffec zq{jLIy+?OLI>b_;C*)Uz#Df#9(t3X{Uhxhckfnqh#JnCz2<7!Pz1pDzNh(6FU3!C- zjRICi+QdLJp5yXjRY}k=j?FBXplC(Z(lCaS4l0}r-m{}g*+Y?#0jb$&7x1LLc?JwJ zEq$mL0vhHy!ObboH^3`ZVaVEehRbXZ@&rP zAmo$av5i9!g8f@w>#sb)&Nvbd%Pu`HCfxk=e+bNxWqdNsePqzLb5m_7ejHg^-BtRmWyU=`F)XT>8kj}4r0a1Ax zT;a%5)H_$kk*f{!wBm0h%aqGvJSWs9%Jo9q7`AA+DGEhB#0#21gLJb-zoEV7F7H5! zG$Nbbs;rKlGA2wP8Z6(uTJU{HT!9y9%5tO0Nqq(FGO(u1Q3bJ(Nf!xnqLVIlzwUex zLMj?QwNj9jBA0MHm}ESvUP z**Ig4mF1U>!_ayB?H@BKmRm3j{TMVhDpH)!r7UO7v*5+-fm@mz?KzIlitL#3%cIhv+vbmp=!+o~Th~Lio6V zDW6H_HH1#>7JO5}GTGT%*0(z*HS~5dz>E5&>P^txI?P?g7=Gzyh^_W?j0 zF(4MlA(ptas;!Qu*h>DFYe7RDeB5`kmA)2k8@X=T;kA}-<`qSvo$*?jj~PjXQU>#X z_UYesnI?W25$d^Y?uxRUAe8+AO7W*^ljc4xKSR88fsrjBc5eB=jh0pTq`%evp>MNd z3D0im`2J{tjAaQm>xCKF73FIF4+^YC@vW)0-nbI}tYL>6-0(d|v*_Zr(|m9h3yeY# zpKh7o@JblZS5T~{VW<1Tc=+)*?~U6}8sRF^)~e1r=N7mwY`34k#E49-Dt?MdOb?e@ z79=U4h|%qm)!zS>#yGw@F|7A&@Z9Vj3IjCk-*&^&L!HWK2p5k?+)aHjmpv{DTGoP*{ac2Ad%}G-cxx%vnka8K^T#JeunEq?ix|;xt$JlCt zK@e`t-WS^jKK8ZEN-9tR%Kyt3<^!z@$2w(JiCIN8ZCCdH-i>R#&K8XE(^-BT`uiGL z{ewvaB#Y>Y{_~gh7_O=M&H?#hy)OXWva4EX5kqNX`QtAS#u~8rEAcN#10gZ5t!4+4 zXVo6RH?uS(7*&%~P&ms)UA(ec1z#|{s5GwhJGa1g?oSG^U|>Lx!F`Cw?)PagVfH41ss zjjY$fU}d(KdcA7k=W@>Z@eM^jsD};9^oQC`#7Tgk%Hp%BdF}sH(qKp{euVyS8TYi+IX<+NHXr;jZkf@kxLZ2J9C3R^wgn zaw(P+gG!Eek9G<&La2@3#O>&`n_Wy+daZ$FGoqvs?cGzM5>@qf^I9#H2;0<1Q<|?u zM=&uv#r?YP%vmwl38Ej<6<-_k+YAbY|2}lE$J!@0{(d{<#@~S2cY0Wgoi042Rw530 zKQ8)QNbsSQRq5n<8hX7~Pr7@waFR}%T-36@{JmWW_1~cLRU+S1+-Fse$oy$Fw^x3D zKzX(COOyvU7R4Gyak|tH?x}gjLV19Q`yvP&cUnoYJ2+3r(9WFM`j)lW#86e%Q#q}uJ~0i#S1NxX>?Q#$3XO7w~(#E4C*Mf4RLsUPK9Ve zqmW#eFY`c&H(&4cb`JF!e1Z$#IY~FW%SAyRWg4Cy!sn6%^)HxmXqo)Q7bc^M;WbBg zxJ=e4HU5ryZ8LylldmX!B-QNB_6SOxRW8%q`r@kaDE-`}bcI6lQl71Q0q=DE+3OAR zhd*Qomp#58Sz6g?gS{L5*(^ouVuI94#&MoAI%nxZi`0b3-%7`!iB%_^`Hct=)csmL z&*C(xk|7tLwl8haYNeW+Q-ySCUu@=J0?2Yezv9FfjK$tr(+-w#2M6UzILFpz`{tJO z@oBM|IPZMk=^GQBu3Cm+RjGl$S~taSFc^jFenCWtNRN{G@6!z5`!*DeJ6e{DUG%P4{B(*@7yUE7o)VlbK9TdBs=ob;No27C}WUX+-5KId;`uya1>U}y59P5 zJX%o7I{K-U^M3#iLGix0t44^uOJ~DPEY`Dm|5t7nu7TW&c56vZnV&1h>sV3EVac&1 z3K~YCId%t$W0~?`*yl2OIiY3I|BAPf#gfew| zv3Dp5o>Wg8*1@dgk`nLwM|_uL-$W{0!EdvYx>=wJy4&?POswkE0x!mArusK_%UbIV zHw{MaERml%PXJ|F&tl#lswRLgIs1~x$Gq(b=2W}78`_ld@x2q$s=ke_>P)rtoqHLq zx^623Qec-uiSw!Ne+lM}?t{6P@}HE=dB0V>18aXAmcHr6%Ay@{!&HCaF8S?NU{Xkl zq=e9r{f(aJN`w=gjOoRYC2sXHiKt(M6m7MlOe<@oaS|PGt>2j8#9|j=bmlIac#>oE z4q-MM%e+m&{U)>}-Mh<(eg>kYqERiu7-Fzn=A>xf<%&SRx=#`4jgH-B<`@8de&U5C z*CGT#-el^ALoMJq%I8cOkGiuzY@p{I&_YfQAY6Xfo*1!acIG zZic4X?H7kyrK5EE7=*KvP?|g*zlCzifV9S(2mR+<0!(+%Ck3~@zIjATCJwHw&&n)~ zM%b5)v@2n_>~3jQS8pn1t2$Gb!8g7e&bsE;%DTEJtNG-fKZlv;z6py#Ey;LB3Vijq z(o0w!?H)n`MSvwr;*BeG|`2N))Y{j{|tvW@8%4`~ow#|PnBQo&kakyy0NL{FeXUJF%gR(Fm5&JReRk!y1{pCT(nl-I3a z{kaG3gcfl9j`xiO0p8QrS?62-H9)A$AoN4|;vOKn3<}enviG|j< zlwf8w#$qm=TNQ|>Ini#6*UaTIc}861){+pH`*;sP)&s{MS2S|MO47=RWsm4PCDB)?06Zy?Y*u z()z$}(X{y?d1~QIIl2u0@gjP@}-67Abm=u7{n)4ZbH#Zq*e%SNEr0kHK6Pof<{{{ND z(B+BFwMKM~PL2m#{xm=OI-$OHww!^)V`B?!oO(OzG_d$%_x)5yx7)f4by+KJfi`6R zB0rNrZipKi*gvIVT7IWGO+QdpB@iE+zL$HQA;m=_A`G9S6+EV^!pvxydD1F z4}K3C!8J1O-}&v|GUEK^n{JGR`(jzP@t1NZj!r-OO*rw@->AE*OF5?Y{8_G8m!e_I zJMI`O0u!+$guR$pV9^)24(N$P*Es^Ul{-TnQzsas>x8yiLu8FbCp;DHS-G-SUy~my zV$tSD`$$KEPh_88;v%Thx^`U4D#2c}X5JxFtdbxxLd+-vYE& z>(ot;Xpb^?ZEY4&3Z*O>#e`s9;w1OYa^^cFEGG4M} z_@3d8og>u%q28XNVWBI1_^3Bp*82K+hG`5q3?0Jw{%3c}{<-5P_p}>IpsSZ5QIuG( zb=~wVlu-9kVtp|TzTw@`Ul#MPJrAe;_K%9gviP2>s-`2rJL6g`aGTzYoo>gxjD)sjE;=)=6&|YQm?ojL*LEJWL<{ ze)JhuX(h*?0JRdLJkz8H5B03+vwE4+NmtPxbi5>2$66?)VnYYrBm zrzC=RJPLHgc`P6i99IlL$IT{7D$-v_gr@d^H-7bKMJ<)Px(wvUPG~Ye``4R?l@Z65 zjQtnPHe!)B`vP(cWDl{fL3X2_ldCuBFzA#fxu%d<$?0CC0^Hsi*nCmZ9V8CwXl@jO zfaJwwmgG5!AqYFys@?#Ldi_uq>`0jZU<}S2{BHC&`|AG4Iv!4+j6SE8-}%JRigBr> z7Hg$6`5G`xTY^FJ-mhK<5`Xn^V0xBvE-$D4=8qzu@m6zE=0nV$PHis~3O4`~gTXE; zVu7xD;s`)HagoYn{U%E)w@3`0v~&_CqR{9&GFddS?wY*OS*S>|Xhl4A;<5hfRCbz_ zfLf`|>Lpann@@xg;2~%-GEaA)R?_Cr=8ei{eV1YV#)Ih3u}SN4j;!%<*Z`1N;?YQa zFzzS;iPxrYVm7+mW=xkT3M$;m4O8Ie3Xx}Jgwv;hVcHV)zJd-S@>gGin}Ef7Pok{p zc`h&0&wiuq3yhkHx>?9_fsv2fM~3eh3=kbbj=lxn5s2_X_4=V@D5Plphb3WPgo~OM!xB2(xhqm=Rz&` z);b@M9NX_Q(T=pL*Hx(F*&8QhSuDCjs-+WWjyxF)^98QVQaV}Q2R*36i)+G}N%m7` z+7p2rqL++y5Rq693d*^eSAyv=lr=pM^)jP&;!N`PQ;O6BLsJ8N9qaR2Pj+tFsoL*o z_Fnx~Nh0dB05lV$E0_73!$kK;0JRhZCz>cUME zkqS(IQN_%&NOo%RNi4QxbrX8ikRc)6{qp4cX2W}-*@TI2I)Zl_VO>rDyc-=Myt7E( zjKrE4NyMZih&xe$0l02S8Re7Qw9#$k>c(4%n~g8U?adroe|2)6CX`bUYES32+xiRj zQuq)of?8K)sb=ZL!eH$at4h3{I@7jv#(L^Lkyu}X8=(u_VAR|CW~QfLZf-VZSz=dO{qQ5SPFPz%Z>rBuP%9V}f1wNjcq4h++tbjEt> zS#*QXx)SNLGt-eJJqX%*o_<2p|TA2eqO4{n+=Ti!&sRUp^I^zLo95ECL@zIb&?8S>vBYI zSOP%jKOF~xU7tKH)v0{9`v82uaxK#7TmU`6m8M9AJQd|>R~i#C<&HzG=-|ZVpLGD? zP-nTn)O|FG{M7YwO$*6LUEEU2Te}NOSJv#Ot|qmzpE}c)bfBL)MT>PgMz>_m;abrm zUD3B>2{37t+sl&G*$Wi4t2JFS`@-L+w(+D=OE@@tHzqD@R;~f)-*$qZiz|)=nbb+d zx!r4oT%wE3sxc&`j5LgPcea7M&I>p%;UOZjJeZRrjQ;ie?t2KDjEI(Gq$QuMYmU~6 zZ8y-RE#sY-aX#L?2niW~3#>LKPan`Mi)sG_AjRxG<$%nz0l=}QYb&`C=H#Zrea#WN zHxBv+N_~W#^X?HvW6VCd@WuUurFC#isp9RS_3%>{yq-GKj&!J>Iz@@~u>;R+?6j96 z&CksmkskY1vPC_M{?}*wrmJ<++hwJfJmz29pLTzdZSG8eU&l>OYXoXiseGz*rBsQ5xV7+Zz!5j;FH&1{hCbZYp zv6m-qOmseje~tpdvBFa^AOF(JMZz$25RDm4M7RqUNTCjHDM~8vd=I7>|-$9}Fw;(T+rw&iSJO7`5N^LK_RR1|O+aEd#e|FSOOPqM2s$=uqUNYYR z+J=PE@}ELl=al=)=$-3$nNdk7g4+uawb>ZNlttRSASn7YG9I))x-g|2TvX_MfMjDlhXBBN1R;d;e8hYTVGY}$Z=irYg#_Y5Z?Cuz zG#=unlN=DBeLA46{$T2jx{dK953R*d zT^%>L=1ssb?F$ZfvY)z-a)mjt|Cx2|>I$Q*>7|nU6t5K)b#d|qwMMPGZR!W9ZFS+b zry(=_3gn4&g>ozD1oABZyr#Nk=X<|6DuviKtFHt&dJBl9l{!8nm3HWa)$%RVokk}E zUi@aedzX-PEOomOMhl{KqeyNx9BZ&+iqbX{`JB`~;lBVgYEFicysv~VqS8OjwVT!QPM z%~pl+t?BxWj7?{53c~MyAr|Kli}djEKY>OdUV8?@XLpj{PlI^2vbSU3IhW?g>G^(l z8Ynt<#id3N4lKPBNL!7qr&P27(B;py`ZwMo zJK!y_0N1)k5r!q_cPl56iWmPr`h#WC;4$?YG!pUb15i5fAVB}ps?#cGQ4eP)p%W&j zAaQYlta8%dM0&q=HPH$_NmVOq1aF^tT9L#h$PJHsX#6utD9~;!#v>+iGeYg2*qx`2TGXt z$?yH=T?$Lr{Rk{w`&Q_G-8w1O&tZ|ybRI!x&1hdJ;|HF-Gk!smyKZx{Db3HP-agtE z>!&wZq#Kl5%>vRYoOJrqbx{fz^A;GzJ(O2Py2*8SZdd-YrCoVf?pBCKOWl9i*Pp&SVl&bR^VCPxX8$7Bk z+)q8|ufy_*RjhL!iS_d@gTafhj)l4W-na667UoRnBcP+#Q?G{Dcm3I0V|SR=2zK9^ zu4u(X(oUi8+)JU;3HtLFBVhNJG+%n}7q^E2Zgu4y5m_4JDgj{JF$B@@!WZV`Q2kGG zY;-7{bf_(`K#%dKJW_!PVEy8SBO1v85!%-}gz(m#?`^F}-@JSCkmJ@8eF5{7kCuXa zwm`xX0ggocnu4Kn-v`sz$@|ZwL(+)K7y~C~I}W`9&4pDOh+@=9m_OU!U*@2*4MOZX^KSJ}uViZvZQJlRaB^zVH5~_C1+Q$F6|d-mHbJ_W##ClNIZN z$XEip=Wi!`k`h810?BrI&FG&^+nB(@6 zqMXZ!B3N-DbOL?nURHKLyT4?k#5zjLdhBbgeV3_~Ggj)cC0$$B?GlZSsG|B$i#6f8 z&(JrQMi^lqZ%j+?B#_g55wt6Z7K}D0#t(k$m)`q-?u52r(0p@lLogQQLf?!~^_sGf zrvOGH5@A73`QwIsT=s<2DcIrkB(mJE_!OCEtSXyTO1-qjP9z zUKi`9z8H(RT6VGj!pos=RcCbg4AW2$dh#VK87?v7&;Zo3j6Q5l&!^mqFV*aC7nW3b zGQjRH`TUi#tOwy%vn(LJ>DB9DYs)Akax77L!cmh5W<6~?r!WzCBEA8j zVx3xtX_m}A0)iV399SU+rL^!9d)K=`;`Ekhf+Bjd zFy;J|^Ww~y_AW>aKk7oe7P9ETdow5YRC z&!v*fh+4X_l6y?68NBS>RfU@xSke>oLl%n?>$0tE3;@TY4b+7}BY^l>>q(taU@PUQ z8%8oI5sYiQjm<92XEr2X9P_-f}$M6sg4h}5|OG9&k7%Bi3 z)pj{JuT{N{99WA=QU~e@L$vOCynNaIAI!klpPhogdtnM*I#qdWaZPTn}fyzXRHpf#Q!>88TFEXIsu#FK%asDxp9KzveA1ZL2kUFmqiJB&t3{Y5cAu?j*t@Su7*MI?l!;MOmyh(8fZPzvI=*V#c_fVO!@f}M`M^8ZWE z8GwKLqy6&lYF^_rv={%7%pWv*@bB6}j{&?F8^}#p1yRzGh zMs)Xk4C=)f-}}XJ`El#df9-=0$rg2oY&}J_-3lw?%;E?wEvV6mZgd1Z6^Z(IM~S2E z544m6^KbO3dRN}5@8g9+IC5Y6TG0)GfW4tA$KtfuOHyZTyxbyXdzmB7ZBwD5)6qTTq{-dkbLwQiScNFmR2B$UVj}z zw0N$T*{W|1^y6#KI-(!9lF{6D_GtQL6_Z)vjda{1u@YT&?m+aXc}mO# z{pMm3rY$k-pI)BAipnBaxxXw~{T7%z`UJEa%isEus>8}UHT1SmjSWBk$#tW^ROG(* zesR0Bu8*#rfqV83!Z5wv)$5pRj0iMs*lxE=KiXsBCNGQ-r>-52kyiki39DMh2RIRk zaO-{V`OCYZLl6OsM_O2*eH!5y(CH0Gd`p6m`QA}NB8HK?%~ZHDT9CMrTECO>PCwvtGg!LcYJcQ)%(5*xwM831BS z2ath5XA2#x7`21B12BE)iH;e}q>JdpV@GNIQWe{2n-LkPt80Bhx=!eRhQfJeUH#pHO$=t0yl*-30L z=zQem2^?oc5U$HgVlJnPHMnVe(ODz8S(%OA9Hf#1D#nFba+!`7?j~nAF`SwS;kj4O zz*nC>2@f8aW~+J*{cC?5R$aHX>hR&|m*LosUj;FH8d}ZLAG!(7y5^&>7`6wu!7`X~ zL?e9@r>)~wlF0AlQcjGA>Qg?N4@+TB2>G#lMutk$Gsm;`DZ&0vD}?++DcW5ts@HVm zZ9-TJuCPzlY*=zzuAcToX(wV~^uBk0;UVY(Zu;84Q016AC(yXB=-y5D-=4-LM`Uj% z`{RF!#23OJA|Nwzr&BdKN^B`26+}2!+>OFXQ}01EX}j@+qhI^EFK>blp^57ns%0A4 zPn}_!ML0Vx|IQ4(^k-YP%)IoJfKu!aE-f6&%3h2*vO*ya?DTP-Y6W7KaLg(Mx!$d^3^lgUmxel41)JuV4HpBu~H zD+UVi){D=A0~00q_E@$*JELA^w0=S1m79qY_7h)itqV*+J_%U%rkh}~jEPI&P55k5 zlc@R9wk2xqOYSm@@}sD$S^T6X4uA0X-=o6p71|1{my}ojS9tQ!VG^kma~n zp7U^)8;j5#JpiEBf75$NAk`GeOOeu|*&IRiwsj@4a|WCcB!1!MJc&8W4_(mhnO1r? ze$(WV7y}XybdcMNqM1VdAr|TkQ(qD>4s*wjz})HM(Pua}4Rfy@f%!>ept?(|0=L`t z2S&{JuDj;!LDU8>w;wYO_k}xnKj<-;0V|{#<4#2@lfTSQ?>lDaV=>D+_7cG&)<;(^ zFw5WiOECG}KZjPa^17`H_D!ce4jbW3@Emw%!~A-i@+B}kXqXL&kQ#EpXB~G*74x!cLfmdw^k>1v4*2`26W(Fe`<4 zX>ua^twi~}{0`2HdUSn3s5M)--JyQWXnJV9td+5%XbZCK@N&};p4D4ek!)X95+7%N zQxlCK@%qbo>99c4w!hp#h??oaTID^L1GAH+j~VAFvhr=isVywj%d-$4b;`1hv2S=Q z#JciJ?>ncqx22AWi=#S5t6=KhQ-4Vb9@743+cHg<+%(#Vi?Tiz8nI5gPe&tE9k&2`BOuT-mM2}ku%#30Bzwc7U&Eq~J3Si$lTS4-JIX_eb@j&5 z(+__JnuQYS%QpTJ)XG7)1SVlQEXOJE7acMc6KwspZ7PONfR5{{t;bfNi)!2dhQv}i zj7r3-LzXUu@jrOqM4-ewh7$sV(MZ6zV3it~{Y6iDuPT1*ELVqG*tu!v#LZv-g;CjG z4bz)FBw>WF%4yX@Ta)xYvx15v`rS%x-Zq*^;=+YmwauV=MX5NR+GZ;hgeyCRPR7-yreN zqo4Y_07$uKWRBlfaGE&HHYA6->48b0o<6`e6JI z-!~zx@>0O7SJD@xfS+%ufR_SogFpd|B7krldI)(Hw~6SwYLTw%j38YZ5y0rW$2eLT0+z{{91y@RrZD^WiE(*DRzW#**=k%e5$O-K9fq?y#H4AyB7jE;^& z`j$6ee3DTay||E!+D05u0fGLOG`gpTtmDl;UjE%QOg@oVxV?!*={)!rNB~!fK&}u^ z$0zCiycYFoSRS zX(`tK45pv^Ce#WJoE5F?qOA5ep|MOXJ<~C3X4iwAo3>Bf^o~#{NO> z=Cq~TeQe`C^+`!;9Tc;ANHk*I{1)KKeCnQ+_@(E_c6~T#pLP-}IR~9%wW5m+Cz3uI z$r|n?>)W9NX{u0<{M29Cr`}T9P=7RrX*5cdE9>~o@t33^KODKP#D3&ef_cJKR6b5* zSf?>?w`-rk{D{g2$xFvM2-D%R;;}upn?4Blct0*tE+3HICdlyt^zjmt=XF1F$h<0=9n$wldlS(v1C2lMb35;a z4y3sj^_Wor7V1prphfwt66KM#{0NA-c-?H%LFkT9Z!r@O!R>f#U=u%CRvBDtfevju zE1iz%y3FKA`jQWbCuQ0ml%!AJHmB3o$7$hA(-CF@C_2_@Fw1ob`?x&nSe<3Hj48t# z0%(3|I!XHW>8yKRB>ChkIUh5s=)791x)5IHZ3~KA19xH)Ek`pP2r%cXP%k}V@>%SP zFV&z0yYefaIr#T5cXS`jAKMS}ukBBTRl>X=!z*9+fweydedk`*P=T&_Rh$b`upE}* zWG}Y=A^CM!pjy*Ah~}mp{G*?l5K6p*74M<6&_e^k9`jGvD69Ghq*YyBh^?+qN{lmP zrEc`xx@!8rq`puebT_oW2D)Aa20XhAt?guDC<6F%j`UC3egs+DUFF@b7DMx!#0mOD z!>!PvG+(HTa2F(vmSNfrD#~Z1C|9m5;heRU+YZ3{?G0iv`VDXp4YVRNjQ!~u8Qjhe z-IPuDs0A(BH}4r?if+DiK0tSth)z1z0%6Zfkd89djgwB*YHajwUVvo6_3@_h(R9o? z(R`C=Xh{en8fZN3@PR;YqUibh`J{P*GJ{4c4yI)&!9DnfcSnC3F*^xjCSGt`iS%ZO z@;qLJb6~BQ;`SelwphFa3~TWYrIM5c1!xr5Lo2@c%tu!B=@D7x#b^V$h>p)X2ybwU zRW*IboDtoo9~JH)pd~VZ`<7-R`cq5pCgI5vq;x_mq*6#yF~^GdCKYrYOrH1%eZzqI z_udD7wll5iislRTLD&lm@DN~_Mxk6)ly!Xe_)(aCc`Op>N|X~rD>z~=={l_8$ra_6 zxWiG8iH$VO@bA_ZFGMR|shG6Z2H|bb>b!I=Y(CQ#JdqN^Nb^ima?>Geh8v}Fk3c+%vh4fMP*ovxD@604Ax{~vnm+u(10 zeLH;fTMxqh_wRtGo_ZP>OW~~ACz37(CCpnX&M9MXF|5VI!0kV~{fh>QbVXR|t%;-* zWmUiV8y~tIMYuy>b6Ooz+{u|NOQj<_}tagQ*ofGw0%Be*(U8u+FsXs9a4Sw9kFh29AC!`?XFaO3PQLZL> z5_y+=qBDpIXUL?>RDm~K`hpWvTZK1Z#nvmDf;$|#aYGUVSxzwpIRdk!CwgJg>oeW8 zY29?tOMz~->x#R(e4B{(P!#=;Sx5TUfJ&BR3(~Sh+vhu(Ob;O7r3v7T9noe%cDs*M z<3dKb=%S0@){$GHzr%+Q!^4j}8j1Et6(8 zg`GEl;}_J@*qe&j7uMq7w&*N)cE1GdkbAvjr!vOIi7CuKU|+x8xPG3Sc4Wh2|K6?Cw6rD zH9Ke$>lx`B^+Y2-9pU$tKy7X$L6Z(Wg8+~e3_TBeZZvM2bx&*vJxJKhAstWv+(loK zf1K+`!aElDv{EM{7LC)rZW<-pZ@%fq=ue?U`-2aD8=idfsh$+>^<4F(Q&E2E8gBny z`wzSZ)BxW2Z}00_i@K)Nzx39^%$W^Rj2DeihQwNKO%Gr$wz=JJ ziS{R@XxHD>-^r7wpwn5l@t2}y6nmY&T=H+Z{X@F_hl7J4`Wk01#QFJ&!p!teQJUWc z{R4Z~-QL+Q5Vi7wZ+!3$S@v6ncX9o7QhaB`jK?XteXZTDE1e!w)7^D7=<(K1+o{V* zNcXJ7$jp@@ni%a8E}lq_JtnU@2(zm6`tvL zlK7p6z8Mn@Q$0zR>dYc{pUtchk>C!5=~KeQO5yHLiQZH?!VO;`9C%^uWLt2qgFAT? z+%lmmh5R)6$h<~gKFEhVk<`PFi>P>7UQi(&wQ2B@H^T+L@SmX(oH}(1zAuIQsgoz+ zP$b@uz=;zl6A^zh+JETKVQ4lNUwl#Yxnji%Sh;d#EzKCMP_gD2b@LIm^jB$G!J zTX(+qukM5{p*5~A5je_1oymi`vM7uB{NxF6hN3JrMO{?rNQU|-VFjEy+;%pY8j+G7 zK*x$^D>&agHw(L)j!-l_WP}&w7&;1P4Zq$gBxyJ~PmZMnBRbX-FpsFyWr^fpQfAJ% zc(*mgoQIB!3eA%nzjp%3Nu{rAcG1y%C+A4hrE&V7N&Zuh^MzYpUIs}fXnc)B318|q zQw}ZIm7v!sfq(MU!mRQuWtuCb_|_<~ZN6W85iFDyW2)VrgkI+$UL=M3vG@nKfAfK1 z*w9v_;SjR&d)$xuqx zTtLi`etIYbNKKgZ2epVYuM)&^=SKa$v5Mo$lo{rghCUaOC5?0920NNBV6=|M7KF0- zbhahsDaw?0wA&6?e!hiM6YS^w$ycBq&?0&>Gea@QQdH zo$H*y?LU|=LD&xs14D9ip56YXa2Haz2P5LFSh&kQqalR5*8Tf0k3yF+-#>6`-|S3L zmPYF3lfuj^&;|^!RT8x|Tq|!hu7hd+t0X=kb-`Q*dh=*4=d{{qIN*RYKP(wL;&!D& zcArRBAhZy1bl-7cKlPp^TEG0IahN*vRJ1xv^tMmhIeDk)|$F(B&OEgS6c)G7|L83*CH}N2|Uu#xGZ$W3+>Z&aW9iMEX)& zV-7mU=>*Wb7H0JWr<}?8C3#QBCxyn~a(Mm6J`YSbfBEPsxa-@^Gg5}LQ}P;>pfIqa zs<1P!JR=Q@rRX;X1sFL0atQjDLA`ljup2&7xZm5#?LXQ)&=28~B~WjaH9eR*L$b7( z_8*Q0fIGu5cxc_ncXr*xROJRE&-E5FPC4Xn1#nGRf=o^pBIDX82Ra5T@+8yixy=D) z{1<*6hzkwqHQl>Yq$^rzQCFxphOzrguMqp0KLyjTNOAtclMqJ2JlRQ~gE^hN746hA z9c|H_Z_>#M8Xj$2)@RbSFeP7&T-Wg#@o(Zxwxf>Uj)=yBBy8L!e>%@}mYis77U8N5cX<)D8aa zu^Y?>$K=CR_JT3uagxZ zU|uH;pkJ=xT$fb-19A=gikQSjZZ7n0<^IyQ@_b-g$NcFZ7?G|B=VzsGf6@`+lrSeA zCF&c&6fEWTU#9&RW@jOk*D9J=8U)#W!2*b^>9g}Dk9BJQMY(lEttJ98>aqX#hS30} zXbSQ;W-#Y*g{lhARzdnbKZMv_cvN+yuoG zcG9Uk3007A^819`w|VD#?|TTknAQq)5$#;?&LDbiyk-x zDGz=ArVrCMC4k=eN6Uc5Pt!$PCVD^Gn9Vtw^u@x`!K`%Xwbff~I!LzKjM9+qIoP!6 zvWZ^Vd-cWS18H7KhY$2PLGnt=DHUa>C~%&65~n$Z4-LuF{h0*w8a z&Es;@s7!hn6kt?Z+dF1bY5>74KYl{MRg(z+V>Q6>zQmz~Ui1X*@ZwH0r7kEs9I02P z;s{%Bj5XcHqK}L;9E{S}N3W^~O;m(B0lWya$pSZm-7xDxm%Ckg*+|jv_mJl4kBc60Il~ z2icy4bq6Rn4IN#&Owf(LOuByh<$j}+zFUT6(@BajFWyvn1L?4V4Ct;J$cfAD6=nA8 zP>zVF=b{JTBBo&31hPg&Ia&tC^jn$<(i8Dg+bFV4Y2V}yGAc2aKt)wch5 z5@-p6l6T{v+HrufXx9Q>yJaY=>wF1tZa&rLHnROEcN;~yZ3NU`Nl0t^=24loogu=m z_IHtq-H*?f#rB&o0z5c`@Zj0PDGV*d{o&JY_in@Ve6Qqs+qphTIQo>78q)MwZwz9( zWjOU@0x{gW<30Cvt*eVqi+$8VUAR$s(KZ9qQ7BiIsYB1e8EHMAlS19m=ED6BP(hHR zI|9(ofcgc~du}Vt+*Jmm{ir97(y&Q7G#p?$y{tTdH?{~j@7A6WXV}>-yu5)AvE*cY zItY4%Klonp1XOnpdHc+9A|tONJFfJ7W?Y}L z;#J?nnMq)>IcuOfPfQET&W6&N+KrgXGG93BbyZD9T`1XYhueSE?LTs16v|y(ZZFwG zsT&P6zx}6=i9!sAVdU1kZ9KNN@07oHt^4;oN1=^){=a=_v&?sqZo5u4qaQvUi}mlG zC7&3||LE#0bi~s>2+i6<43YB>(zup*oPTV##XVv`3duy&da)eOWUOk$?Y}PV-;5X7lJ<{I9>I=Z zNiZdZ<+d#t;1=p4v+g%`?t~U2ugeYT@i?}w|NN^6KYS{-upiK#Tc%8r#E}y>VCr|g zPP%X&vRfA~Vd|5~lAX{x8Wak*-}mm%ciqZ6)zAhO^>CN$F}DHJc0~T>Qkc8`<_Wr` zk+o@c$4`j|9y$ptgGEl1n`R#=K;P#)6t3%pH6p)^jQ#PA6Ec%K z1BB7UMW(4%;<0;1hDy^jBjv)ZmqY%)ehJ}7KfvFw0{Ex1>}`l!muxxdqM*xMn)*e{ z*;a8=j)IDHHBl7B_E6y6JKy`oap+-MF4S@L#&PyjZy&TcKYd^?%t#Bm66drNNBu8a zTZWG-QoZkv=q9_9DCx1Zk2OXPw4cIH6uo01jv$T$bAl#=3Z~Bk$v6M@z=^~3;=(zW zrmF`Hf$73B=VCfFdyF}kBpjM6fMB~zn_K5;MuskMC;V8eojwnnCXxY-rjvvVGtwdF zLI*-?k#obDB0#sQ0Lcp-i{tM>a-JgN{Ol7KJFud88scU)r~Wu0wXjKokc)1vx!gGY z;`f2c=ZzOEf#(`1)YYU>C9E|{q%T>vDz=&@6qXFayk5}-m8HKAR-Zip&mNtW;RC7X z2ca})SB+6iH}*APJ#}vX&~@z}(2o!8IRHK9q)hE2k|Am79|_e;GIGcGf4ONVVz{$e zqP;Xdy*YK#Ijosg7IuK^j!WzMpc3qmva-{d=rnz0SQG3YE+s7?0@5G|l0)F7VRVO* zl0#{fZUjaP(k0#94U(g~QIPKL8nrm{f6n=`YoB)Qd7fX#eS05?Zlq7FjC2-GNT1F9fdfcW*s?t}rlq%vr;NmI<*y2?SgBL4*V<@xPi!n|uZAa(_15Gk3zdc{8 zD_%TG`5@O>*@a?-m53Rln|9-BcBMFYZfc|5uv*O+oV*?}H&pk?Ur-QB$m$>&?~4QZ zO_KF0tDZ@5RyyftFxdRX5c5}@R6?wP#+}0gyE~uwGd?!DyShfIYI#v$s=*HjQ6(Jy zdY>RCY>gL@wF`I+y}6EK=vOzPFzio?r#28HYynB3bBxmEgz6MGmzS(V6HOz_%FD?@ z+3Uohz`-gZhRHT(&b(^*$EmJU3}JUG`mTok+Qk~K1J0k&9-0NN*btxpoaaZqy~GRT z(OZx_HppHPBlI&|47XvYslXF$rN}3%mpxYQ4ewaxzfC*M#I$r{pthuezM_bXpRpKF z)fvfV9XSfmTcJ};Wzrp&V@_LqR>ME)61wlt=N4(OdL~;(_@6#zme>;K#r#^ZJyh%a zu;r`u<64=0(wcefA!_ma4v4Z-kr?w}SgSA(i%wuVMm3;pasl!B-2wJl41h{;c6+7K zc5-?OI8pmZAK={+6wMCjT|D)L^U1V}2(S?<#TL9{#f;36rJj#oMapC2-dyeP4k^oi zC;!Mw2W&a36Me_BkgO2Q63J@6NuT5YJ_m7X^5|s%Ky&KX;Ba(U%s62kisbWVth4;e z_U4P}J?S~B1_$3K4^(b&K1CBq_{|s9zyCBA3#k-JxVU!Oxfh^)C^=;L72xELO+8{L zK7I;`T!tvin%QO0I7%KAH;5$Vo4nzJg8nhC>*&u&Leq#TEGwwOs8KsF7;6GWh?6wB z^9Har2KqO>ZfGASZ}lBc!1f2-ZZl9B+7RTXdWr$7`1L8%??uf{_5-}Uk|Ai3-z2lm ze$F5r)>Rjq^D6>*(Jq~j7dULva*aT@hoQpjlbtz!6rS`7>FVoaUk>+X0Y~WE#}-EW z9v9-+mQRZU^-$awB{>?c%p=2ie@eD<^6++vqb4r}=)_9#O2y4u-^E`?PB=62jgG5O zWQ0`(_96yvJX}{9+Z`Tv(OKwCaFU-02yVZwc}as^S(8{pibUQ{WCzMXZe;=Scm*?v zH1@ZIT#<5!l{D@8iLhyVA$Yp2 z@+6#6$PDvZS>~{2v6!$HwYP04E|uF0$(Gzt4N_ZL2(`6vc(n7>}8l&D>LjHHei zUG2pS57Ab9?+JWa9BQY;`jLaiM2-I*&a$L5une3ZgB=vI^PLW|3HId9pZ_$&#;Wm6 z=r&mG$idm7#&=lUH`b1)z*#G|&NiFYUlkdCsC{^G=tg&mcDM~|w0+#z1zs~cwrfj9 zFjRpj%_>^vusd8c{V$cxu3DkdW7KTFpHk%g54#AWT=of=){EZg7v4RWTEBA5Gc_g` zCmsv3$meK5R)0lK;&hr03WZ0#Qv%?&ExN@p4+(GPpAXpFz9Nl;q6KF$jjx+bj3o~u zhNc|fCg>o~HzvLZqu9w8LR{=cB$|c%NoP0#sYKcb5kjUpB%VnY9E5ao zQGZ$JBAM2BNVK}*2e)LbcL^@^fdb13l6(w)XIj6MA19B{+#rnJQs=66W_T-@ zN^Csgx5Hg(c!@%l(sltZ3|T?nh%q;kGJt2PFal3wwPa!{CG|zCD3(2e(7OzLbh;9K zgah`et{W>l!KU%f_#dyEc&j413m*KcNQZ%UoI4iJr}xA$jSLcej>RLSA-N+>MHvOK zq1$e&Xs&$)0z##=n;vD8=(_=Txy~#d_-&OqL#hDqcCe^+t7otka#Ll9iK1)`F+|~4 za>sPN6vD%3#`~{;@EyJYbruJpI^!ba5Lf?4I=I_ z3tV2V(tke86Q7~~`E%uGx$Lbq>^Z{|jK}Oq<_Q z*23c8z39=~#G9y@-mf@hvuljFb2I6GKp%1fg}5o=lX9F!6S5N%8PfF|DC&9i!MXL9 zf6r#usQWQdQ_N~?Uw!;?BTW`B-*i@25#hP9c#8T8(YaWvWjPV*i<%$&p)p}qQkkT> zKS|4kwtX{_hrMUVBvq z#8jic-72{2^cI2bZkObdav3-WYBBP9ZsBra6F%lT4m@0)2MvpYG^+`r8R!2~&!K#( z@Y<5?M3bT+KQ8nQF7wi{mnU^@p;SiUb({D~4{zMR2xHM=&)}GQu6CG6nlHI8o^}D- zUxkGgh_j^n1Wqf27d#E_D3YfB_?N7fVQO}dSkuS!i=19)r~HAc+m3g+6i0CktM)Bx zh%pJ(V3b~vdw)=%xo+F)INhyRi(&spwCF7M-GUyZZaVjA>l-z=eW52f$C!No+}M#T zCx@l7l^)k(gnzt7TftbS$~Kn4-J!Qqhm#LIJ^4}gDA4|(fK7J@H1vBw8G-%IBSyLZY0~Xi0^YPzUBk%^ zU*0RR9RFRju7ul`lw&vAWISCDt*%Ew2`>-cS`&2TA`kMzN!KWfg3mn{ zL4$|hS?R+f-V!S4g`z6^B%4Jv_PC6GB|(Sc39)ZEHtjF^ibmP2Hw>xJ3?lW;>vM)h531xlCt3~aRM+u)fC4cOs3kmK!w5;8oa$v#sa3d z(G5y9fYUc9LR`%!|93xaJ|ApaZ}iW_vS4b?s?Z%PD2&O2)MsPXwWlx9Md%nJXcC5; zl}q-acn9=}g!ri^Wd4TUorZgiZ)TT$tyQ&OvOtQ>i+4A25)*5qjp9x%oZPuom1)Bt ztGrTOiQL4v6@6B1{8yw!G?>{v8&)A-a&3=9w{}UpMN)3Mx$39ZmDvjD<7=V28cHj9 z^`kUuts=YDFo{kV((KfWBe2U)2g6=Y8lM=0dC9zMxor==Ov0pITO6O|5eZOWo+nJ4 zcX7pkl>|16yyFwVL}9XntF|!x*27KRl6F`Ts0vY%!xtp9ZRR-sE8D{CPEyS3%HmRAX_2wY{GbOzMIfKUs+`<#4&tB{;eonq(eP0=2i zt-`p-wAYDKm_T7h*kZT?@OUT!Iv16bI@xY?=3olvYqn$?za=aC%G8>>_6)s-Fa+$k zQb~XmwvHOrz=40sKQ7?+D4>diUE^qBw-L>?eZ~1E#O-;~czL|?W&LBJ`xF(yJ6+6G zLCj*J3@rDm|8|4+d;^UO$i8)r%5)Ms{>o+W-?Zo405AZbt&TT^4s9%T4JCqB5Z{X6 zm=h`NDj7mF49W~MPdq0ggE0s1V=oynATa`A1_9p!%Q)>Vy9OJCG=_gPQu@5wU2}ou zAhC(okct;q>#LNlzZh)`KPbjG%Eh~}HlA8W7{p(ffkjpc+Dtmmg{oVQy~ZVd7Kk0H zx7LFS)lH?OXPfe>bfw~el;d#yl2}%IA)<7!=$rXi6VEUuQ7_bwp;*(r#HMpoJUzW~ zy>I4XVjGGqwG`Y&S0QZZ=N;-WXOQNs+cV4w(galJA15n*oMvstza+7te)4&zJ(`6X ztC9SX&7BwIY$iGUt7&(Qo}hRkj%~}?=Oe6x+#mj?R;-&hi3Qy|*POuC7kV{z0GbaH z>|3AihZC|^5KQVVE#N0bJ>MCK@?b%YvcEAPJ1V}~bQ?VXtW4~4(t<_}@bs@y%qZmf zwE0`e zu*=j;1~nHb8&J5FE7Py=(5oHY*nE+9o?PoMo6?U%AC=r47Y5n;<;Ln4xSg=*eTy-h zqCNCLKMYJsdW&De1s6Y#$&e%xw6wfRbgq_3Jw23;x&8f_gp?I~0Wkwbw~-CBi!pW04O=gCmb zF%yzcXFGV^F`+hNt0p5QliLv2v*$7!9%e@xPk5-xazYp)JN12e<$ej#NpM-;)ZiI6 zX|+7lkwx#c_|mnQz(#MFXz5z2l0Q; z4nff@JyR2`&?n#U^oJVXPdtIqR(nwz!>szK^&8-^1=R#YRh}01L%h8efQU+$O5}ZP z-mq}VBj5KUKVh}bvcDD?(ZXHUxW&QS(*thiVxm}7o;S1P6fE?^_w!8@L}&X#{F z>?SAL{cGa{DC2VE>4@L|xt$bWz;~BgpB9-~4*VVIC5!Yv-pD6LO7iYLjNY+sYJ()P zv&Q+vF&REyse3tYo(C)gTfhxW<{i1m&xM^6&ZB9OeF#RVt|Qj#74O9w_-=If@2uvA zQcj>diqz$U&1gPsVt1SqXY=MS8L#(&!S(0Y@+)i8aMl|?_er`&a}N)i?570!<7y03 zwF6JCy^rH4B1gu=6Ed{<9FsUn6;HcVQn3ii2CN448J& zh^7ZdV)ue%iZaVSfY5m+pX&JPPq3tt%(N?pkOm|h7alkQIjoN&CYfwKa8=wa&Z7SX zYx}A3eV!^khLL^dZ$pg7+{JQ`(-FC!@kwzG1+m6S(3$JhoCr>*BBZ+?92Mo@@F#3h ze`wQf2g8+{_W?GZk%nE13Qv!X@(08wO)K?~Zd^$Z|#Dj*eX2(?9zh;l_Oh8^<4x2Og?J$sH7*Ky= zdSu*Am-f#p53Aq(kf*V$(_`i&V(fC9bJ2FB>vSWhY&Z}4azK52yHnol|I5H|rUsvg z#poAYY-q+rVhPc3Jx9L{{u}$=x=zx6Q4vy0lo~djt$p5(f{wnL=6AYU9154x$8|an zV=6HxrHVGT@O;1LsUSPQoRwl6uzav;yU%iFQD6X-(;=xg9m=1}1H>uqavzJkEukG+ z4!Px8yq~3ui%|TPMF+1E6T@;ET{w4oXF!O@FDmb<9qi!KNEk1tBqm!@+0kL?e&iN6 z*0yE^>FOFG+8^ZnB7g>{dCd&Ayr|(;AA-#Lr{VgkX$i8b^97{2*%aOIWtXd3d~1~! z)5gl}oKG9FGI^E2a5E|LKsBk>J7Uv1NG!#cdnMM2yc}-na@_TvR!f>{OE)Vw{)AXq z&;F`<+~(r^!T-RK6V~wZ$ox_P67BNTa#=DPm~DqldvHj+1iq(l32dy!nOQn|&;RKL zs$DGodlUap4(f8${ON*-n6nulgjO_Rg54#$!h?H$l>2Gr#zuma8m9SzMeu1uLzyrvgf*t+Jv#+Q6%$U&F7)hcEXs zyCnog)yDJrtOyGYiXRYF6_%VseTTn9S*fxOWw8*mm-@aTG$UNvah1& zydZP$214pogPC+BYdWs^%|k9ECa;}iHJ>u}cFT;Z^b)N^vu~OvMD+t)ERER#T|zcc zXK!yFeIWc7M~bW#L&x@Pk%^eWZPB<>n#@C4jwifEro8}m6uXAZS&}LJ()H9U;JX`9 zHvFb|Cf_8&<(75kvlCV|A(7k}H*_L@(dlU)3MzxodBL3Qg%IYxAT+;^w{6G5fG_eR zB0!20_u^628Q=by^HrwZb3Gf^C@JvSJ6vmPir<;! z@;9haEF`-Zyeh|Gj16rx7QUEby(#i=cN0l=u@wpEso46O`a+eHzC!NaB{c@0nh zUQ0OHeH;{V(Eeh-rZ1FRaPV|Jcp2O}rUxBvrbQ+vODI*Idb_LOyQNZkU&f|jtt{iz z`mLVAUKAQi*=YCANc7eJJP8wgLvavm5J>cpmDMn33pZ_1?n{+8Xgi8OchI-mRxZg| zmoTDq0TRY#6ONlpiERY9M+)pGt?J4R9sC-WD!Q(z+LXGAMEIPJ2ugqZptV();W>Bf z!;oGa@n%%ZXM?27t-IaBz&7suk-5nM(CRVSeY*Q*F@+;1igZu};KL59EljX#wQSSv zhgAD}ZYKX%20%>5nK-U=WUQARfAtWy%$X#xf_c<5NkDcU53lr&2_p*$-B(qcnxY!{ zdJC5sx@RM6LjGt~w(zq-{hynDJDA#4A2@G>s}Ed$N8-l-uioUIzK`%gA?}dq_h$a{ zhynA>;9T=>I5EigO4(L8BdqS!c`(95kyiWR?7){NZ_iE%3~B)sA%Y6Dt0ii*_PZt7 zZ>IlCy|1$TvoL5+1{SbiXF)1E z_QNKqCHSh<9l!*KaDnG0#W!t_3so!s6+`~hZ7R?~a~hkF`w8aCqEy??d#F02PI5$2 z`W@WmB0HLCuElaY({SO-Rkd2Nm%pT__nJZH{Jy-^tN)Bx@iJT(b`4> zLu>c*2`!7`-c7ul3ZjlxJ%cvx0%OH@rd9)_5Yxx=b22~QEDY6HX+$t7v*D}a8(9>})|Bz!Xz!WTq=AOq zCFI?%BM(4gFG$Ng1u9LZ3>YHQoFCnL_b9XYuEv^{ppdWdjab_wcE6^6_gs3Q^{YUe6c7(?WYZz9zYafl~NOjQ0i*Rq^;g_xdh^PSAPUR3x|L98DLyy8QD6kvN}1QPv45u(dQat|#I<_-hk4Fp@*0R{zA= zw>^G@Y&v zQvenrQ;V@TK9=e~z-?Eh9=60@}S*`w(tH(+kZ;HHb|&gEb{E(Z4Xb98G|{& zH}56G(rpx*@KwQKmzuSyH+swoLcHVVPRz{zD8x3gEkPbg$|p+g*}gu4n&pNier?I( z_IZk<&A^z;@~5T9@|_Np-zQ7Zv?r8WiZJ7#nw?&mGzf4wai9+fk?+oonHM8&d??(^ zzn0E*?1VxS*9Cao?yMzbiesaniLeqm0?1z%&t8q`fI!s5tmF#Q0^Kyc{F6gdv2;f> zJJIvZ5+r|J`+nc{b^|>#iYEXfQ!M8PAZ<6C_m98+&OZ~dEjoJrxWADNktE)a=a?vA zr*xZ>*HYx46?8su<#oqbrg2_=Uv&yuH8FiT_dUmL30cO5#1=*WPdNo;MUfs3NQCFN z5t}sV**yRl$ut-QZv{SV@ba=RttiszJbx9+`VQ!g5fkN)9wT`ppZd_l6keWo-jaMD zFOq1XR6^$2=KM+yDfV|#`>%$Ir*U)OU?lJ1w);NbjyAaD;f1I~{lp%6Kn%7hvTaVj zUVX|((M`wcyjbu2jaGtmm?*}k znYpbqd$~1F%qjjDUsQt3GXaNM=`Z2E zPwC&73FwsSt=^&K#}Omg#iJuh6>FMH0qpuNrf20uZC%Xo^GMuJFtmb8M8K}^4jz_W z!)#{B78S>Ih^H}>9ulqvysI>y&W*e!8~HcKUuOD0I%a+GdMukHIkKZt{-;>VBh4mH zE$cl=La|5|)9{+$7bk&lPw1a+zMoUI9|y~u5uO5mW1@B@6x0d*?9W>^Lu+83ss6hI zrO*Qf4KV_fclJfm6J)GkXOG6S@}178d%VT1dgr{9eTtbWik&kW13V~3E|odS8gZPi zHazYfUVWmjJWNV}%}{M&C?UhmM12hsc}{L*WSaa$9_Z;h5`8LBjip4f&1UHa^zuGE!D1d8J$TYJE? zw|4020SNg?qBUn9IH4Nqs!J=UmRH@|Wl*5!(SO3OzxaLsw8Al4kb(|Khb|?Ni+jzO zx&4x*7f~Uhy?+r(wXrV)53wSBei2X)*PSCfUmoOyl1(8Js{)#dmhsa@^=IE=;U(Uh z2>FvyN&S?^SYd>=pM{5{up!YzU*Q6yJmW5e;{C!MG%KzHM26x`FfztW3meT;ECCde2-9x1R~vf7+IX5Ta++zih<0t9chq%$QZp=w0;P z%7hG9ZMUT$7XH_M$ME5{2e`I3jP0aY>h@SX&flBSBhK8@QD2bbBP8*?vSZqJTJ-%s zw1#W`RIP*F8>6hD20j6jQv8>b0^z^gmkZ&`+upDiXR8qPSS0i7)a6d(9K#ZZgvK&~ zyK$#8E%io8HEcThncvn3m{*mXI)8NEvtxweFf+@q@xx3QJrIQ1lAO0(%Xl6e#^x*> zZ5#*taY7`+@<8G*+5KFT#;<-tvfiDBch>je`SM}vu*lNBy#`d98&%HrUwojenyk5) z#N)e)PbLbW5n7Eu%H-Q}5~WoeQWkr|Mn5d9iMFs5xbaa6%ZrZP3ZzY^c_h~M;39e+ z^<{gg?CvSJ0{CK97>3RO=es;=18z*aY3(01J-=xt7_J62a>09ObI(qZYBV+Z`Erl2 zGA{!K2z&~$@yzSgaoMPHs>3JlU#MoY56z+OgI$Mo0I9S4XJoe_hO?x(P78tUKyg86 z2}A2MpO+y-QnahzV#kkge+RaXkX;;^gMttBK`eMu{>le_0#V)_ztKhq?62PQ^rhig zOzV_nj{Aq%=c-BAecJ_UbrdUCXR0+EO# zQs|JDD71P*m;JWomRMQh8ALSzzY;#6IBMr_Y&b;>K3@A+IQN*ma%0&=XBK6r3f#K<_gW`|X>%Dy6x)c3X3^rtMfbe_mG+hSidRCVW%3A#r8{eaEW_Png;ZV+K zVizS)i;gMd9bx9lk@$?U5f0kT5liv0qFb$)i?BWSg=@j}xkj97jtAO?zFA3FQS2AD zC;gx+a`x~)Arl^-RDRs(Gr$=3JX@hiOscc~wHjHmJk+rGW6^qO!plQca(eR%E-TiA z6!(IG?(Z2?g6%)1GJHEb1Gkd=(3xJc^9HwMjN z3164D$L+{=k91v3XUb+pN$p#jMrgONMtF$N)p|NUe8APxwl}#F+x)wc8uI#Kw8rGY zebt^##1d`75gANrf?gpA6W{`&;tl-0qHYPqFp)6%ssL9dyyn*x+s4TkhmbDved&t# zWX2^>u>Ky>ap(Co6{?%Df)Fc(U*CgxI!^@Cg%HeG+gD)@V{Nf;1KIs|&6v1!LBeg0 zYW^=NU83sqk!I(f8#niNOeTlQ3!9#Lar$Km=gOfibu(~VH=M$A2l;a3oHOfXYIvuc zb~K6dkf8_zc@K+gWAN;<+V(WfsvpHUE$pOZa*T~l@@f@4WGjk}9JNUKJi8)X^{*rrQGF8w_GSI_nLp+e5=d&qtL%@+P z>5hQUDpmIC$nga|6Wdg8`>@g#`^mWu&apeIhGFB1Tef;FiPNNo|$0m|!V)ULN8{hwWxT*LB(yyOnD?*34*|a-e zLm6%Wk!xnugj^|l#|zTZ_@3Nrf6iUrelSYU!e9c*K8P?6*xOoZ8BT+zr=bk{4;=?{ zT(S{@5b|s8Ys2)qhk0+keX@sa*QXNFUzRoaWVk};raw#^^l#`He{ zvX&zvxYNO>)TDrmW?sUl3zQh!6?q}H1XY6Oy0m-IZwC#xc4dW*j%rl&rZCE|kF79Z z^l!u@;w8r)PHE4vM`3Sf4K$H&wZmC~jYIQ_i8zjk+tPe4_15G2iq=vC%TlrR4yWB= z!tZBF%DsPAlE+H8E5`XoVc8#2_?A?TK3OYdYWP8qwOf63s>jP0Q#?;w;qBf~i1xoH z25&$?5gg_CE#R3(XzZ)6#Q0wOZLuCH?wv;*Gj{!#60*E>v;a!h=6ob`i0fRg=0r_{ zf%``mljF}1jn(>iV;8iD%ap(gAtSFAc$w+i z{-YB_>^V~QhXit}x9@3*M%^$*&S7Cj^45kp^;_jhE)sK7eGETpWm4_74Sl(yUqkpoXqI%;g5_{AmSwTz(}IQ!B&?lLsbx$CH(4 ztWRh^dVVessO(teA2<={TuP=bwIgWbGKnVHgUIyOH3=oXezj%YPq)AzP1A-Uga)T%w*5Iz?q zJMkVI(k4@xrAmIN?YmDQWq@W;i$9z-S%p?|@dD^8%Ic+KJR-z}eRQqWBJ$~C=8>7P z+Qt7)JLj?qJumM07c|~DJ?V4yVPze+$4pDx08z8LH>gvi7xA+xug*#OZj1}%HYBOP z!YTo{_VsUm&Z&dJHN+b`rDmVMNtWO5k*fd`(4-IUdZ{TaR|52OEJ-UhjoiBOXo!Cy zT$;1q(77g%XT0%LE$>Y0jW z{fDwc%ZNoO3tgj*BX}|M*F6{gvwaSOItSy#cX{|#-_2klQ&5}kH+WZ$c;VyKeKP_HrH+Y5cv%7a4-H+j@ zg0`<_c21R|=d2>Lb9U85&d=W#R~J7*W0DIa$YP*@HI_6I(l?9j=eFAyu;o6^lQo9c={f zMNS9a^JJ^oTI{|%7FH8oAJ`MBa5Pe*{d2>d+^m1(I$G39!eK(0wI_3AmMu6e)>V!u zSK;`xZ@BgBqt}CeBJn?|ZMZ_y{W_)M%H;G^BWa4}fQ$@X2462hxPqEJL#1uBlPV(P z^lnJZKEk2=Dmif$o5mlnQ+d1O(vmqA?PaDT2+C3$GA!q7Iy8c_zpD#nsp!%Ld6K1N zSl7_H$fTX4MLPP<)TJ$yx}+_Fx^j#jn7AK{Ul7WZ|0niDxT>GSlGC5CLoYw}ADzB` zn*;2_k7D|R2s!6WatXMbj>tlz-EhGTj5=GAz>`2~?a%L`6n9AtVLmU5KZ?))xh%xH ze`ZKl!Ry~q#&)!j?JYHELd_MNY6Ek&&&-kT7QrtM#4HZU-6?LL%{7d(pFL|b2^!Q> zUwtR~PNt|>N}piZPO>?czmpYj%l%QAHVre#Rl}j{@Cf~~1P%OG$*w%dkIjFzgkYBa znD)WKlRkMgySPl%NceK@%VtUN-ib|DXv%9_Q;Upm>bCR=j>W#PFKS~^JDiIqpKQ=? zszG+-p;6|H+ptxak#d0GvkVtKMFnL~-^D&l1xaN;m6X;DS0jdo$#|j!(p ze*J#)$&J>EMr1xsNM;VJeGYWX#tAYwT)d!S`$RMz&IT|A8!7k*5CN-oX00GRjMTC9 zH)b(L`BVcZJm-dgy~xq~$2boihFGMD0{B>-{{;ekOd@oZq%>AZl^;`ohyr&r`3hYl z55)6Jm!{hap!>I$sm{+wi>k(G;8#j2|5d~U2^sJFZmMi_%Z7g;qO$K-E?p7PS=vt_ z_`l)B#Q$E)^~urfiE<073T*bHX(Yw9M}^0?$fX}LKir-jS`em@V{-`Zcwt)T*$mt4 z_yA=T*y4Wl9d|G?OVlPu4%YOEXll4lvQ-GXjIkXHJ$5EB2wDSuJ~h}yUCj1H@r@k5 z&AJ*BP00-GLq=0A4oA&RdH#1B{4;v}-92W?-J!A3uyW0~2aBKee85gNO|fERr7PAj zBwHiPaBOuoW=?k;#tG~IR6bN=#=ZbVIh>m9|ZI`r`3Lmt7M z4_j;))^o+`1f{K(iq8+kS>5x}=gs5A1>3J5&^Fz-L~CrIGiJ>gZl&v>)=nRuayffO+;@V#)cS#An@ica>ArQ7y)ga)dD&1{m)xNbX*sjiG^Yd?O7!hS& zI($(4iGtgv{V^^~Gaz$)Ft3L;x0x6-TLbhjn*$lJ-|G)JGS!9)CTKKi85>;gp+=J& zkOHVm@xS-7cASdL_~-lvn!q~#$FG`K96LoM^oV9uqvUFhOlv>y+U=Q&`t+ccJC5#I zsZJ0QO;WLdf8F5H%IOtB(g9RLKz1>g}Yr}eUAhA`y1^4!3n6}Pf247fcd16=78;bk=dVkMk*3f z<8w%HMr)%qU#BO{p{#s0II2|faGPk#iP3_La_T;1Xe);kKO;evwjCk91dV7Rtk*Cw zT%WmKVMR6z-Y`}EpkdAjq|j%&H$!wZ{N zK2;olvaoY!i(?(!DQ@^bY7>=VD$m!CGP14zNg9zsdHt|uAj;#ua6qmNMxpFIs*F(C zX!iyAEF>N^N(?yda-l%FN`-Z8D&AK6|5m#k(mf4Sf_rPYlhl zcdNJ4=tSZ6?k&>s{K&<=^~bgTemctwabbSpc$p;eXI4%ULA;n`?9v-p15w=;SR`+H zV9Kn_X1G?^;;+#Y(xkbbDb@OETIQTJ+4<>K=$%V0?3?mdTjsR4FO(z8YoKSVz~vpq zb#^umg#~XDV!Jx}$2Wh+(YtJ4@6)me`;4U!(W~1i-G$=~U`YI|KhWKBd9x~5ubM?P zC2IOcE$Az?_wDtoD{cz)uov7pF_c~zTxZgd?mwXw=5t`#YQl_=FRxBy!rL3DLXjH! z_W)Q1T`1D8{lZZOli=z7J^0}sjQxNbPJuIYMWhI00c^iA%oa&7cd|oqxG4{g?@xJ? zKWNz9e2!X)oVM|hq3Zq`h4@$rxF2jhw8|^&i$O^9{aIMyeIZ#c`gb+<^CbyjaKtPp zs%yZ`oYB0{d%<=9@7+3f^sB{b)tHf55IeB>AbaG$lW@e3D8&Q=we-VDMVV%a{9_&Q zjqgQHEEb8ZpD*T0=Uk?xmao=tZF9GWLh4KjY`zc|vkg+@hNwP)5;46&-^M@Jg$00Z zV-}dA=(0ZBzQMY02uppa)X0ZefO8lGaToK~Dtdv#A-&*D$VDvblOcx?w!R4hB5xV| z$pD{lO?zK4%!X!0*P`>jQOL~OPOF;zVdfSq@own_;rg>u{Zx!QS`Chs$$a{6dP&%h zd0{)8MuxI=9^H)TU(q_Aj%-Sr^9v$c_fMc8lD@TsQkHk4#4l-H#kEE=Z8Mog?~nDO zJD553$HQ0ES#rp$7dZyH1AnO#LCADG0F_ixr`$vxr|EjZPM##p)Cyx7M!Yf}GACKl zU$yTrFWgxRitkVR)9H4xw6mo=0zPw+MYerp?_~Pn*!(ibw*85KNNjl%zI9KDAV7v9 zQK!qXNByTzFuJ73Js9dDSxI1e@e3K}e|cQhdJtq6TQMWFfnM#96^IQ&d(~l_lI`&R zGF4hel=%~HHW4)&i3;<3oN^NqUiTIc!JIKY)cvIQ6~E{cncJ;PJy#G9onM%~xyxWP`9UtzXUQO}f|ElAsoidp z{VT{i{jc=>cl@o}KzKS=9Y+kC+;{pPat-n_eoh7R$}LDyD=)EIzC7l?Z!=EDwpo}Q zO)PKJeXG-HV`A?t`+GHvJS0VR^iSgt=_f6hZxc2zoZk@?7h8Ex-rztUJI?i8R}B$a z&t2^`*1}t?Ymg4Dz%r46*{ix@=P$!`FRxo8sa$+5!obxYwDbQ@Y8XP1xg{6Kp%7#S z0J%%Ejs$cBFnOVGr>sAWrUbMzJawD(eu^Zjq*=t>XfBrZyyciF+Wz%y!pJU~DTVw8 zi(n?sLH4{kcNrkqwqKb3pwYk~SNU7&-R?)tpQ^-bm>;u`e#O=ZE;aih zeca?$WBr~!d6w;JiR#y*S23QwU6<>fCZo(C8#YH{3QuI&?1* z)F8GR@l98upsxA&KIs%|QR)(F0o`zNsDIeEkA0Pvzq=x`&E{74zwOqTK_O0wAua}^ z>O0D2oBoeJ+>P}C*M@Z1sVQ}RP+NyjM$4xOheo(B5g$-y`v0o7<}*a#9l*5){s#!( z_yF$Fxd`9xY=QVZ5l*djrhdy{Pybw|vN&!_DUyoA@TcTBk@_!lOaiZ0=ew%oI^%uq z00!4zZ6qyq#S*Cn6!kY^(V$Vx`;$+$`Z!AaRM9yZUqO>s75eVN?Mm2?XLNrUHnz8S zPonF{DnCycer}&Igpbzz7gql&Gjf8Knd{nDAe(?P6uD0witO(Sjp+qT;v+-BYu4cP{smc>&rTvoZePkX7R)vWrI8);;LKNrRB0K$7je~xms|z^TZ~%4K<(i z`bXF@TLH2$cGl8DM$}gH7I(^zUz+Jh59JrbUz=$hP6agQ4|pTZqYAQZ>0JH2oX%oz z7Q1RShyY1k!VZJ* z!ayj#ZXoh*lM-?t&CnUE_$n4UR+!>AyKdmG1Yvm5JomAbO^@+eP9kUIGx5s5bnlny zGCvET$?@A8@+!Q1%kUd~3DxiNWW`ScZ5}qm>;y3aY=THTv zq@J7xOinx;sANWQ8dQ1VBV(#BfX8Vl3u5lQsc2U|4lB!416a`=ejKnF(7yL{3q=}C zHD+%i4*^}*$&Q<(gH2o@I!f8K4kg<`i+#$ik92kYt}pHY^(2YY#aH#-m4_Nx*=du0 zT+o8(w9d5XXy`a;``oiibL!Al$MuIM?Z^C;?|V0~$gX z2<4yGEMcWtc0YVPDe+;h@yJ-!Ja2{zpDe7{h&5GiDm*leg*U!xqs&ir8~!)|{E-qj zBF*|M`P6bATYap!(| zk)kscjOHXYx!zNEZf<<`H1Mc#R`UuAX+Z_)h?c&SvygiDC0?#q>qhRHExEXmS3c48 z0t#CWtJn;Q2!EaSW8&+Z<-)A&8O8!fLK=(V_zy{KweI?W$*5?>3`x3cZ$nvsi+O?s zz?Sz4)zGKbD%*>>nZvlAF?^y50ZzMdZO|!Xirx+@+Fit7NaDIfy&@5j5xcr55^5^U;Xzwm6=`y$bS8MB+EAP zPX?P15OKK6&!6ooeur~w4S8C3{6AHlXH-)`yM<9vl-`Sgk&aYBA#@a!h*CuX1&s6# z(mSCS5kk{Q2LTa50g)a;CxoiB5F))v3B4o`k_&#{y=&d`D!{TA-h0!iB9i zLK_u*pfkImC0+sILF%C6{VnrJt2^FZ*Z;K8-I)qe#^+1GLU8ihPs^h0<8)Fb4s&Y% z8Pk@tML(DOs!nw`^`oX4MDz+z#0sZ6Lkg2MjPe{#IO*!eqpbxP-6Anztdn6ib}y3)kH!2~CJfl8&+od0bVX1URN`|j1y zgKH@&wHZnMCL$?TpW8k-1pS)2sY$FF>hxo|*$39Gdsy}rJvshtbS%rys(7knTeZPnq=xY)DpPpCjj@$$l6 z;|nwKZxZ#G*{>1yp#itp z^(5r0C0Bej)ER4|$nuxvdQeBCrih>Jr~BZQkE~_bzsrTSXrp_UyU}C(fnjlHR?cD~ zg>D`kJ$HLtaE8!zlG)RCX~TR85TETFSTRb!(%7e{LiJAku-t`zX5*~Ue%dcB!oqEC zWEE_WfRQ1YK(^WO)1YjrpKzg&yjOe<5%6 z>&)@wCN}qZ5CB;4ox$42HI4yQ(=Fzyv*5y?lEw{8S$#AM7Z)X#1d9^0HrvSuhWNZi zjx#4nj#_}UP%iIReCXx+1PcF_iVK?p;fJaT7wyJ<0vF*M!X98LCN9_q<+rmKlKNDWY_8B z^?|L{A59aKRNX<9lNg0s(b15dvzgED+w1Z!8$k8J8JfD+AQ`7!_MwjQ->$YgC&>r zCQULK{hrDFxH(IZf-#G!xplnSVmR@W4)YQ3oQZm%%uEZLP3C9aF)k2@U5KTPaXVV3 z05kX&;lwh7uYo=nRtmubxrG)dT+kj1Nd$gUVxMYQE=oBYNabRYXQ^QuQs=zB#r*;@m6Sxpn&i$zpz zTGw7CIs7<%ghZwgpSYy{%HvJ3Pl7^Ue)e*8SEE`CUDuFeSHaYG!&XGV>Z!1DTXAibChXhI$n?u^>e>C8Kj}!n4c_>%4DbRYg z0Fl>xI))Vi?rz%d)vjY0v_#W&{W2AV?i^{>9^%6FwCcI6ow+YMi&;)mea|Tgcr-GS zoDrfY6B+}2PbyQ8=g+e-Qp`bWv=5$g`K$ zaqp>h?u2n-I|{`lhdXLC=r#Nd#ctQyd$_#BA`I<(A`dE&6n*7bROZ?(_g7C;E!B@l zeBwd`syQ=h#EHPh_LkNEWS@I;>M76hz<{h)orh_NsP+|z4s zDd7ut%Dhcs>WB05gK+E)^z>%YO6n_L z-92(G%)3t9L+&@b6c9``1qaqXq039I1$gMj@jpK|d84H-vL{UOfY9UxL~gUixxO3X z?NJ&e+klhK1@QLTiW+_v{N}bz%^R}ovAvtybaUjiXQ0-CLrLi5ZxQPt9>dx+O;-;H zQ<^NbH&069^AFu38TV{ebDh_c{${GBja{(2wYnQ6F_+&{r1+Ah5wk(ISxBb;VC&5E zm5=_hx^#|dd!Ph}`uIxJDVGP}eJxOl@6@HE2MY1x6T)#{baHV?*rA04>S--+c@=vL zCL{we3GgcqDJFJgK!&3N?`toOK509%R-c@K${@(er<5qX#OUdl7b@z{96ROXe zQc&_?xc^iEW@bDaV1xN%hvfbOZGr0k+dKb_xRAF!$S!gYg1jE-J_eilGGmU=ZRu&4 z8koA!5dKs~YSw**?C$%sBVP>|Q7KZpw{f}7-atn_u4KTn)2uP~5M5f^FfAxAWOZ#4 zm(Cs^f&lk0@cOzQQl38cij0ZCdNV+pwoX2ac6`TtvCeUP@9ld#0=Ihnpj_r_mjNjF zZ+EQ4^yZONEyi8`ojdL5yuSQV{Vma93-z806LkDe6wKm5wV=CUtWm}6(lX?r0otr+ zr`SC^f=Eutv=fUB$5>u!;-odr&+9Bf4|_CWzxO%_Ka@(ua6Y4Lh&@z~BeZZDscr58 z%J~`Ss}SB1|1{A{vqs@Zv+=@-?-6?b%17M)+p=IrlKbMena>MJ;%<;T+>hx^*)^u2 z1DuN#w+C*LBuA=`q57+)oL)PG_qRK>rAyNO6Z-1pMrO6MH^~7Hr)%9?y1Bf!FdChm z4aJ9HhY$@7Zf3?XsOni#C+paqefc45G#UB(V4`rlWf@0=+`~i2K*+AhYTeo@a7~>| z;s)OU3}Zz?k2NQfK=dv=%*Q$(cmq;+e4MLqJfv;ZX@qV}Lp|ZSUrYvMd3x2}{>G>$ zfz=6~1827ar>Q$i2@XB6L-tDZYyftw8=8NK&@`lC_*ejyy=BoC5w-I`ZKT>Ge&7hV z?SSO@PlpsN@*pEEJfHdUIt&v!=iTX(s!>b|D z-6!B@)1K5L>$7q2(wSFg&(~8ttjG#nzGB@h!*HdL{1NY7Us0X9Rm-0>BSPa`s2GQl zLorz)D{D2{gx4|trW^(?LScI`hnnS9Gfw**t@m!)#O?vv7Ttp5ewar+VCItT@<2G- z9-^?x$o`Gt4D?d*48c;$ewz_|$6)dbj!^$_R`EnQh>N3IpPu_M;o~+R%gnF2I*f_C zew|{1WV1F6`t=+n=$u>)Nk>E6_2(crq9LCnSxoSN!0x0?xgFtDnGgeV7Xyi~8jUyJ z<>A*2&2vX%a0hIOh3#X}DyUSUMdM!$V4m1hJ=@eRm%^(jn~_W{IiYckD{0>CoG$M% z!ro@14=Tx4wGmcA#;waGEM;%nb-XF>rQb&+SPeSVQZ#M={Tf8`@YSG?N@e>u1TKEQ#&mW1mMm zm2Z?#5g56EpsVZQ;+(dMcU!Q_uAYsye=QlZ^9u6t{z9lxK9jM&=}7&G`!T6sOpPM_ z{?0yA$U@!li@e5GriB^FkI;tMJpMY?j*xLm{~L7>-|vxgZ=vLvg*F@TL45UVPKBOv zNBl5x0`TqmE&bv3a+4~)Q!Q4=2vg8p|K(_dnJAcRW*g={wY&Rk$VYB+`F5+rSF0w0ckmc$8w6%un z#$ZaG(gGF@ul0{{dR9+bf6$4qZ^Yt!C)y(9OVQ`y=p2ci5s{`d(}JWyk}K5rdh_;l zi#La1BKm6n)Ej69N7yt;2Q_~8k2VJkzEcmlPreYLhK@w%K3K#nQ~vTlB4Z8V^v#@o zA&sD7^njH1>|(s8{K;|}fLjC1jTMkRWx6N)6a)BZLgJ1qy6N5HWuIfy`AWuW9H98~ z6ph<-*4Pn*2|Q{(@-Dgx8LcOX$}W{H=xSsu)SjYSb-rs#lskdsP=B6W4xMV94%q~i zKb}iZc5;)|Sf5{uYUzU zSOw?un_(%$`B+0sJnvt>AWekg+0SPFPh|5##E2~pM95(W!>g6s^-sW3Q5DcAZ+6`8 zi+S|bmoCp`-PFpWh_-tGZbj=7Vq{GM;4+`70+n%mE+toj9KWgJpG&q=tMy;sq*pgh z${avgDyd%{^tFW~KF)rj7h|w-oH8eD-HGrk2<^~SFeqMK$WYSa0+`tMN;+Q(<{ z+P6e`S%qlASeM6L5xSUEAMeoy4i)UR`j@HxM7_{7b6qrO@UR=`7V!39ZlUb{^u!Gq zm+uLDJX9clSlOatu1YWQRlVNm_yEMPAArCJt&17>OS+{H~6&}s%7%D8@{f%Q>UYiKva1#DV;IwZ9ta~G$>x*8m85?Kh=A7(`&XQ--85_U-E?gwrt=?w0 zjW%`9nWHD^QbBai0wpOj^X7XnIAODKc$jx`o2B|l&aI_zqjaN{FSGI37Lu0}p z<(L%P|KlKRaKOAY`kiiIsW7QaQ7I&&bS_alSMF=MlghU%+J@bfPhV&Fp*cSgG>%^Z zS5*jCtoVC4jwH>*#JkICN>NwzjqwahG~_!LbLz#n&PEH92S~D$jO5@uj%{Rnb>iOx zM93Y=^_i;C1@pIa7EI)H)aTjNr@|vWl;(AM49DieS|9V$gnF#9mNc+2zKAF!^NcPv z=;JAC4)nd%fo(zp#`;IIs`7$3Bf>3}rZm7q2^K3| z&JA{n2&$eP^zk#8W{y~-&{(3JP? zFFR#9^IV^0oxO%PZ%_CYiwk>t)b=epSDSSq3ze%>K`>pwVS{JUvxAV4wg*#r!Uh{` z9loKsMuj9!-+h(+?j~}Dj+I(>q3`N}@OG#H0yla4tH5&BdV7|u$B*M=_AhHFiHdg$1}-WXHx?MQmHuw9DcuPc8AEPmbz+vQQc9quBe zDZt6FC|`Byo^UYEd7Slyo;egdg6OA6!j`3U4f4^b`KG{d0m<~)6*MJ|Q_Fj* z%iU0}R^XRJ!S8qIkj8GzavFzmM_fO8GJpy8gyh z^D5yRueq)0FF$gf?|#38#UyVx!C!yRD%IlfGDKw2%e>zn875x&AvV%ZmMHr#rabYT zgY?YSw729f5LQ~rEM13~;J#hn{ZbmKg#>8e{OA6?w44p7Tta?qfH$A?le@{*^F6tU zoC^$8KV+NBVt@pZ&C8aPNaZg^{k|nvgqvi#WjGoug~YXRi+rZkHY42-R@|Litdl4CO_UFO) zU$QvLk{wbuBfQU`CWp3cZ{Z|~Sc9IC6ErTeak_^?f|1z@dEaSQ9$tnnD|*3Q@N_p3 zb{({j`TYZaSkbNV{#)Uhk7`J6) zsC}&xiHXWY;15iRSA#b!m;KN66oOQnNp%}C&e?x7T-cux(DI#1?S?sx6a$L;vbDpg zM(CYP-1*^suIn&EydQ#tq&ZcvO*X~1yu&H^1Z?F1!Kd4W_T*-c{Mv~v>?x8qiZbq! zzMs%^jxI3&-jwYV>tgj{pTD*Yf(|_~l*(tV0LB?6O3Yj)e{-F*$`*c~<6VDENHn{o zdBpPDP6rfcm8$SPa)eYvG)?Em#9c5|TQ_vIH_?#O-kv6It1YXA?RU(#s>d-A2Hb#= zjG7)E7sei=aXzgl`Xnnu=MCh(5$bNNsby6sqx;NTIS#S>65-Kr$p+w(-{38(A^M`h ygHBJLh;v2y&%AWd+uzU13le}Q 이기 때문 diff --git a/public/assets/svg/ArrowLeft.svg b/public/assets/svg/ArrowLeft.svg new file mode 100644 index 00000000..4b110c20 --- /dev/null +++ b/public/assets/svg/ArrowLeft.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/ArrowRight.svg b/public/assets/svg/ArrowRight.svg new file mode 100644 index 00000000..0ad718ef --- /dev/null +++ b/public/assets/svg/ArrowRight.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/BackIcon.svg b/public/assets/svg/BackIcon.svg new file mode 100644 index 00000000..8db5377e --- /dev/null +++ b/public/assets/svg/BackIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/svg/Best_Badge.svg b/public/assets/svg/Best_Badge.svg new file mode 100644 index 00000000..8470f48f --- /dev/null +++ b/public/assets/svg/Best_Badge.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/svg/Delete.svg b/public/assets/svg/Delete.svg new file mode 100644 index 00000000..f6674f7f --- /dev/null +++ b/public/assets/svg/Delete.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/svg/Google.svg b/public/assets/svg/Google.svg new file mode 100644 index 00000000..0aa34364 --- /dev/null +++ b/public/assets/svg/Google.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/assets/svg/InquiryEmpty.svg b/public/assets/svg/InquiryEmpty.svg new file mode 100644 index 00000000..5444cbbb --- /dev/null +++ b/public/assets/svg/InquiryEmpty.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/public/assets/svg/Kakao.svg b/public/assets/svg/Kakao.svg new file mode 100644 index 00000000..a503e487 --- /dev/null +++ b/public/assets/svg/Kakao.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/assets/svg/Plus.svg b/public/assets/svg/Plus.svg new file mode 100644 index 00000000..5bb9abf5 --- /dev/null +++ b/public/assets/svg/Plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/svg/ProfileIcon.svg b/public/assets/svg/ProfileIcon.svg new file mode 100644 index 00000000..3df63f71 --- /dev/null +++ b/public/assets/svg/ProfileIcon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/svg/Search.svg b/public/assets/svg/Search.svg new file mode 100644 index 00000000..52241e6d --- /dev/null +++ b/public/assets/svg/Search.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/Setting.svg b/public/assets/svg/Setting.svg new file mode 100644 index 00000000..63a0344c --- /dev/null +++ b/public/assets/svg/Setting.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/svg/Sort.svg b/public/assets/svg/Sort.svg new file mode 100644 index 00000000..657b44f9 --- /dev/null +++ b/public/assets/svg/Sort.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/assets/svg/btn_visibillity.svg b/public/assets/svg/btn_visibillity.svg new file mode 100644 index 00000000..43a5af17 --- /dev/null +++ b/public/assets/svg/btn_visibillity.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/btn_visibillity_off.svg b/public/assets/svg/btn_visibillity_off.svg new file mode 100644 index 00000000..43cfd033 --- /dev/null +++ b/public/assets/svg/btn_visibillity_off.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/public/assets/svg/facebook.svg b/public/assets/svg/facebook.svg new file mode 100644 index 00000000..b9c9d493 --- /dev/null +++ b/public/assets/svg/facebook.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/instagram.svg b/public/assets/svg/instagram.svg new file mode 100644 index 00000000..0b9337b0 --- /dev/null +++ b/public/assets/svg/instagram.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/twitter.svg b/public/assets/svg/twitter.svg new file mode 100644 index 00000000..14a6069a --- /dev/null +++ b/public/assets/svg/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/assets/svg/youtube.svg b/public/assets/svg/youtube.svg new file mode 100644 index 00000000..699b5380 --- /dev/null +++ b/public/assets/svg/youtube.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145cd..00000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg deleted file mode 100644 index 567f17b0..00000000 --- a/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28c..00000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 77053960..00000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44f..00000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/AddItem/AddItem.tsx b/src/app/AddItem/AddItem.tsx new file mode 100644 index 00000000..98b726ec --- /dev/null +++ b/src/app/AddItem/AddItem.tsx @@ -0,0 +1,167 @@ +'use client' +import React, { useState } from 'react' + +import Button from '../../../components/common/Button' +import ButtonImage from '../../../components/common/ButtonImage' +import TextInputPlaceholder from '../../../components/common/TextInputPlaceholder' +import Tag from '../../../components/common/Tag' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +const AddItem = () => { + const [productName, setProductName] = useState('') + const [productDescription, setProductDescription] = useState('') + const [productPrice, setProductPrice] = useState('') + const [tagInput, setTagInput] = useState('') + const [productTags, setProductTags] = useState([]) + + const handleAddTag = () => { + const trimmedInput = tagInput.trim() + if (trimmedInput && !productTags.includes(trimmedInput)) { + setProductTags([...productTags, trimmedInput]) + setTagInput('') + } + } + + const handleDeleteTag = (tagToDelete: string) => { + setProductTags(productTags.filter((tag) => tag !== tagToDelete)) + } + // TextInputPlaceholder는 textarea 컴포넌트 -> onKeyDown에 전달한 함수는 HTMLInputElement용 타입이라 교체 + const handleEnterDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + e.preventDefault() + handleAddTag() + } + } + + const isState = + productName.length >= 1 && + productDescription.length >= 1 && + productPrice.length >= 1 && + tagInput.length >= 1 + + return ( + <> + +
    + 싱품 등록하기 + + + +
    +
    + + 상품 이미지 + + + + 상품명 + setProductName(e.target.value)} + /> + + + 상품 소개 + setProductDescription(e.target.value)} + /> + + + 판매 가격 + setProductPrice(e.target.value)} + /> + + + 태그 + setTagInput(e.target.value)} + onKeyDown={handleEnterDown} + /> + + + {productTags.map((tag, index) => ( + handleDeleteTag(tag)} + /> + ))} + +
    +
    + + ) +} + +export default AddItem + +const Bone = styled.div` + width: 75rem; + display: flex; + align-items: center; + margin: 1.5rem auto auto auto; + flex-direction: column; + @media (max-width: 1199px) { + width: 43.5rem; + } + @media (max-width: 743px) { + width: 21.625rem; + } +` +const Header = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + margin-bottom: 1.8125rem; +` +const ProductRegister = styled.div` + ${(props) => textStyle(20, 700)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ButtonWrapper = styled.div` + width: max-content; +` +const Main = styled.div` + width: 100%; + margin-bottom: 78px; +` +const DisplayWrapper = styled.div` + width: 100%; + margin-bottom: 2rem; + @media (max-width: 743px) { + margin-bottom: 1.5rem; + } +` +const ProductText = styled.div` + ${(props) => textStyle(18, 700)(props)} + color: ${theme.colors.SecondaryGray[800]}; + margin-bottom: 1rem; +` +const TagDisplay = styled.div` + display: flex; + gap: 0.75rem; + width: 100%; + flex-wrap: wrap; +` diff --git a/src/app/Boards/Boards.tsx b/src/app/Boards/Boards.tsx new file mode 100644 index 00000000..1a0f8a7b --- /dev/null +++ b/src/app/Boards/Boards.tsx @@ -0,0 +1,7 @@ +import React from 'react' + +const Boards = () => { + return <>dd +} + +export default Boards diff --git a/src/app/ClientLayout.tsx b/src/app/ClientLayout.tsx new file mode 100644 index 00000000..5175cf63 --- /dev/null +++ b/src/app/ClientLayout.tsx @@ -0,0 +1,18 @@ +'use client' + +import { ThemeProvider } from 'styled-components' +import { theme } from '../../styles/theme' +import GlobalStyles from '../../styles/GlobalStyles' + +export default function ClientLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + {children} + + ) +} diff --git a/src/app/Faq/Faq.jsx b/src/app/Faq/Faq.jsx new file mode 100644 index 00000000..aba72311 --- /dev/null +++ b/src/app/Faq/Faq.jsx @@ -0,0 +1,7 @@ +import React from 'react' + +const Faq = () => { + return <> +} + +export default Faq diff --git a/src/app/Home/Home.style.ts b/src/app/Home/Home.style.ts new file mode 100644 index 00000000..cb4b9b27 --- /dev/null +++ b/src/app/Home/Home.style.ts @@ -0,0 +1,463 @@ +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +export const HeaderTop = styled.header` + display: flex; + justify-content: center; + position: sticky; + top: 0; + background-color: #ffffff; +` + +export const HeaderNav = styled.nav` + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 0.6rem 0px; + margin: 0 13rem; + @media (max-width: 744px) { + margin: 0 1.5rem; + } + @media (max-width: 375px) { + margin: 0 1rem; + } +` + +export const HeaderLogo = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; +` + +export const ButtonWrapper = styled.div` + width: auto; + height: auto; + @media (max-width: 744px) { + width: max-content; + } +` + +export const HeaderLogoFace = styled.img` + width: 2.5rem; + height: 2.5rem; + margin-right: 0.5rem; + display: flex; + @media (max-width: 375px) { + width: 0; + } +` + +export const HeaderLogoName = styled.img` + width: 6.44rem; + height: 2.19rem; + display: flex; +` + +export const HeaderLogin = styled.a` + width: 10.16rem; + height: 3rem; + background-color: #3692ff; + border-radius: 8px; + ${(props) => textStyle(16, 600)(props)} + color: ${theme.colors.SecondaryGray[50]}; + text-decoration: none; + display: flex; + justify-content: center; + align-items: center; + @media (max-width: 744px) { + width: 9.73rem; + } + @media (max-width: 375px) { + width: 9.73rem; + } +` + +export const HeaderMain = styled.div` + width: 100%; + background-color: #cfe5ff; +` + +export const HeaderMainContainer = styled.div` + width: max-content; + display: flex; + padding: 12.5rem 0px 0px 0px; + margin: 0 auto; + @media (max-width: 744px) { + width: 100%; + height: 771px; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 0; + } + @media (max-width: 375px) { + width: 100%; + height: auto; + img { + width: 100%; + } + } +` + +export const HeaderMainTitle = styled.div` + width: auto; + margin: auto 0; + @media (max-width: 744px) { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + @media (max-width: 375px) { + width: 15rem; + margin-bottom: 8.25rem; + } +` + +export const HeaderTitleFont = styled.h1` + width: 20rem; + ${(props) => textStyle(40, 700)(props)} + margin: 0 4rem 2rem 0; + color: ${theme.colors.SecondaryGray[700]}; + @media (max-width: 744px) { + margin-top: 84px; + width: auto; + margin: 84px auto 24px; + } + @media (max-width: 375px) { + margin-bottom: 1.125rem; + text-align: center; + ${(props) => textStyle(32, 700)(props)} + width: 254px; + } +` + +export const HeaderItems = styled.a` + width: 7.25rem; + background-color: ${theme.colors.PrimaryBlue[100]}; + border-radius: 40px; + ${(props) => textStyle(20, 600)(props)} + color: ${theme.colors.SecondaryGray[50]}; + text-decoration: none; + padding: 0.75rem 7.75rem; + display: inline-block; + @media (max-width: 375px) { + padding: 0.5rem 4rem; + margin-top: 1.13rem; + } +` + +/* 메인 */ + +export const MainBasic = styled.main` + display: flex; + flex-direction: column; + align-items: center; + @media (max-width: 744px) { + margin: 24px; + } + @media (max-width: 375px) { + margin: 52px 16px 2.5rem 15px; + width: 344px; + } +` + +export const MainTheme = styled.div` + display: flex; + background-color: #fcfcfc; + margin: 8.63rem auto; + @media (max-width: 744px) { + width: 100%; + flex-direction: column; + margin: 0; + } +` + +export const MainPopularSellImage = styled.picture` + width: auto; + height: 27.75rem; + + @media (max-width: 744px) { + img { + width: 100%; + height: 32.813rem; + } + } + @media (max-width: 375px) { + height: 16.187rem; + img { + width: 100%; + height: 100%; + } + } +` + +export const MainThemeBasic = styled.div` + width: 18.625rem; + display: flex; + justify-content: center; + align-items: flex-start; + background-color: #fcfcfc; + flex-direction: column; + margin: auto 4rem; + @media (max-width: 744px) { + width: 100%; + margin: 0; + } + @media (max-width: 375px) { + height: 134px; + margin: 1.5rem auto 2.69rem 0; + } +` + +export const MainPopularSellFontTop = styled.p` + margin: 0 0px 0.75rem 0; + ${(props) => textStyle(18, 700)(props)} + color: ${theme.colors.PrimaryBlue[100]}; + @media (max-width: 744px) { + margin: 1.5rem auto 1rem; + } + @media (max-width: 375px) { + margin: 0 auto 0.5rem 0rem; + ${(props) => textStyle(16, 700)(props)} + } +` + +export const MainPopularSellFontMiddle = styled.h2` + width: 306px; + margin: 0 auto 1.5rem 0; + ${(props) => textStyle(40, 700)(props)} + color: ${theme.colors.SecondaryGray[700]}; + @media (max-width: 744px) { + ${(props) => textStyle(32, 700)(props)} + width:100%; + } + @media (max-width: 375px) { + ${(props) => textStyle(24, 700)(props)} + margin-bottom: 1rem; + line-height: 2rem; + } +` + +export const MainPopularSellFontBottom = styled.p` + ${(props) => textStyle(24, 500)(props)} + color: ${theme.colors.SecondaryGray[700]}; + width: 100%; + @media (max-width: 744px) { + ${(props) => textStyle(18, 500)(props)} + width:100%; + width: 15.75rem; + margin-bottom: 3.25rem; + } + @media (max-width: 375px) { + margin: 0; + ${(props) => textStyle(16, 500)(props)} + width: 205px; + } +` + +export const MainThemeCenter = styled.div` + display: flex; + background-color: #fcfcfc; + margin: 8.63rem auto; + @media (max-width: 744px) { + width: 100%; + flex-direction: column-reverse; + margin: 0; + } + @media (max-width: 375px) { + flex-wrap: wrap-reverse; + } +` + +export const MainThemeBasicMiddle = styled(MainThemeBasic)` + align-items: flex-end; + text-align: right; + @media (max-width: 375px) { + width: 330px; + margin-right: 0; + } +` + +export const MainSearchImage = styled.picture` + width: 579px; + height: 444px; + @media (max-width: 744px) { + width: 100%; + height: 100%; + margin: 0; + img { + width: 100%; + height: 32.5rem; + } + } + @media (max-width: 375px) { + height: 16.187rem; + img { + width: 100%; + height: 100%; + } + } +` +/* footer */ + +export const FooterMainContainer = styled.footer` + display: flex; + flex-direction: column; + align-items: center; +` + +export const FooterEmpty = styled.div` + width: 100%; + height: 138px; + background-color: #fcfcfc; + @media (max-width: 744px) { + width: 0; + height: 0; + } +` + +export const FooterContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + width: 100%; + background-color: #cfe5ff; + @media (max-width: 744px) { + } + @media (max-width: 375px) { + height: 33.75rem; + } +` +export const FooterBackground = styled.div` + display: flex; + align-items: center; + height: 397px; + margin-top: 9rem; + width: 69.375rem; + @media (max-width: 744px) { + flex-direction: column; + justify-content: space-between; + width: 100%; + margin-top: 0; + height: 100%; + } +` + +export const FooterFont = styled.h2` + ${(props) => textStyle(40, 700)(props)} + @media (max-width: 744px) { + margin: 12.562rem auto 13.562rem; + width: 20.438rem; + text-align: center; + line-height: 56px; + } + @media (max-width: 375px) { + ${(props) => textStyle(32, 700)(props)} + margin: 121px auto 131px; + width: 254px; + height: 90px; + text-align: center; + } +` + +export const FooterImage = styled.picture` + width: 46.63rem; + height: 24.81rem; + @media (max-width: 375px) { + width: 100%; + img { + width: 100%; + } + } +` + +export const FooterNav = styled.div` + width: 100%; + background-color: ${theme.colors.SecondaryGray[900]}; + display: flex; + justify-content: center; +` + +export const FooterNavMain = styled.div` + height: 1.25rem; + width: 70rem; + display: flex; + justify-content: space-between; + align-items: center; + margin: 2rem 0 6.75rem 0; + @media (max-width: 744px) { + width: 33.5rem; + margin: 2rem 8rem 6.75rem 8rem; + } + @media (max-width: 375px) { + margin: 2rem; + display: grid; + grid-template-areas: + 'hd hdt' + 'ct ctt'; + width: 100%; + height: 98px; + } +` + +export const Codeit = styled.p` + color: ${theme.colors.SecondaryGray[400]}; + @media (max-width: 744px) { + ${(props) => textStyle(16, 400)(props)} + } + @media (max-width: 375px) { + grid-area: ct; + font-weight: 400; + font-size: 16px; + width: 6.88rem; + height: 1rem; + font-size: 1rem; + line-height: 18.4px; + text-align: center; + } +` + +export const PrivacyFaq = styled.div` + margin-right: 13px; + @media (max-width: 375px) { + grid-area: hd; + align-items: center; + justify-items: center; + margin: 0; + width: 12.32rem; + } +` + +export const Social = styled.div` + width: 7.25rem; + height: 20px; + display: flex; + justify-content: space-between; + @image { + width: 18px; + height: 18px; + } +` + +export const Privacy = styled.div` + margin: auto 2rem auto 0; + color: ${theme.colors.SecondaryGray[200]}; + text-decoration: none; + @media (max-width: 375px) { + margin: 0 30px 0 0; + } +` + +export const Faq = styled.div` + color: ${theme.colors.SecondaryGray[200]}; + text-decoration: none; + margin: auto 0; + @media (max-width: 375px) { + margin-right: 2rem; + } +` diff --git a/src/app/Home/Home.tsx b/src/app/Home/Home.tsx new file mode 100644 index 00000000..e3f1d953 --- /dev/null +++ b/src/app/Home/Home.tsx @@ -0,0 +1,194 @@ +'use client' +import React, { useEffect, useState } from 'react' +import { Link } from 'react-router-dom' + +import * as S from './Home.style' +import Button from '../../../components/common/Button' + +import Logo from '../../../public/assets/image/Logo.png' +import LogoFace from '../../../public/assets/image/LogoFace.png' +import HomeTop from '../../../public/assets/image/home_top.png' +import HomeBottom from '../../../public/assets/image/home_bottom.png' +import HomeHotItems from '../../../public/assets/image/home_hot_items.png' +import HomeSearch from '../../../public/assets/image/home_search.png' +import HomeRegister from '../../../public/assets/image/home_register.png' +import Facebook from '../../../public/assets/svg/facebook.svg' +import Instagram from '../../../public/assets/svg/instagram.svg' +import Twitter from '../../../public/assets/svg/twitter.svg' +import Youtube from '../../../public/assets/svg/youtube.svg' +import Image from 'next/image' + +function Home() { + const [buttonStyle, setButtonStyle] = useState({ + width: 364, + paddingWidth: 43, + }) + + const handleResize = () => { + if (window.innerWidth < 375) { + setButtonStyle({ width: 258, paddingWidth: 71 }) + } else { + setButtonStyle({ width: 364, paddingWidth: 124 }) + } + } + + // placeholder useEffect 적용 + useEffect(() => { + handleResize() + window.addEventListener('resize', handleResize) + return () => window.removeEventListener('resize', handleResize) + }, []) + + return ( + <> + + + + + 판다마켓 로고 사진 + + + 판다마켓 로고 사진 + + + + + + + + + + + + 일상의 모든 물건을 거래해 보세요 + + + + + + 판다마켓 백그라운드사진 + + + + + + 판다마켓 인기 상품 사진 + + +
    + Hot item +
    +
    + + 인기 상품을 확인해 보세요 + +
    +
    + + 가장 HOT한 중고거래 물품을 판다 마켓에서 확인해 보세요 + +
    +
    +
    + + +
    + Search +
    +
    + + 구매를 원하는 상품을 검색하세요 + +
    +
    + + 구매하고 싶은 물품은 검색해서 쉽게 찾아보세요 + +
    +
    + + 판다마켓 상품 검색 사진 + +
    + + + 판다마켓 인기 상품 등록 + + +
    + Register +
    +
    + + 판매를 원하는 상품을 등록하세요 + +
    +
    + + 어떤 물건이든 판매하고 싶은  상품을 쉽게 등록하세요 + +
    +
    +
    +
    + + + + +
    + 믿을 수 있는 판다마켓 중고 거래 +
    + + 판다마켓 백그라운드사진 + +
    +
    + + + ©codeit - 2024 + + + Privacy Policy + + + FAQ + + + +
    + 페이스북 로고 사진 + + + 트위터 로고 사진 + + + 유튜브 로고 사진 + + + 인스타그램 로고 사진 + + + + + + + ) +} + +export default Home diff --git a/src/app/Items/BestItems.tsx b/src/app/Items/BestItems.tsx new file mode 100644 index 00000000..844bbbd6 --- /dev/null +++ b/src/app/Items/BestItems.tsx @@ -0,0 +1,161 @@ +'use client' +import React, { useEffect, useState } from 'react' +import { Link } from 'react-router-dom' + +import { GetProductType } from '../../../types/product' + +import HeartInactive from '../../../public/assets/image/HeartInactive.png' + +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' +import styled from 'styled-components' + +// interface Product { +// id: number +// name: string +// description: string +// price: number +// tags: string[] +// images: string[] +// favoriteCount: number +// ownerId: number +// createdAt: string +// updatedAt: string +// } +// interface ProductsProps { +// products: { +// list: Product[] +// totalCount: number +// } +// } + +const BestItems = ({ products }: GetProductType) => { + const [itemsDisplay, setItemsDisplay] = useState(1) + const list = products.list || [] + console.log(products) + useEffect(() => { + const handleReasize = () => { + if (window.innerWidth <= 743) { + setItemsDisplay(1) + } else if (window.innerWidth <= 1199) { + setItemsDisplay(2) + } else { + setItemsDisplay(4) + } + } + handleReasize() + window.addEventListener('resize', handleReasize) + + return () => window.removeEventListener('resize', handleReasize) + }, []) + + return ( + + 베스트 상품 + + + {list.slice(0, itemsDisplay).map((product) => ( + + + + + {product.name} + + {product.price.toLocaleString('ko-KR')}원 + + + + {product.favoriteCount} + + + + + ))} + + + ) +} + +export default BestItems + +const Bone = styled.div` + height: 26.625rem; + width: auto; + margin-bottom: 2.5rem; + @media (max-width: 1199px) { + height: 27.125rem; + } + @media (max-width: 743px) { + margin-bottom: 1.5rem; + } +` +const Title = styled.div` + ${(props) => textStyle(20, 700)(props)} + color: ${theme.colors.SecondaryGray[900]}; + margin-bottom: 1rem; +` + +const BestItem = styled.div` + display: flex; + height: 23.625rem; + justify-content: center; + flex-direction: column; + cursor: pointer; +` +const BestItemImage = styled.img` + width: 17.625rem; + height: 17.625rem; + border-radius: 1rem; + @media (max-width: 1199px) { + height: 21.437rem; + width: 100%; + } +` +const BestItemsDisplay = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + @media (max-width: 1199px) { + gap: 10px; + } +` +const ProductDescription = styled.div` + width: 100%; + height: 5rem; + margin-top: 1rem; + display: flex; + flex-direction: column; + justify-content: space-between; + @media (max-width: 1199px) { + margin-top: 0.625rem; + } +` +const ProductName = styled.div` + ${(props) => textStyle(14, 500)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ProductPrice = styled.div` + ${(props) => textStyle(16, 700)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ProductFavoriteCount = styled.div` + ${(props) => textStyle(12, 500)(props)} + color: ${theme.colors.SecondaryGray[600]}; + display: flex; + align-items: center; +` +const HeartInactiveImage = styled.img` + width: 1rem; + height: 1rem; +` diff --git a/src/app/Items/Items.tsx b/src/app/Items/Items.tsx new file mode 100644 index 00000000..1f2da712 --- /dev/null +++ b/src/app/Items/Items.tsx @@ -0,0 +1,322 @@ +'use client' + +import React, { useEffect, useState } from 'react' +import { useNavigate, useLocation } from 'react-router-dom' + +import { GetProductIdTypes } from '../../../types/product' +import BestItems from './BestItems' +import RecentItems from './RecentItems' +import DropDown from '../../../components/common/DropDown' +import productService from '../../app/api/services/productService' +import Button from '../../../components/common/Button' + +import Search from '../../../public/assets/svg/Search.svg' +import ArrowLeft from '../../../public/assets/svg/ArrowLeft.svg' +import ArrowRight from '../../../public/assets/svg/ArrowRight.svg' + +import styled, { css } from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +type SelectOption = { + value: string + name: string +} + +const Items = () => { + const navigate = useNavigate() + const location = useLocation() // location을 써서 url 주소를 가져와 선택된 옵션에 맞게 변경경 + + const [bestProducts, setBestProducts] = useState([]) + const [sortedProducts, setSortedProducts] = useState([]) + const [totalItems, setTotalItems] = useState(0) // 전체 상품 개수 저장 + + const selectList: SelectOption[] = [ + { value: 'recent', name: '최신순' }, + { value: 'favorite', name: '좋아요순' }, + ] + const [selectedOption, setSelectedOption] = useState(selectList[0].value) + const itemsPerPage = 10 // 페이지 네이션 + const [currentPage, setCurrentPage] = useState(1) + + useEffect(() => { + const queryParams = new URLSearchParams(location.search) + const orderBy = queryParams.get('orderBy') ?? 'recent' + const page = parseInt(queryParams.get('page') ?? '1', 10) + + setSelectedOption(orderBy) + setCurrentPage(page) + }, [location.search]) + + const updateURL = (orderBy: string, page: number) => { + navigate(`?orderBy=${orderBy}&page=${page}`) + } + + const handleAdditem = () => { + navigate(`/additem`) + } + // BestItems 데이터 불러오기, bestProducts + useEffect(() => { + productService.getProduct(1, 10, 'favorite', '').then((response) => { + setBestProducts(response.data) + }) + }, []) + + // 페이지네이션 + useEffect(() => { + productService + .getProduct(currentPage, 10, selectedOption, '') + .then((response) => { + const sorted = [...(response.data.list || [])].sort((a, b) => { + if (selectedOption === 'recent') { + return ( + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) // Date 쓸 때는 getTime을 써야 함함 + } else if (selectedOption === 'favorite') { + return b.favoriteCount - a.favoriteCount + } + return 0 + }) + console.log(sorted) + setSortedProducts(sorted) + setTotalItems(response.data.totalCount) + }) + }, [currentPage, selectedOption]) + + const totalPages = Math.ceil(totalItems / itemsPerPage) + + const pages = (() => { + if (totalPages <= 5) { + return Array.from({ length: totalPages }, (_, i) => i + 1) + } + if (currentPage <= 3) { + return [1, 2, 3, 4, 5] + } + if (currentPage >= totalPages - 2) { + return Array.from({ length: 5 }, (_, i) => totalPages - 4 + i) + } + return Array.from({ length: 5 }, (_, i) => currentPage - 2 + i) + })() + + const handleNextPage = () => { + setCurrentPage((prev) => { + const nextPage = prev + 1 + updateURL(selectedOption, nextPage) + return nextPage + }) + } + + const handlePrevPage = () => { + setCurrentPage((prev) => { + const prevPage = prev > 1 ? prev - 1 : 1 + updateURL(selectedOption, prevPage) + return prevPage + }) + } + + return ( + <> + + + + + 전체상품 + + + + + + + { + setSelectedOption(value) + updateURL(value, currentPage) + }} + /> + + + + + + + + + + {pages.map((page) => ( + { + setCurrentPage(page) + updateURL(selectedOption, page) + }} + > + {page} + + ))} + + + + + + + ) +} + +export default Items + +const Bone = styled.div` + width: 75rem; + margin: 1.5rem auto; + @media (max-width: 1199px) { + width: 43.5rem; + margin: 1.5rem 1.5rem 2.5rem 1.5rem; + } + @media (max-width: 743px) { + width: 21.437rem; + margin: 1rem; + } +` +const NavVAr = styled.div` + height: 2.625rem; + width: 100%; + margin: 1.5rem auto; + display: flex; + align-items: center; + justify-content: space-between; + @media (max-width: 743px) { + flex-wrap: wrap; + margin: 1.5rem auto 4.5rem; + } +` +const NavTitle = styled.div` + ${(props) => textStyle(20, 700)(props)} + color: ${theme.colors.SecondaryGray[900]}; + @media (max-width: 743px) { + height: 2.625rem; + display: flex; + align-items: center; + justify-content: center; + } +` +const NavRightWrapper = styled.div` + height: 100%; + display: flex; + align-items: center; + @media (max-width: 743px) { + flex-wrap: wrap; + } +` +const SearchIcon = styled.img` + width: 1.5rem; + height: 1.5rem; + position: relative; + right: -38px; + @media (max-width: 743px) { + left: 8px; + z-index: 1; + top: 10px; + } +` +const NavSearch = styled.input` + width: 20.313rem; + height: 100%; + padding: 9px 107px 9px 44px; + border-radius: 12px; + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; + background-color: ${theme.colors.SecondaryGray[100]}; + border: none; + margin-right: 1.3333rem; + @media (max-width: 1199px) { + width: 15.125rem; + padding: 9px 24px 9px 44px; + } + @media (max-width: 743px) { + position: relative; + left: -28px; + top: 10px; + } +` +const ButtonWrapper = styled.div` + margin-right: 1.3333rem; + @media (max-width: 743px) { + position: absolute; + width: max-content; + top: 546px; + left: 226px; + } + button { + transition: all 0.3s ease-in-out; + + &:hover { + transform: scale(1.05); + } + + &:active { + transform: scale(0.95); + } + } +` +const Pagenation = styled.div` + width: 19rem; + height: 2.5rem; + display: flex; + align-items: center; + justify-content: space-between; + margin: 2.688rem auto 0 auto; + @media (max-width: 1199px) { + margin: 2.5rem auto 0 auto; + } +` +const LeftButton = styled.button` + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border: 1px solid ${theme.colors.SecondaryGray[200]}; + background: #ffffff; + color: ${({ theme }) => theme.colors.SecondaryGray[600]}; + border-radius: 40px; + height: 40px; + width: 40px; + padding: 12px; + + &:hover { + background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; + } + + &:disabled { + background: ${({ theme }) => theme.colors.SecondaryGray[400]}; + cursor: not-allowed; + } +` + +interface PageButtonProps { + $isActive: boolean +} +const PageButton = styled.button` + width: 40px; + height: 40px; + border-radius: 50%; + border: 1px solid ${theme.colors.SecondaryGray[100]}; + &:hover { + background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; + } + + ${({ $isActive, theme }) => + $isActive && + css` + background-color: ${theme.colors.PrimaryBlue[100]}; + color: ${theme.colors.SecondaryGray[50]}; + `} +` diff --git a/src/app/Items/RecentItems.tsx b/src/app/Items/RecentItems.tsx new file mode 100644 index 00000000..a141f52b --- /dev/null +++ b/src/app/Items/RecentItems.tsx @@ -0,0 +1,136 @@ +'use client' + +import React, { useEffect, useState } from 'react' +import { Link } from 'react-router-dom' + +import { GetProductIdTypes } from '../../../types/product' + +import HeartInactive from '../../../public/assets/image/HeartInactive.png' +import NoImage from '../../../public/assets/image/NoImage.png' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +const RecentItems = ({ products }: { products: GetProductIdTypes[] }) => { + const [itemsDisplay, setItemsDisplay] = useState(1) + + useEffect(() => { + const handleReasize = () => { + if (window.innerWidth <= 743) { + setItemsDisplay(4) + } else if (window.innerWidth >= 744 && window.innerWidth <= 1199) { + setItemsDisplay(6) + } else { + setItemsDisplay(10) + } + } + handleReasize() + window.addEventListener('resize', handleReasize) + + return () => window.removeEventListener('resize', handleReasize) + }, []) + return ( + <> + + + {products.slice(0, itemsDisplay).map((product) => ( + + + 0 && + !product.images.includes('https://via.placeholder.com/300') + ? product.images[0] + : NoImage + } + alt={product.name} + /> + + {product.name} + + {product.price.toLocaleString('ko-KR')}원 + + + + {product.favoriteCount} + + + + + ))} + + + + ) +} + +export default RecentItems + +const RecentItem = styled.div` + height: 42.125rem; + @media (max-width: 743px) { + height: 35rem; + } +` +const RecentItemKey = styled.div` + display: flex; + height: 19.813rem; + width: 13.8125rem; + justify-content: center; + flex-direction: column; + @media (max-width: 743px) { + height: 16.5rem; + width: 10.5rem; + } +` +const RecentItemImage = styled.img` + width: inherit; + height: 100%; + border-radius: 1rem; +` +const RecentItemsDisplay = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + flex-wrap: wrap; + align-content: flex-start; + row-gap: 2.5rem; + @media (max-width: 743px) { + row-gap: 2rem; + } +` +const ProductDescription = styled.div` + width: 100%; + height: 5rem; + margin-top: 1rem; + display: flex; + flex-direction: column; + justify-content: space-between; +` +const ProductName = styled.div` + ${(props) => textStyle(14, 500)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ProductPrice = styled.div` + ${(props) => textStyle(16, 700)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ProductFavoriteCount = styled.div` + ${(props) => textStyle(12, 500)(props)} + color: ${theme.colors.SecondaryGray[600]}; + display: flex; + align-items: center; +` +const HeartInactiveImage = styled.img` + width: 1rem; + height: 1rem; +` diff --git a/src/app/ItemsDetail/ItemsDetail.tsx b/src/app/ItemsDetail/ItemsDetail.tsx new file mode 100644 index 00000000..ba91b12f --- /dev/null +++ b/src/app/ItemsDetail/ItemsDetail.tsx @@ -0,0 +1,67 @@ +import React from 'react' +import { Link } from 'react-router-dom' + +import ItemsDetailDescription from './ItemsDetailDescription' +import ItemsDetailQuestionTextarea from './ItemsDetailQuestionTextarea' +import Button from '../../../components/common/Button' + +import BackIcon from '../../../public/assets/svg/BackIcon.svg' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +const Bone = styled.div` + width: 75rem; + margin: 1.5rem auto 4rem; + + @media (max-width: 1199px) { + width: 43.5rem; + margin: 1.5rem 1.5rem 2.5rem 1.5rem; + } + @media (max-width: 743px) { + width: 21.437rem; + margin: 1rem; + } +` + +const ButtonWrapper = styled.div` + display: flex; + justify-content: center; + margin: 4.6875rem auto; + width: max-content; + ${(props) => textStyle(18, 600)(props)} + color: ${theme.colors.SecondaryGray[100]}; + @media (max-width: 1199px) { + margin: 3.5rem auto 10.4375rem auto; + } + @media (max-width: 743px) { + margin: 2.5rem auto 2.5rem auto; + } +` + +const ItemsDetail = () => { + return ( + <> + + + + + + + + + + ) +} + +export default ItemsDetail diff --git a/src/app/ItemsDetail/ItemsDetailDescription.tsx b/src/app/ItemsDetail/ItemsDetailDescription.tsx new file mode 100644 index 00000000..266d2449 --- /dev/null +++ b/src/app/ItemsDetail/ItemsDetailDescription.tsx @@ -0,0 +1,211 @@ +import React from 'react' +import { useLocation } from 'react-router-dom' + +import { useGetProductId } from '../../../hooks/useProductService' +import Tag from '../../../components/common/Tag' +import { formatDate } from '../../../utils/datetime' + +import Setting from '../../../public/assets/svg/Setting.svg' +import ProfileIcon from '../../../public/assets/svg/ProfileIcon.svg' +import HeartInactive from '../../../public/assets/image/HeartInactive.png' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' +import Image from 'next/image' + +const ItemsDetailDescription = () => { + const location = useLocation() // product 데어터 받기 + // useGetProductId 이용 + const product = location.state?.product + const productsId = useGetProductId(product.id) + if (!productsId) { + return
    상품 정보를 불러오는 중입니다...
    + } + return ( + + + + + + {productsId.name} + 상품설정버튼 + + {product.price.toLocaleString()}원 + + + 상품 소개 + {productsId.description} + + + 상품 태그 + + {productsId.tags?.map((tag, index) => ( + + ))} + + + + + 프로필아이콘 +
    + {productsId.ownerNickname} + {formatDate(productsId.createdAt)} +
    +
    + + +
    {productsId.favoriteCount}
    +
    +
    +
    +
    + ) +} + +export default ItemsDetailDescription + +const Bone = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 2.5rem; + border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; + @media (max-width: 1199px) { + align-items: flex-start; + } + @media (max-width: 743px) { + flex-direction: column; + } +` +const ProductImage = styled.img` + width: 30.375rem; + height: 30.375rem; + border-radius: 1rem; + @media (max-width: 1199px) { + width: 21.25rem; + height: 21.25rem; + } + @media (max-width: 743px) { + width: 100%; + height: 21.4375rem; + margin-bottom: 1rem; + } +` +const TitleDescription = styled.div` + width: 43.125rem; + height: 31rem; + position: relative; + @media (max-width: 1199px) { + width: 21.25rem; + height: 30.25rem; + } + @media (max-width: 743px) { + height: 29.25rem; + } +` +const ProductTitleWrapper = styled.div` + height: 7rem; + display: flex; + justify-content: space-evenly; + flex-direction: column; + border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; + @media (max-width: 743px) { + height: 5.125rem; + } +` +const ProductTitle = styled.div` + display: flex; + justify-content: space-between; + cursor: pointer; +` +const ProductName = styled.div` + ${(props) => textStyle(24, 600)(props)} + color: ${theme.colors.SecondaryGray[800]}; + @media (max-width: 1199px) { + ${(props) => textStyle(20, 600)(props)} + } + @media (max-width: 743px) { + ${(props) => textStyle(16, 600)(props)} + } +` +const ProductPrice = styled.div` + ${(props) => textStyle(40, 600)(props)} + color: ${theme.colors.SecondaryGray[800]}; + @media (max-width: 1199px) { + ${(props) => textStyle(32, 600)(props)} + } + @media (max-width: 743px) { + ${(props) => textStyle(24, 600)(props)} + } +` +const ProductDescriptionWrapper = styled.div` + margin: 1.5rem 0; + height: auto; + @media (max-width: 743px) { + margin: 1rem 0 1.5rem; + } +` +const ProductDescriptionText = styled.div` + ${(props) => textStyle(16, 600)(props)} + color: ${theme.colors.SecondaryGray[600]}; + height: 26px; + margin-bottom: 1rem; + @media (max-width: 1199px) { + ${(props) => textStyle(14, 600)(props)} + } + @media (max-width: 743px) { + margin: 0.5rem 0; + } +` +const ProductDescription = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[600]}; +` +const ProductTagWrapper = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[600]}; + @media (max-width: 1199px) { + ${(props) => textStyle(14, 600)(props)} + } + @media (max-width: 743px) { + margin-bottom: 2.5rem; + } +` +const ProductTag = styled.div` + display: flex; + gap: 0.5rem; + flex-direction: row; + flex-wrap: wrap; +` +const ProductFooter = styled.div` + width: 100%; + position: absolute; + bottom: 1px; + display: flex; + align-items: center; + justify-content: space-between; +` +const ProductFooterLeft = styled.div` + align-items: center; + justify-content: center; + display: flex; + gap: 1rem; +` +const ProductFooterRight = styled.div` + display: flex; + gap: 4px; + padding: 4px 12px; + border: 1px solid ${theme.colors.SecondaryGray[200]}; + border-radius: 35px; +` +const OwnerNickname = styled.div` + ${(props) => textStyle(14, 500)(props)} + color: ${theme.colors.SecondaryGray[600]}; +` +const UpdatedAt = styled.div` + ${(props) => textStyle(14, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; +` diff --git a/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx b/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx new file mode 100644 index 00000000..48cd585e --- /dev/null +++ b/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx @@ -0,0 +1,279 @@ +import React, { useState, useEffect, useRef } from 'react' + +import { PostCommentType } from '../../../types/comment' +import Button from '../../../components/common/Button' +import TextInputPlaceholder from '../../../components/common/TextInputPlaceholder' +import commentService from '../../../src/app/api/services/commentService' +import { diffDate } from '../../../utils/datetime' +import { formatDate } from '../../../utils/datetime' + +import Setting from '../../../public/assets/svg/Setting.svg' +import ProfileIcon from '../../../public/assets/svg/ProfileIcon.svg' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +interface ItemsDetailQuestionArraryProps { + productQuestion: PostCommentType + setIsEditing: React.Dispatch> + isEditing: boolean +} + +const ItemsDetailQuestionArrary = ({ + productQuestion, + setIsEditing, + isEditing, +}: ItemsDetailQuestionArraryProps) => { + const [isDropDownOpen, setIsDropDownOpen] = useState(false) + const dropDownRef = useRef(null) + const [userComment, setUserComment] = useState(productQuestion.content) + const [isEditingState, setIsEditingState] = useState(false) + // 수정 삭제 버튼 + const handleSettingClick = () => { + setIsDropDownOpen((prev) => !prev) + } + const handleEditSuccessClick = async () => { + await commentService.patchComment(productQuestion.id, { + content: userComment, + }) + setIsEditingState(false) + } + + const handleEditCancle = () => { + setIsEditingState(false) + } + // 수정하기 눌렀을 때 버튼 + const handleEditClick = () => { + setIsEditingState(true) + setIsDropDownOpen((prev) => !prev) + } + // 다른 곳 클릭시 수정삭제 버튼이 닫힘 + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + dropDownRef.current && + !dropDownRef.current.contains(event.target as Node) + ) { + setIsDropDownOpen(false) + } + } + + document.addEventListener('mousedown', handleClickOutside) + return () => { + document.removeEventListener('mousedown', handleClickOutside) + } + }, []) + + return ( + <> + {isEditingState ? ( + + + {/*로그인을 하지 않아 토큰?전달이 되지 않은 상태*/} + setUserComment(e.target.value)} + /> + + + 취소 + + + + + + + + ) : ( + <> + )} + + +
    + {productQuestion.content} + + {/*이미지가 없을 경우 기본 이미지 적용*/} + 유저프로필사진 + + + {productQuestion.writer.nickname} + + {/*날짜 차이가 31일을 넘길 경우 createAt을 출력*/} + + {diffDate(productQuestion.createdAt) > 31 ? ( + <> + {formatDate(productQuestion.createdAt)} + + ) : ( + <> + {diffDate(productQuestion.createdAt)} + 일 전 + + )} + + + +
    + + + {isDropDownOpen && ( + + + + + )} + +
    + + ) +} + +export default ItemsDetailQuestionArrary + +const EditBone = styled.div` + position: relative; + margin: 1rem 0 7rem; + z-index: 1; +` +const EditingWrapper = styled.div` + position: absolute; + width: 100%; + bottom: -194px; +` +const ButtonWrapper = styled.div` + width: max-content; +` +const ButtonEditWrapper = styled.div` + display: flex; + align-items: center; + justify-content: end; + margin: 1rem 0 1.5rem; +` +const EditCalcelButton = styled.button` + ${(props) => textStyle(16, 600)(props)} + color: ${theme.colors.SecondaryGray[500]}; + width: 68px; + height: 47px; + display: flex; + align-items: center; + justify-content: center; +` + +const Bone = styled.div` + border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; + display: flex; + align-items: end; + justify-content: space-between; + height: 92px; + position: relative; + padding-bottom: 0.8rem; + margin-top: 1.5rem; +} +` + +const QuestionContent = styled.div` + ${(props) => textStyle(14, 400)(props)} + color: ${theme.colors.SecondaryGray[800]}; + margin-bottom: 1.5rem; +` +const UserProfileImageWrapper = styled.div` + display: flex; + gap: 0.5rem; + img { + width: 32px; + height: 32px; + border-radius: 50%; + } +` +const UserProfileImageRight = styled.div` + display: flex; + flex-direction: column; + justify-content: space-between; +` +const UserProfileName = styled.div` + ${(props) => textStyle(12, 400)(props)} + color: ${theme.colors.SecondaryGray[600]}; +` +const DiffDate = styled.div` + ${(props) => textStyle(12, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; +` +const SettingButtonWrapper = styled.div` + position: relative; + top: -42px; +` +const SettingButton = styled.img` + width: auto; + height: auto; + cursor: pointer; + transition: all 0.3s ease-in-out; + position: relative; + &:hover { + background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; + border-radius: 50%; + transform: scale(1.05); + } + &:active { + background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; + border-radius: 50%; + transform: scale(0.95); + } +` +const SelectOption = styled.ul` + position: absolute; + top: 1.8rem; + left: -124px; + border: 1px solid #cccccc; + border-radius: 12px; + background-color: #ffffff; + color: #181818; + font-weight: 400; + font-size: 16px; + line-height: 26px; + max-height: 300px; + overflow-y: auto; + z-index: 10; + list-style: none; + padding: 0; + display: flex; + align-items: center; + flex-direction: column; + justify-content: space-around; + @media (max-width: 743px) { + position: absolute; + top: 30px; + left: -110px; + z-index: 1; + width: 130px; + height: 84px; + } +` +const Option = styled.li` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[500]}; + padding: 12px 40px; + cursor: pointer; + &:hover { + background-color: #f6f6f6; + } + @media (max-width: 743px) { + padding: 7px 35px; + } +` diff --git a/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx b/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx new file mode 100644 index 00000000..30b03573 --- /dev/null +++ b/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx @@ -0,0 +1,132 @@ +'use client' +import React, { useEffect, useState } from 'react' +import { useLocation } from 'react-router-dom' + +import { useGetCommentService } from '../../../hooks/useCommentService' +import ItemsDetailQuestionArrary from './ItemsDetailQuestionArrary' +import TextInputPlaceholder from '../../../components/common/TextInputPlaceholder' +import Button from '../../../components/common/Button' +import InquiryEmpty from '../../../public/assets/svg/InquiryEmpty.svg' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +const Bone = styled.div` + width: 75rem; + margin: 2.5rem auto 0; + @media (max-width: 1199px) { + width: 43.5rem; + } + @media (max-width: 743px) { + width: 21.5rem; + } +` +const ProductQuestionWrapper = styled.div` + margin: 2.5rem auto 1.5rem; + @media (max-width: 743px) { + margin: 2.5rem auto; + } +` +const ProductQuestionText = styled.div` + ${(props) => textStyle(16, 600)(props)} + color: ${theme.colors.SecondaryGray[900]}; + margin-bottom: 0.5625rem; +` +// state 값에 따라 버튼 효과 활성화 / 비활성화 +const ButtonWrapper = styled.div` + width: fit-content; + margin: 1rem 0 0 auto; +` +const ItemsQuestionWrapper = styled.div` + position: relative; + display: flex; + flex-direction: column; +` + +const InquiryEmptyWrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +` +const InquiryEmptyText = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; + margin-top: 0.5rem; +` +const ItemsDetailQuestionTextarea = () => { + const location = useLocation() // product 데어터 받기 + const [isEditing, setIsEditing] = useState(false) + const [questionText, setQuestionText] = useState('') + const [textareaStyle, setTextareaStyle] = useState({ + height: '84px', + }) + // useProductComments 훅 이용 + const product = location.state?.product + const productQuestion = useGetCommentService(product.id) + + const handleResize = () => { + if (window.innerWidth < 375) { + setTextareaStyle({ height: '129px' }) + } else if (window.innerWidth < 744) { + setTextareaStyle({ height: '84px' }) + } + } + + // placeholder useEffect 적용 + useEffect(() => { + handleResize() + window.addEventListener('resize', handleResize) + return () => window.removeEventListener('resize', handleResize) + }, []) + + return ( + + + 문의하기 + setQuestionText(e.target.value)} + /> + + + + + + {productQuestion.list.length === 0 ? ( + + 문의가 없습니다 + 문의가 없습니다 + + ) : ( + <> + + {productQuestion.list.map((question, index) => ( + + ))} + + + )} + + ) +} + +export default ItemsDetailQuestionTextarea diff --git a/src/app/LoginAndSignup/Login.tsx b/src/app/LoginAndSignup/Login.tsx new file mode 100644 index 00000000..7c3bf627 --- /dev/null +++ b/src/app/LoginAndSignup/Login.tsx @@ -0,0 +1,219 @@ +'use client' + +import React, { useState, useEffect } from 'react' +import { Link, useNavigate } from 'react-router-dom' + +import LoginField from './LoginField' +import Button from '../../../components/common/Button' + +import Logo from '../../../public/assets/image/Logo.png' +import LogoFace from '../../../public/assets/image/LogoFace.png' +import Google from '../../../public/assets/svg/Google.svg' +import Kakao from '../../../public/assets/svg/Kakao.svg' +import VisibillityOff from '../../../public/assets/svg/btn_visibillity_off.svg' +import Visibillity from '../../../public/assets/svg/btn_visibillity.svg' + +import styled from 'styled-components' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' + +const Bone = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: 40rem; + margin: 14.438rem auto auto auto; + @media (max-width: 744px) { + margin: 11.875rem auto auto auto; + } + @media (max-width: 375px) { + margin: 5rem 1rem auto 1rem; + width: 21.437rem; + } +` + +const LogoContainer = styled.div` + width: 24.75rem; + height: 8.25rem; + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 2.5rem; + @media (max-width: 375px) { + width: 12.375rem; + height: 4.125rem; + margin-bottom: 1.5rem; + } +` +const LogoFaceImage = styled.img` + width: 6.438rem; + height: 6.438rem; + @media (max-width: 375px) { + margin: auto 11px auto 0; + width: 3.187rem; + height: 3.187rem; + } +` +const LogoImage = styled.img` + width: 16.625rem; + height: 5rem; + @media (max-width: 375px) { + width: 8.313rem; + height: 2.813rem; + } +` +const ButtonWrapper = styled.div` + margin-bottom: 3rem; + width: 100%; +` +const SimpleLoginWrapper = styled.div` + height: 4.625rem; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + background-color: #e6f2ff; + padding: 1rem 1.438rem; + margin-bottom: 3rem; +` + +const SimpleLogin = styled.div` + ${(props) => textStyle(16, 500)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ImageWrapper = styled.div` + height: 2.625rem; + width: 6.25rem; + display: flex; + justify-content: space-between; + img { + width: 2.625rem; + height: 2.625rem; + } +` +const FooterContainer = styled.div` + display: flex; + justify-content: space-between; +` +const First = styled.div` + ${(props) => textStyle(14, 500)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const Register = styled.div` + text-decoration: underline; + color: ${theme.colors.PrimaryBlue[100]}; +` + +const Login = () => { + const navigate = useNavigate() + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [emailError, setEmailError] = useState('') + const [passwordError, setPasswordError] = useState('') + const [showPassword, setShowPassword] = useState(false) + const [isState, setIsState] = useState(false) + + const togglePasswordVisibility = () => { + setShowPassword((prev) => !prev) + } + + const validateEmail = (email: string) => { + if (!email) return '이메일을 입력해주세요.' + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + return emailRegex.test(email) ? '' : '잘못된 이메일 형식입니다.' + } + + const validatePassword = (password: string) => { + if (!password || password === '') { + return '비밀번호를 입력해주세요.' + } + if (password.length < 8) { + return '비밀번호를 8자 이상 입력해주세요.' + } + + return '' + } + const handleLogin = () => { + const emailValidation = validateEmail(email) + const passwordValidation = validatePassword(password) + + setEmailError(emailValidation) + setPasswordError(passwordValidation) + + if (!emailValidation && !passwordValidation) { + navigate(`/items`) + } + } + useEffect(() => { + const valid = password.length >= 8 && !!email + setIsState(valid) + }, [email, password]) + return ( + + + + + + + + + + { + setEmail(e.target.value) + }} + error={emailError} + /> + { + setPassword(e.target.value) + }} + error={passwordError} + /> + + + + + 간편 로그인하기 + + + 구글 로고 사진 + + + 카카오 로고 사진 + + + + + 판다마켓이 처음이신가요?   + + 회원가입 + + + + ) +} + +export default Login diff --git a/src/app/LoginAndSignup/LoginField.tsx b/src/app/LoginAndSignup/LoginField.tsx new file mode 100644 index 00000000..5948ded8 --- /dev/null +++ b/src/app/LoginAndSignup/LoginField.tsx @@ -0,0 +1,116 @@ +import React, { useState } from 'react' +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' +import styled from 'styled-components' + +const PlaceholderWrapper = styled.div` + height: 3.75rem; +` +const Field = styled.span` + display: inline-block; + margin-bottom: 1rem; +` +interface InputProps { + $isError?: boolean +} +const Input = styled.input` + width: 100%; + padding: 1rem 1.5rem; + border: none; + border-radius: 12px; + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[800]}; + background-color: ${theme.colors.SecondaryGray[100]}; + + border: 1px solid + ${({ $isError }) => + $isError ? theme.colors.error : theme.colors.PrimaryBlue[100]}; + &:hover { + border: 1px solid + ${({ $isError }) => + $isError ? theme.colors.error : theme.colors.PrimaryBlue[100]}; + } +` +const InputWrapper = styled.label` + width: 100%; + height: 6.125rem; + margin-bottom: 3rem; + ${(props) => textStyle(18, 700)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` + +const Icon = styled.img` + width: 24px; + height: 24px; + position: relative; + left: 594px; + top: -41px; + cursor: pointer; + @media (max-width: 375px) { + left: 302px; + } +` +const ErrorMessage = styled.div` + color: ${theme.colors.error}; + ${(props) => textStyle(14, 600)(props)} + margin: 0.5rem 1rem; +` +interface LoginFieldtProps { + label: string + type: string + id: string + placeholder: string + icon?: string | null + onIconClick?: () => void + validate?: (value: string) => string + value: string + onChange?: (e: React.ChangeEvent) => void + error?: string +} +const LoginField = ({ + // 부모에게 받음 + label, + type = 'text', + id, + placeholder, + icon = null, + onIconClick, + validate, + value, + onChange, +}: LoginFieldtProps) => { + const [error, setError] = useState('') + + const handleBlur = () => { + // 포커스를 잃었을 때 사용 + if (validate) { + setError(validate(value)) + } + } + + return ( + <> + + {label} + + + {icon && ( + + )} + + {error && {error}} + + + ) +} + +export default LoginField diff --git a/src/app/LoginAndSignup/Signup.tsx b/src/app/LoginAndSignup/Signup.tsx new file mode 100644 index 00000000..49305301 --- /dev/null +++ b/src/app/LoginAndSignup/Signup.tsx @@ -0,0 +1,252 @@ +'use client' + +import React, { useState, useEffect } from 'react' +import { Link, useNavigate } from 'react-router-dom' +import Image from 'next/image' + +import LoginField from './LoginField' +import Button from '../../../components/common/Button' + +import Logo from '../../../public/assets/image/Logo.png' +import LogoFace from '../../../public/assets/image/LogoFace.png' +import Google from '../../../public/assets/svg/Google.svg' +import Kakao from '../../../public/assets/svg/Kakao.svg' +import VisibillityOff from '../../../public/assets/svg/btn_visibillity_off.svg' +import Visibillity from '../../../public/assets/svg/btn_visibillity.svg' + +import { theme } from '../../../styles/theme' +import { textStyle } from '../../../styles/textStyle' +import styled from 'styled-components' + +const Bone = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + width: 40rem; + margin: 3.75rem auto auto auto; + @media (max-width: 375px) { + margin: 5rem 1rem auto 1rem; + width: 21.437rem; + } +` + +const LogoContainer = styled.div` + width: 24.75rem; + height: 8.25rem; + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 2.5rem; + @media (max-width: 375px) { + width: 12.375rem; + height: 4.125rem; + margin-bottom: 1.5rem; + } +` +// const LogoFaceImage = styled.img` +// width: 6.438rem; +// height: 6.438rem; +// @media (max-width: 375px) { +// margin: auto 11px auto 0; +// width: 3.187rem; +// height: 3.187rem; +// } +// ` +// const LogoImage = styled.img` +// width: 16.625rem; +// height: 5rem; +// @media (max-width: 375px) { +// width: 8.313rem; +// height: 2.813rem; +// } +// ` +const ButtonWrapper = styled.div` + margin-bottom: 1.5rem; + width: 100%; +` +const SimpleLoginWrapper = styled.div` + height: 4.625rem; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + background-color: #e6f2ff; + padding: 1rem 1.438rem; + margin-bottom: 1.5rem; +` + +const SimpleLogin = styled.div` + ${(props) => textStyle(16, 500)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const ImageWrapper = styled.div` + height: 2.625rem; + width: 6.25rem; + display: flex; + justify-content: space-between; + img { + width: 2.625rem; + height: 2.625rem; + } +` +const FooterContainer = styled.div` + display: flex; + justify-content: space-between; +` +const First = styled.div` + ${(props) => textStyle(14, 500)(props)} + color: ${theme.colors.SecondaryGray[800]}; +` +const Register = styled.div` + text-decoration: underline; + color: ${theme.colors.PrimaryBlue[100]}; +` + +const Signup = () => { + const navigate = useNavigate() + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [passwordConfirm, setPasswordConfirm] = useState('') + const [name, setName] = useState('') + const [emailError, setEmailError] = useState('') + const [passwordError, setPasswordError] = useState('') + const [passwordConfirmError, setPasswordConfirmError] = useState('') + const [isState, setIsState] = useState(false) + const [passwordVisibility, setPasswordVisibility] = useState({ + password: false, + confirmPassword: false, + }) + + const togglePasswordVisibility = (field: keyof typeof passwordVisibility) => { + setPasswordVisibility((prev) => ({ + ...prev, + [field]: !prev[field], + })) + } + + const validateEmail = (email: string) => { + if (!email) return '이메일을 입력해주세요.' + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + return emailRegex.test(email) ? '' : '잘못된 이메일 형식입니다.' + } + + const validatePassword = (password: string) => { + if (!password || password === '') { + return '비밀번호를 입력해주세요.' + } + if (password.length < 8) { + return '비밀번호를 8자 이상 입력해주세요.' + } + return '' + } + const validatePasswordConfirm = (passwordConfirm: string) => { + if (passwordConfirm !== password) { + return '비밀번호가 일치하지 않습니다.' + } + return '' + } + const handleLogin = () => { + const emailValidation = validateEmail(email) + const passwordValidation = validatePassword(password) + const passwordConfirmValidation = validatePasswordConfirm(passwordConfirm) + + setEmailError(emailValidation) + setPasswordError(passwordValidation) + setPasswordConfirmError(passwordConfirmValidation) + if (!emailValidation && !passwordValidation && !passwordValidation) { + navigate(`/items`) + } + } + + useEffect(() => { + const valid = + password.length >= 8 && !!email && passwordConfirm === password + setIsState(valid) + }, [email, password, passwordConfirm]) + return ( + + + + 판다마켓 로고 사진 + + + 판다마켓 로고 사진 + + + { + setEmail(e.target.value) + }} + error={emailError} + /> + + togglePasswordVisibility('password')} + validate={validatePassword} + value={password} + onChange={(e) => { + setPassword(e.target.value) + }} + error={passwordError} + /> + togglePasswordVisibility('confirmPassword')} + validate={validatePasswordConfirm} + value={passwordConfirm} + onChange={(e) => { + setPasswordConfirm(e.target.value) + }} + error={passwordConfirmError} + /> + + + + + 간편 로그인하기 + + + 구글 로고 사진 + + + 카카오 로고 사진 + + + + + 이미 회원이신가요?   + + + 로그인 + + + + + ) +} + +export default Signup diff --git a/src/app/Nav/NavVArLayout.tsx b/src/app/Nav/NavVArLayout.tsx new file mode 100644 index 00000000..317a7d24 --- /dev/null +++ b/src/app/Nav/NavVArLayout.tsx @@ -0,0 +1,19 @@ +import { Outlet, useLocation } from 'react-router-dom' +import ItemsNavVar from '../../../components/common/ItemsNavVar' + +const NavVArLayout = () => { + const { pathname } = useLocation() // 현재 페이지가 어떤 페이지인지 감지 + + const isItemsPage = pathname === '/additem' || pathname.startsWith('/items') + const isBoardsPage = pathname === '/boards' + + return ( + <> + + + {/*Outlet을 통해 하위 라우트 렌더링함. App 컴포넌트에서 확인 가능 */} + + ) +} + +export default NavVArLayout diff --git "a/src/app/Privacy/Privacy\342\200\231.jsx" "b/src/app/Privacy/Privacy\342\200\231.jsx" new file mode 100644 index 00000000..dfb44154 --- /dev/null +++ "b/src/app/Privacy/Privacy\342\200\231.jsx" @@ -0,0 +1,7 @@ +import React from 'react' + +const Privacy = () => { + return <> +} + +export default Privacy diff --git a/src/app/api/client/interceptors.tsx b/src/app/api/client/interceptors.tsx new file mode 100644 index 00000000..f9385f9f --- /dev/null +++ b/src/app/api/client/interceptors.tsx @@ -0,0 +1,25 @@ +// import { AxiosRequestConfig } from 'axios' + +// export const requestInterceptor = ( +// config: AxiosRequestConfig +// ): AxiosRequestConfig => { +// const token: string | null = localStorage.getItem('token') + +// if (token) { +// config.headers = config.headers || {} +// config.headers['Authorization'] = `Basic ${token}` +// } +// return config +// } + +// 전 코드 +// import { AxiosRequestConfig } from 'axios' + +// export const requestInterceptor = (config: AxiosRequestConfig) => { +// const { token } = localStorage.getItem('token') ?? '' + +// if (token) { +// config.headers.set('Authorization', `Basic${token}`) +// } +// return config +// } diff --git a/src/app/api/client/requestor.tsx b/src/app/api/client/requestor.tsx new file mode 100644 index 00000000..6c02b5b1 --- /dev/null +++ b/src/app/api/client/requestor.tsx @@ -0,0 +1,12 @@ +// import axios from 'axios' + +// const requestor = axios.create({ +// baseURL: import.meta.env.VITE_API_ENDPOINT.trim(), +// timeout: 60000, +// headers: { +// 'Content-Type': 'application/json', +// Accept: 'application/json', +// }, +// }) + +// export default requestor diff --git a/src/app/api/services/articleService.jsx b/src/app/api/services/articleService.jsx new file mode 100644 index 00000000..988f2016 --- /dev/null +++ b/src/app/api/services/articleService.jsx @@ -0,0 +1,44 @@ +import requestor from '../client/requestor' + +class ArticleService { + postArticle(body) { + // 틀릴 수도 + const requestBody = { + ...body, + } + return requestor.post(`/articles`, requestBody) + } + + getArticle(page, pageSize, orderBy, keyword) { + return requestor.get( + `/articles?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}&keyword=${keyword}` + ) + } + + getArticleId(articleId) { + return requestor.get(`p/articles/${articleId}`) + } + + patchArticleId(articleId, body) { + // 틀릴수도 + return requestor.patch(`/articles/${articleId}`, { + data: body, + }) + } + + deleteArticleId(articleId) { + return requestor.delete(`/articles/${articleId}`) + } + + postArticleLike(articleId) { + return requestor.post(`/articles/${articleId}/like`) + } + + deleteArticleLike(articleId) { + return requestor.delete(`/articles/${articleId}/like`) + } +} + +const articleService = new ArticleService() + +export default articleService diff --git a/src/app/api/services/authService.jsx b/src/app/api/services/authService.jsx new file mode 100644 index 00000000..6cf726b4 --- /dev/null +++ b/src/app/api/services/authService.jsx @@ -0,0 +1,29 @@ +import requestor from '../client/requestor' + +class AuthService { + // 틀릴 수도 + postAuthSignUp(body) { + const requestBody = { + ...body, + } + return requestor.post(`/auth/signUp`, requestBody) + } + + postAuthSignIn(body) { + const requestBody = { + ...body, + } + return requestor.post(`/auth/signIn`, requestBody) + } + + postAuthRefresh(body) { + const requestBody = { + ...body, + } + return requestor.post(`/auth/refresh-token`, requestBody) + } +} + +const authService = new AuthService() + +export default authService diff --git a/src/app/api/services/commentService.tsx b/src/app/api/services/commentService.tsx new file mode 100644 index 00000000..02a7c8f8 --- /dev/null +++ b/src/app/api/services/commentService.tsx @@ -0,0 +1,56 @@ +import requestor from '../client/requestor' + +import { Comment } from '../../types/comment' +import { Axios, AxiosResponse } from 'axios' + +class CommentService { + // 틀릴 수도 + postProductComment(productId, body) { + const requestBody = { + ...body, + productId: productId, + } + return requestor.post(`/products/${productId}/comments`, requestBody) + } + + getProductComment( + productId: number, + limit: number, + cursor?: number + ): Promise> { + let url = `/products/${productId}/comments?limit=${limit}` + + if (cursor) { + url += `&cursor=${cursor}` + } + + return requestor.get(url) + } + + postArticleComment(articleId, body) { + // 틀릴 수도 + const requestBody = { + ...body, + articleId: articleId, + } + return requestor.post(`/articles/${articleId}/comments`, requestBody) + } + + getArticleComment(articleId, limit, cursor) { + return requestor.get( + `/articles/${articleId}/comments?limit=${limit}&cursor=${cursor}` + ) + } + + patchComment(commentId, body) { + return requestor.patch(`/comments/${commentId}`, body) + } + + deleteComment(commentId) { + return requestor.delete(`/comments/${commentId}`) + } +} + +const commentService = new CommentService() + +export default commentService diff --git a/src/app/api/services/imageService.jsx b/src/app/api/services/imageService.jsx new file mode 100644 index 00000000..cd3b0782 --- /dev/null +++ b/src/app/api/services/imageService.jsx @@ -0,0 +1,16 @@ +import requestor from '../client/requestor' + +class ImageService { + // 틀릴 수도 + postImage(image, body) { + const requestBody = { + ...body, + image: image, + } + return requestor.post(`/images/upload`, requestBody) + } +} + +const imageService = new ImageService() + +export default imageService diff --git a/src/app/api/services/productService.tsx b/src/app/api/services/productService.tsx new file mode 100644 index 00000000..248926cc --- /dev/null +++ b/src/app/api/services/productService.tsx @@ -0,0 +1,48 @@ +import { Axios, AxiosResponse } from 'axios' +import requestor from '../client/requestor' +import { GetProductIdTypes } from '../../types/product' + +class ProductService { + //틀릴 수도 + postProduct(body: GetProductIdTypes) { + const requestBody = { + ...body, + } + return requestor.post(`/products`, requestBody) + } + + getProduct(page: number, pageSize: number, orderBy: string, keyword: string) { + return requestor.get( + `/products?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}&keyword=${keyword}` + ) + } + + getProductId(productId: number): Promise> { + return requestor.get(`/products/${productId}`) + } + + patchProductId(productId, body) { + // 틀릴수도 + const requestBody = { + ...body, + productId: productId, + } + return requestor.patch(`/products/${productId}`, requestBody) + } + + deleteProductId(productId) { + return requestor.delete(`/products/${productId}`) + } + + postProductIdFavorite(productId) { + return requestor.post(`/products/${productId}/favorite`) + } + + deleteProductIdFavorite(productId) { + return requestor.delete(`/products/${productId}/favorite`) + } +} + +const productService = new ProductService() + +export default productService diff --git a/src/app/api/services/userService.jsx b/src/app/api/services/userService.jsx new file mode 100644 index 00000000..e75e112f --- /dev/null +++ b/src/app/api/services/userService.jsx @@ -0,0 +1,37 @@ +import requestor from '../client/requestor' + +class UserService { + getUser() { + return requestor.get(`/users/me`) + } + + patchUser(body) { + // 틀릴수도 + return requestor.patch(`/users/me`, { + data: body, + }) + } + + patchUserPassword(body) { + // 틀릴수도 + return requestor.patch(`/users/me/password`, { + data: body, + }) + } + + getUserProducts(page, pageSize, keyword) { + return requestor.get( + `/users/me/products?page=${page}&pageSize=${pageSize}&keyword=${keyword}` + ) + } + + getUserFavorite(page, pageSize, keyword) { + return requestor.get( + `users/me/favorites?page=${page}&pageSize=${pageSize}&keyword=${keyword}` + ) + } +} + +const userService = new UserService() + +export default userService diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 42fc323e..91680221 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,32 +1,21 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; +import './globals.css' +import ClientLayout from './ClientLayout' -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; +export const metadata = { + title: 'My App', + description: 'Next.js App Router Example', +} export default function RootLayout({ children, -}: Readonly<{ - children: React.ReactNode; -}>) { +}: { + children: React.ReactNode +}) { return ( - - - {children} + + + {children} - ); + ) } diff --git a/src/app/page.style.ts b/src/app/page.style.ts new file mode 100644 index 00000000..1cc96239 --- /dev/null +++ b/src/app/page.style.ts @@ -0,0 +1,463 @@ +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' + +export const HeaderTop = styled.header` + display: flex; + justify-content: center; + position: sticky; + top: 0; + background-color: #ffffff; +` + +export const HeaderNav = styled.nav` + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 0.6rem 0px; + margin: 0 13rem; + @media (max-width: 744px) { + margin: 0 1.5rem; + } + @media (max-width: 375px) { + margin: 0 1rem; + } +` + +export const HeaderLogo = styled.div` + width: 100%; + height: 100%; + display: flex; + align-items: center; +` + +export const ButtonWrapper = styled.div` + width: auto; + height: auto; + @media (max-width: 744px) { + width: max-content; + } +` + +export const HeaderLogoFace = styled.img` + width: 2.5rem; + height: 2.5rem; + margin-right: 0.5rem; + display: flex; + @media (max-width: 375px) { + width: 0; + } +` + +export const HeaderLogoName = styled.img` + width: 6.44rem; + height: 2.19rem; + display: flex; +` + +export const HeaderLogin = styled.a` + width: 10.16rem; + height: 3rem; + background-color: #3692ff; + border-radius: 8px; + ${(props) => textStyle(16, 600)(props)} + color: ${theme.colors.SecondaryGray[50]}; + text-decoration: none; + display: flex; + justify-content: center; + align-items: center; + @media (max-width: 744px) { + width: 9.73rem; + } + @media (max-width: 375px) { + width: 9.73rem; + } +` + +export const HeaderMain = styled.div` + width: 100%; + background-color: #cfe5ff; +` + +export const HeaderMainContainer = styled.div` + width: max-content; + display: flex; + padding: 12.5rem 0px 0px 0px; + margin: 0 auto; + @media (max-width: 744px) { + width: 100%; + height: 771px; + flex-direction: column; + align-items: center; + justify-content: space-between; + padding: 0; + } + @media (max-width: 375px) { + width: 100%; + height: auto; + img { + width: 100%; + } + } +` + +export const HeaderMainTitle = styled.div` + width: auto; + margin: auto 0; + @media (max-width: 744px) { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + @media (max-width: 375px) { + width: 15rem; + margin-bottom: 8.25rem; + } +` + +export const HeaderTitleFont = styled.h1` + width: 20rem; + ${(props) => textStyle(40, 700)(props)} + margin: 0 4rem 2rem 0; + color: ${theme.colors.SecondaryGray[700]}; + @media (max-width: 744px) { + margin-top: 84px; + width: auto; + margin: 84px auto 24px; + } + @media (max-width: 375px) { + margin-bottom: 1.125rem; + text-align: center; + ${(props) => textStyle(32, 700)(props)} + width: 254px; + } +` + +export const HeaderItems = styled.a` + width: 7.25rem; + background-color: ${theme.colors.PrimaryBlue[100]}; + border-radius: 40px; + ${(props) => textStyle(20, 600)(props)} + color: ${theme.colors.SecondaryGray[50]}; + text-decoration: none; + padding: 0.75rem 7.75rem; + display: inline-block; + @media (max-width: 375px) { + padding: 0.5rem 4rem; + margin-top: 1.13rem; + } +` + +/* 메인 */ + +export const MainBasic = styled.main` + display: flex; + flex-direction: column; + align-items: center; + @media (max-width: 744px) { + margin: 24px; + } + @media (max-width: 375px) { + margin: 52px 16px 2.5rem 15px; + width: 344px; + } +` + +export const MainTheme = styled.div` + display: flex; + background-color: #fcfcfc; + margin: 8.63rem auto; + @media (max-width: 744px) { + width: 100%; + flex-direction: column; + margin: 0; + } +` + +export const MainPopularSellImage = styled.picture` + width: auto; + height: 27.75rem; + + @media (max-width: 744px) { + img { + width: 100%; + height: 32.813rem; + } + } + @media (max-width: 375px) { + height: 16.187rem; + img { + width: 100%; + height: 100%; + } + } +` + +export const MainThemeBasic = styled.div` + width: 18.625rem; + display: flex; + justify-content: center; + align-items: flex-start; + background-color: #fcfcfc; + flex-direction: column; + margin: auto 4rem; + @media (max-width: 744px) { + width: 100%; + margin: 0; + } + @media (max-width: 375px) { + height: 134px; + margin: 1.5rem auto 2.69rem 0; + } +` + +export const MainPopularSellFontTop = styled.p` + margin: 0 0px 0.75rem 0; + ${(props) => textStyle(18, 700)(props)} + color: ${theme.colors.PrimaryBlue[100]}; + @media (max-width: 744px) { + margin: 1.5rem auto 1rem; + } + @media (max-width: 375px) { + margin: 0 auto 0.5rem 0rem; + ${(props) => textStyle(16, 700)(props)} + } +` + +export const MainPopularSellFontMiddle = styled.h2` + width: 306px; + margin: 0 auto 1.5rem 0; + ${(props) => textStyle(40, 700)(props)} + color: ${theme.colors.SecondaryGray[700]}; + @media (max-width: 744px) { + ${(props) => textStyle(32, 700)(props)} + width:100%; + } + @media (max-width: 375px) { + ${(props) => textStyle(24, 700)(props)} + margin-bottom: 1rem; + line-height: 2rem; + } +` + +export const MainPopularSellFontBottom = styled.p` + ${(props) => textStyle(24, 500)(props)} + color: ${theme.colors.SecondaryGray[700]}; + width: 100%; + @media (max-width: 744px) { + ${(props) => textStyle(18, 500)(props)} + width:100%; + width: 15.75rem; + margin-bottom: 3.25rem; + } + @media (max-width: 375px) { + margin: 0; + ${(props) => textStyle(16, 500)(props)} + width: 205px; + } +` + +export const MainThemeCenter = styled.div` + display: flex; + background-color: #fcfcfc; + margin: 8.63rem auto; + @media (max-width: 744px) { + width: 100%; + flex-direction: column-reverse; + margin: 0; + } + @media (max-width: 375px) { + flex-wrap: wrap-reverse; + } +` + +export const MainThemeBasicMiddle = styled(MainThemeBasic)` + align-items: flex-end; + text-align: right; + @media (max-width: 375px) { + width: 330px; + margin-right: 0; + } +` + +export const MainSearchImage = styled.picture` + width: 579px; + height: 444px; + @media (max-width: 744px) { + width: 100%; + height: 100%; + margin: 0; + img { + width: 100%; + height: 32.5rem; + } + } + @media (max-width: 375px) { + height: 16.187rem; + img { + width: 100%; + height: 100%; + } + } +` +/* footer */ + +export const FooterMainContainer = styled.footer` + display: flex; + flex-direction: column; + align-items: center; +` + +export const FooterEmpty = styled.div` + width: 100%; + height: 138px; + background-color: #fcfcfc; + @media (max-width: 744px) { + width: 0; + height: 0; + } +` + +export const FooterContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + width: 100%; + background-color: #cfe5ff; + @media (max-width: 744px) { + } + @media (max-width: 375px) { + height: 33.75rem; + } +` +export const FooterBackground = styled.div` + display: flex; + align-items: center; + height: 397px; + margin-top: 9rem; + width: 69.375rem; + @media (max-width: 744px) { + flex-direction: column; + justify-content: space-between; + width: 100%; + margin-top: 0; + height: 100%; + } +` + +export const FooterFont = styled.h2` + ${(props) => textStyle(40, 700)(props)} + @media (max-width: 744px) { + margin: 12.562rem auto 13.562rem; + width: 20.438rem; + text-align: center; + line-height: 56px; + } + @media (max-width: 375px) { + ${(props) => textStyle(32, 700)(props)} + margin: 121px auto 131px; + width: 254px; + height: 90px; + text-align: center; + } +` + +export const FooterImage = styled.picture` + width: 46.63rem; + height: 24.81rem; + @media (max-width: 375px) { + width: 100%; + img { + width: 100%; + } + } +` + +export const FooterNav = styled.div` + width: 100%; + background-color: ${theme.colors.SecondaryGray[900]}; + display: flex; + justify-content: center; +` + +export const FooterNavMain = styled.div` + height: 1.25rem; + width: 70rem; + display: flex; + justify-content: space-between; + align-items: center; + margin: 2rem 0 6.75rem 0; + @media (max-width: 744px) { + width: 33.5rem; + margin: 2rem 8rem 6.75rem 8rem; + } + @media (max-width: 375px) { + margin: 2rem; + display: grid; + grid-template-areas: + 'hd hdt' + 'ct ctt'; + width: 100%; + height: 98px; + } +` + +export const Codeit = styled.p` + color: ${theme.colors.SecondaryGray[400]}; + @media (max-width: 744px) { + ${(props) => textStyle(16, 400)(props)} + } + @media (max-width: 375px) { + grid-area: ct; + font-weight: 400; + font-size: 16px; + width: 6.88rem; + height: 1rem; + font-size: 1rem; + line-height: 18.4px; + text-align: center; + } +` + +export const PrivacyFaq = styled.div` + margin-right: 13px; + @media (max-width: 375px) { + grid-area: hd; + align-items: center; + justify-items: center; + margin: 0; + width: 12.32rem; + } +` + +export const Social = styled.div` + width: 7.25rem; + height: 20px; + display: flex; + justify-content: space-between; + @image { + width: 18px; + height: 18px; + } +` + +export const Privacy = styled.div` + margin: auto 2rem auto 0; + color: ${theme.colors.SecondaryGray[200]}; + text-decoration: none; + @media (max-width: 375px) { + margin: 0 30px 0 0; + } +` + +export const Faq = styled.div` + color: ${theme.colors.SecondaryGray[200]}; + text-decoration: none; + margin: auto 0; + @media (max-width: 375px) { + margin-right: 2rem; + } +` diff --git a/src/app/page.tsx b/src/app/page.tsx index 84af2cb0..86ad8455 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,95 +1,192 @@ -import Image from "next/image"; -import styles from "./page.module.css"; +'use client' // 클라이언트 컴포넌트로 지정 -export default function Home() { - return ( -
    -
    - Next.js logo -
      -
    1. - Get started by editing src/app/page.tsx. -
    2. -
    3. Save and see your changes instantly.
    4. -
    +import React, { useEffect, useState } from 'react' +import Link from 'next/link' + +import * as S from './page.style' +import Button from '../../components/common/Button' + +import Logo from '../../public/assets/image/Logo.png' +import LogoFace from '../../public/assets/image/LogoFace.png' +import HomeTop from '../../public/assets/image/home_top.png' +import HomeBottom from '../../public/assets/image/home_bottom.png' +import HomeHotItems from '../../public/assets/image/home_hot_items.png' +import HomeSearch from '../../public/assets/image/home_search.png' +import HomeRegister from '../../public/assets/image/home_register.png' +import Facebook from '../../public/assets/svg/facebook.svg' +import Instagram from '../../public/assets/svg/instagram.svg' +import Twitter from '../../public/assets/svg/twitter.svg' +import Youtube from '../../public/assets/svg/youtube.svg' + +function Home() { + const [buttonStyle, setButtonStyle] = useState({ + width: 364, + paddingWidth: 43, + }) - -
    - -
    - ); + const handleResize = () => { + if (window.innerWidth < 375) { + setButtonStyle({ width: 258, paddingWidth: 71 }) + } else { + setButtonStyle({ width: 364, paddingWidth: 124 }) + } + } + + // placeholder useEffect 적용 + useEffect(() => { + handleResize() + window.addEventListener('resize', handleResize) + return () => window.removeEventListener('resize', handleResize) + }, []) + + return ( + <> + + + + + + + + + + + + + + + + + + + + 일상의 모든 물건을 거래해 보세요 + + + + + + 판다마켓 백그라운드사진 + + + + + + 판다마켓 인기 상품 사진 + + +
    + Hot item +
    +
    + + 인기 상품을 확인해 보세요 + +
    +
    + + 가장 HOT한 중고거래 물품을 판다 마켓에서 확인해 보세요 + +
    +
    +
    + + +
    + Search +
    +
    + + 구매를 원하는 상품을 검색하세요 + +
    +
    + + 구매하고 싶은 물품은 검색해서 쉽게 찾아보세요 + +
    +
    + + 판다마켓 상품 검색 사진 + +
    + + + 판다마켓 인기 상품 등록 + + +
    + Register +
    +
    + + 판매를 원하는 상품을 등록하세요 + +
    +
    + + 어떤 물건이든 판매하고 싶은 상품을 쉽게 등록하세요 + +
    +
    +
    +
    + + + + +
    + 믿을 수 있는 판다마켓 중고 거래 +
    + + 판다마켓 백그라운드사진 + +
    +
    + + + ©codeit - 2024 + + + Privacy Policy + + + FAQ + + + + + 페이스북 로고 사진 + + + 트위터 로고 사진 + + + 유튜브 로고 사진 + + + 인스타그램 로고 사진 + + + + +
    + + ) } + +export default Home diff --git a/styles/GlobalStyles.tsx b/styles/GlobalStyles.tsx new file mode 100644 index 00000000..45167538 --- /dev/null +++ b/styles/GlobalStyles.tsx @@ -0,0 +1,30 @@ +import { createGlobalStyle } from "styled-components"; +import "../styles/reset.css"; + +const GlobalStyles = createGlobalStyle` + * { + margin: 0; + padding: 0; + box-sizing: border-box; + word-break: keep-all; + } + body { + font-family: 'Arial', sans-serif; + background-color: #ffffff; + color: #212529; + line-height: 1.6; + } + + a { + text-decoration: none; + color: inherit; + } + + button { + border: none; + background: none; + cursor: pointer; + } +`; + +export default GlobalStyles; diff --git a/styles/reset.css b/styles/reset.css new file mode 100644 index 00000000..eb40ec5e --- /dev/null +++ b/styles/reset.css @@ -0,0 +1,131 @@ +/* reset.css 설정 */ +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 62.5%; + font: inherit; + vertical-align: baseline; +} + +/*"HTML5 디스플레이 역할 초기화 (브라우저용)"*/ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} + +body { + line-height: 1; +} + +ol, +ul { + list-style: none; +} + +blockquote, +q { + quotes: none; +} + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} + +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/styles/textStyle.ts b/styles/textStyle.ts new file mode 100644 index 00000000..2bb4ae41 --- /dev/null +++ b/styles/textStyle.ts @@ -0,0 +1,17 @@ +import { css, DefaultTheme } from 'styled-components' + +export const textStyle = + (size = 16, weight = 400) => + ({ theme }: { theme: DefaultTheme }) => { + const typography = theme?.Typography?.[size] || { + fontSize: '16px', + lineHeight: 'normal', + letterSpacing: '0', + } + + return css` + font-weight: ${weight}; + font-size: ${typography.fontSize}; + line-height: ${typography.lineHeight}; + ` + } diff --git a/styles/theme.d.ts b/styles/theme.d.ts new file mode 100644 index 00000000..dde8fa41 --- /dev/null +++ b/styles/theme.d.ts @@ -0,0 +1,44 @@ +import 'styled-components' + +declare module 'styled-components' { + export interface DefaultTheme { + colors: { + PrimaryBlue: { [key: number]: string } + SecondaryGray: { [key: number]: string } + white: string + black: string + error: string + } + Typography: { + [key: number]: { + fontSize: string + lineHeight: string + letterSpacing?: string + } + } + ButtonSize: { + [key: number]: { + height: string + fontSize: string + fontWeight: number + padding: string + borderRadius: string + } + } + } +} +// declare module 'styled-components' { +// export interface DefaultTheme { +// Typography: { +// [key: number]: { +// fontSize: string +// lineHeight: string +// letterSpacing?: string +// } +// } +// colors: { +// PrimaryBlue: { [key: number]: string } +// SecondaryGray: { [key: number]: string } +// } +// } +// } diff --git a/styles/theme.ts b/styles/theme.ts new file mode 100644 index 00000000..0c4ad7e0 --- /dev/null +++ b/styles/theme.ts @@ -0,0 +1,91 @@ +export const theme = { + colors: { + PrimaryBlue: { + 100: '#3692FF', + 200: '#1967D6', + 300: '#1251AA', + }, + SecondaryGray: { + 50: '#F9FAFB', + 100: '#F3F4F6', + 200: '#E5E7EB', + 400: '#9CA3AF', + 500: '#6B7280', + 600: '#4B5563', + 700: '#374151', + 800: '#1F2937', + 900: '#111827', + }, + white: '#FFFFFF', + black: '#000000', + error: '#F74747', + }, + Typography: { + 12: { + fontSize: '12px', + lineHeight: '18px', + }, + 13: { + fontSize: '13px', + lineHeight: '22px', + }, + 14: { + fontSize: '14px', + lineHeight: '24px', + }, + 16: { + fontSize: '16px', + lineHeight: '26px', + }, + 18: { + fontSize: '18px', + lineHeight: '26px', + }, + 20: { + fontSize: '20px', + lineHeight: '32px', + }, + 24: { + fontSize: '24px', + lineHeight: '32px', + }, + 32: { + fontSize: '32px', + lineHeight: '42px', + }, + 40: { + fontSize: '40px', + lineHeight: 1.4, + }, + }, + ButtonSize: { + 56: { + height: '56px', + fontSize: '20px', + fontWeight: 600, + padding: '12px 124px', + borderRadius: '40px', + }, + 48: { + height: '48px', + fontSize: '18px', + fontWeight: 600, + padding: '11px 71px', + borderRadius: '40px', + }, + 42.5: { + height: '42px', + fontSize: '16px', + fontWeight: 600, + padding: '8px 23px', + borderRadius: '8px', + }, + 48.5: { + height: '48px', + fontSize: '16px', + fontWeight: 600, + padding: '11px 30px', + borderRadius: '8px', + }, + }, +} diff --git a/tsconfig.json b/tsconfig.json index c1334095..3f34af91 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,6 +22,12 @@ "@/*": ["./src/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "include": [ + "next-env.d.ts", + "src/**/*", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], "exclude": ["node_modules"] } diff --git a/types/comment.ts b/types/comment.ts new file mode 100644 index 00000000..c7835afa --- /dev/null +++ b/types/comment.ts @@ -0,0 +1,16 @@ +export interface GetCommentType { + nextCursor: number + list: PostCommentType[] +} + +export interface PostCommentType { + id: number + content: string + createdAt: string + updatedAt: string + writer: { + id: number + nickname: string + image: string + } +} diff --git a/types/product.ts b/types/product.ts new file mode 100644 index 00000000..07260a4d --- /dev/null +++ b/types/product.ts @@ -0,0 +1,20 @@ +export interface GetProductType { + products: { + list: GetProductIdTypes[] + totalCount: number + } +} + +export interface GetProductIdTypes { + createdAt: string + favoriteCount: number + ownerNickname: string + ownerId: number + images: string[] + tags: string[] + price: number + description: string + name: string + id: number + isFavorite?: boolean +} diff --git a/utils/datetime.ts b/utils/datetime.ts new file mode 100644 index 00000000..6fee714c --- /dev/null +++ b/utils/datetime.ts @@ -0,0 +1,23 @@ +// 날짜 연도 월 일 출력 함수 +export const formatDate = (isoDate: string) => { + const date = new Date(isoDate) + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + + return `${year}.${month}.${day}` // 연도.월.일 +} + +// 날짜 비교 함수 +export const diffDate = (isoDate: string) => { + const createdDate = new Date(isoDate) + const today = new Date() + + createdDate.setHours(0, 0, 0, 0) // 자정을 초기화 + today.setHours(0, 0, 0, 0) + + const diff = today.getTime() - createdDate.getTime() + const diffDays = diff / (1000 * 60 * 60 * 24) + + return Math.floor(diffDays) +} From 4b5cb4020ed364e8a8eb980b6fedb2eeed3f5a4d Mon Sep 17 00:00:00 2001 From: ramong26 Date: Wed, 14 May 2025 01:10:41 +0900 Subject: [PATCH 03/12] =?UTF-8?q?feat:=EB=84=A5=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next.config.js | 6 - package-lock.json | 4872 ++++++++++++----- pages/_app.tsx | 6 - pages/_document.tsx | 13 - pages/api/hello.ts | 13 - pages/index.tsx | 114 - src/app/Home/{Home.style.ts => page.style.ts} | 0 src/app/Home/{Home.tsx => page.tsx} | 4 +- 8 files changed, 3649 insertions(+), 1379 deletions(-) delete mode 100644 next.config.js delete mode 100644 pages/_app.tsx delete mode 100644 pages/_document.tsx delete mode 100644 pages/api/hello.ts delete mode 100644 pages/index.tsx rename src/app/Home/{Home.style.ts => page.style.ts} (100%) rename src/app/Home/{Home.tsx => page.tsx} (98%) diff --git a/next.config.js b/next.config.js deleted file mode 100644 index a843cbee..00000000 --- a/next.config.js +++ /dev/null @@ -1,6 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - reactStrictMode: true, -} - -module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json index baa2b665..cdab536f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,27 @@ { - "name": "fe-weekly-mission", + "name": "sprintnext", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "fe-weekly-mission", + "name": "sprintnext", "version": "0.1.0", "dependencies": { - "next": "13.5.6", - "react": "^18", - "react-dom": "^18" + "@types/styled-components": "^5.1.34", + "next": "15.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.5.0", + "styled-components": "^6.1.17" }, "devDependencies": { + "@eslint/eslintrc": "^3", "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "eslint": "^8", - "eslint-config-next": "13.5.6", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "15.3.0", "typescript": "^5" } }, @@ -30,52 +34,138 @@ "node": ">=0.10.0" } }, - "node_modules/@babel/runtime": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", - "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -83,33 +173,82 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.54.0.tgz", - "integrity": "sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -125,370 +264,1257 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@next/env": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz", - "integrity": "sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.6.tgz", - "integrity": "sha512-ng7pU/DDsxPgT6ZPvuprxrkeew3XaRf4LAT4FabaEO/hAbvVx4P7wqnqdbTdDn1kgTvsI4tpIgT4Awn/m0bGbg==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "dependencies": { - "glob": "7.1.7" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz", - "integrity": "sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==", + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", + "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.1.0" } }, - "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==", + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", + "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.1.0" } }, - "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==", + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", + "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", + "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", + "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", + "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", "cpu": [ "arm64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", + "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", + "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", + "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], - "engines": { - "node": ">= 10" + "funding": { + "url": "https://opencollective.com/libvips" } }, - "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==", + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", + "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", + "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", "cpu": [ "x64" ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", + "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.1.0" } }, - "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==", + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", + "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", "cpu": [ "arm64" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.1.0" } }, - "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==", + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", + "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", "cpu": [ - "ia32" + "s390x" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.1.0" } }, - "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==", + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", + "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", "cpu": [ "x64" ], + "license": "Apache-2.0", "optional": true, "os": [ - "win32" + "linux" ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.1.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", + "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", + "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", + "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@emnapi/runtime": "^1.4.0" }, "engines": { - "node": ">= 8" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" } }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.6.0.tgz", - "integrity": "sha512-2/U3GXA6YiPYQDLGwtGlnNgKYBSwCFIHf8Y9LUY5VATHdtbLlU0Y1R3QoBnT0aB4qv/BEiVVsj7LJXoQCgJ2vA==", - "dev": true - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", + "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", + "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.2.tgz", + "integrity": "sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", + "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@next/env": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.0.tgz", + "integrity": "sha512-6mDmHX24nWlHOlbwUiAOmMyY7KELimmi+ed8qWcJYjqXeC+G6JzPZ3QosOAfjNwgMIzwhXBiRiCgdh8axTTdTA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.0.tgz", + "integrity": "sha512-511UUcpWw5GWTyKfzW58U2F/bYJyjLE9e3SlnGK/zSXq7RqLlqFO8B9bitJjumLpj317fycC96KZ2RZsjGNfBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.0.tgz", + "integrity": "sha512-PDQcByT0ZfF2q7QR9d+PNj3wlNN4K6Q8JoHMwFyk252gWo4gKt7BF8Y2+KBgDjTFBETXZ/TkBEUY7NIIY7A/Kw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.0.tgz", + "integrity": "sha512-m+eO21yg80En8HJ5c49AOQpFDq+nP51nu88ZOMCorvw3g//8g1JSUsEiPSiFpJo1KCTQ+jm9H0hwXK49H/RmXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.0.tgz", + "integrity": "sha512-H0Kk04ZNzb6Aq/G6e0un4B3HekPnyy6D+eUBYPJv9Abx8KDYgNMWzKt4Qhj57HXV3sTTjsfc1Trc1SxuhQB+Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.0.tgz", + "integrity": "sha512-k8GVkdMrh/+J9uIv/GpnHakzgDQhrprJ/FbGQvwWmstaeFG06nnAoZCJV+wO/bb603iKV1BXt4gHG+s2buJqZA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.0.tgz", + "integrity": "sha512-ZMQ9yzDEts/vkpFLRAqfYO1wSpIJGlQNK9gZ09PgyjBJUmg8F/bb8fw2EXKgEaHbCc4gmqMpDfh+T07qUphp9A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.0.tgz", + "integrity": "sha512-RFwq5VKYTw9TMr4T3e5HRP6T4RiAzfDJ6XsxH8j/ZeYq2aLsBqCkFzwMI0FmnSsLaUbOb46Uov0VvN3UciHX5A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.0.tgz", + "integrity": "sha512-a7kUbqa/k09xPjfCl0RSVAvEjAkYBYxUzSVAzk2ptXiNEL+4bDBo9wNC43G/osLA/EOGzG4CuNRFnQyIHfkRgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.0.tgz", + "integrity": "sha512-vHUQS4YVGJPmpjn7r5lEZuMhK5UQBNBRSB+iGDvJjaNk649pTIcRluDWNb9siunyLLiu/LDPHfvxBtNamyuLTw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { "tslib": "^2.4.0" } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", + "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/react": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.4.tgz", + "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", + "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/styled-components": { + "version": "5.1.34", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.34.tgz", + "integrity": "sha512-mmiVvwpYklFIv9E8qfxuPyIt/OuyIrn6gMOAMOFUO3WJfSrSE+sGUoa4PiZj77Ut7bKZpaa6o1fBKS/4TOEvnA==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.1.tgz", + "integrity": "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/type-utils": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.1.tgz", + "integrity": "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.1.tgz", + "integrity": "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.1.tgz", + "integrity": "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.32.1", + "@typescript-eslint/utils": "8.32.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", + "integrity": "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.1.tgz", + "integrity": "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/visitor-keys": "8.32.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", + "integrity": "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.1", + "@typescript-eslint/types": "8.32.1", + "@typescript-eslint/typescript-estree": "8.32.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.32.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.1.tgz", + "integrity": "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz", + "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz", + "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz", + "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz", + "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz", + "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz", + "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz", + "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz", + "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/node": { - "version": "20.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.4.tgz", - "integrity": "sha512-wmyg8HUhcn6ACjsn8oKYjkN/zUzQeNtMy44weTJSM6p4MMzEOuKbA3OjJ267uPCOW7Xex9dyrNTful8XTQYoDA==", + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz", + "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz", + "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/react": { - "version": "18.2.38", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.38.tgz", - "integrity": "sha512-cBBXHzuPtQK6wNthuVMV6IjHAFkdl/FOPFIlkd81/Cd1+IqkHu/A+w4g43kaQQoYHik/ruaQBDL72HyCy1vuMw==", + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz", + "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", + "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/react": "*" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", + "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@typescript-eslint/parser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.12.0.tgz", - "integrity": "sha512-s8/jNFPKPNRmXEnNXfuo1gemBdVmpQsK1pcu+QIvuNJuhFzGrpD7WjOcvDc/+uEdfzSYpNu7U/+MmbScjoQ6vg==", + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz", + "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==", + "cpu": [ + "wasm32" + ], "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.12.0", - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/typescript-estree": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", - "debug": "^4.3.4" + "@napi-rs/wasm-runtime": "^0.2.9" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=14.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.12.0.tgz", - "integrity": "sha512-5gUvjg+XdSj8pcetdL9eXJzQNTl3RD7LgUiYTl8Aabdi8hFkaGSYnaS6BLc0BGNaDH+tVzVwmKtWvu0jLgWVbw==", + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz", + "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.12.0.tgz", - "integrity": "sha512-MA16p/+WxM5JG/F3RTpRIcuOghWO30//VEOvzubM8zuOOBYXsP+IfjoCXXiIfy2Ta8FRh9+IO9QLlaFQUU+10Q==", + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz", + "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==", + "cpu": [ + "ia32" + ], "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.12.0.tgz", - "integrity": "sha512-vw9E2P9+3UUWzhgjyyVczLWxZ3GuQNT7QpnIY3o5OMeLO/c8oHljGc8ZpryBMIyympiAAaKgw9e5Hl9dCWFOYw==", + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", + "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.12.0", - "@typescript-eslint/visitor-keys": "6.12.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.12.0.tgz", - "integrity": "sha512-rg3BizTZHF1k3ipn8gfrzDXXSFKyOEB5zxYXInQ6z0hUvmQlhaZQzK+YmHmNViMA9HzW5Q9+bPPt90bU6GQwyw==", + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.12.0", - "eslint-visitor-keys": "^3.4.1" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 0.6" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -501,6 +1527,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -521,15 +1548,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -552,37 +1570,44 @@ "dev": true }, "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "dependencies": { - "dequal": "^2.0.3" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -592,26 +1617,41 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -639,15 +1679,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -657,31 +1698,36 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -694,22 +1740,28 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/asynciterator.prototype": { + "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -718,21 +1770,23 @@ } }, "node_modules/axe-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", - "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "dependencies": { - "dequal": "^2.0.3" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/balanced-match": { @@ -741,6 +1795,27 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -774,15 +1849,61 @@ "node": ">=10.16.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -797,10 +1918,19 @@ "node": ">=6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001564", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz", - "integrity": "sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==", + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", "funding": [ { "type": "opencollective", @@ -814,7 +1944,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "4.1.2", @@ -835,13 +1966,28 @@ "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": 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", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -853,7 +1999,18 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "devOptional": true + }, + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -861,11 +2018,69 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -875,25 +2090,101 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -911,17 +2202,21 @@ "dev": true }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -941,103 +2236,136 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -1046,60 +2374,106 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, + "license": "MIT", "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -1108,6 +2482,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1121,78 +2502,88 @@ } }, "node_modules/eslint": { - "version": "8.54.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.54.0.tgz", - "integrity": "sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.54.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "zod": "^3.24.2" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-next": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.6.tgz", - "integrity": "sha512-o8pQsUHTo9aHqJ2YiZDym5gQAMRf7O2HndHo/JZeY7TDD+W4hk6Ma8Vw54RHiBeb7OWWO5dPirQB+Is/aVQ7Kg==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.0.tgz", + "integrity": "sha512-+Z3M1W9MnJjX3W4vI9CHfKlEyhTWOUHvc5dB89FyRnzPsUkJlLWZOi8+1pInuVcSztSM4MwBFB0hIHf4Rbwu4g==", "dev": true, + "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "13.5.6", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "@next/eslint-plugin-next": "15.3.0", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "peerDependenciesMeta": { @@ -1222,35 +2613,46 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", "dev": true, + "license": "ISC", "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -1273,34 +2675,37 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { @@ -1308,113 +2713,95 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint-plugin-import/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, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", - "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" }, "engines": { "node": ">=4.0" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", + "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", + "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", + "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { @@ -1422,6 +2809,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -1439,21 +2827,23 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1471,18 +2861,45 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -1505,6 +2922,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -1521,13 +2939,105 @@ "node": ">=4.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" } }, "node_modules/fast-deep-equal": { @@ -1586,15 +3096,16 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/fill-range": { @@ -1609,6 +3120,24 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1626,39 +3155,61 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/function-bind": { "version": "1.1.2", @@ -1670,15 +3221,18 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -1697,28 +3251,54 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -1728,10 +3308,11 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -1739,26 +3320,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -1771,33 +3332,28 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -1806,48 +3362,25 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-bigints": { "version": "1.0.2", @@ -1868,22 +3401,27 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1892,10 +3430,11 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -1904,12 +3443,13 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -1919,10 +3459,11 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -1930,6 +3471,45 @@ "node": ">= 0.4" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -1964,57 +3544,75 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "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==", + "license": "MIT", + "optional": true + }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2024,25 +3622,30 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2051,6 +3654,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -2064,24 +3677,48 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2100,24 +3737,32 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2139,19 +3784,11 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -2169,12 +3806,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2183,23 +3822,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -2209,33 +3849,43 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2245,12 +3895,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -2260,12 +3913,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -2275,34 +3929,46 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2318,25 +3984,33 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -2354,7 +4028,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -2373,6 +4048,7 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -2400,21 +4076,24 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" }, "node_modules/language-tags": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", "dev": true, + "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, @@ -2460,6 +4139,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2467,16 +4148,37 @@ "loose-envify": "cli.js" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge2": { @@ -2501,6 +4203,29 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -2518,15 +4243,17 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", @@ -2545,52 +4272,87 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz", + "integrity": "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/next": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/next/-/next-13.5.6.tgz", - "integrity": "sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==", - "dependencies": { - "@next/env": "13.5.6", - "@swc/helpers": "0.5.2", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.0.tgz", + "integrity": "sha512-k0MgP6BsK8cZ73wRjMazl2y2UcXj49ZXLDEgx6BikWuby/CN+nh81qFFI16edgd7xYpe/jj2OZEIwCoqnzz0bQ==", + "license": "MIT", + "dependencies": { + "@next/env": "15.3.0", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", + "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" + "styled-jsx": "5.1.6" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.14.0" + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.5.6", - "@next/swc-darwin-x64": "13.5.6", - "@next/swc-linux-arm64-gnu": "13.5.6", - "@next/swc-linux-arm64-musl": "13.5.6", - "@next/swc-linux-x64-gnu": "13.5.6", - "@next/swc-linux-x64-musl": "13.5.6", - "@next/swc-win32-arm64-msvc": "13.5.6", - "@next/swc-win32-ia32-msvc": "13.5.6", - "@next/swc-win32-x64-msvc": "13.5.6" + "@next/swc-darwin-arm64": "15.3.0", + "@next/swc-darwin-x64": "15.3.0", + "@next/swc-linux-arm64-gnu": "15.3.0", + "@next/swc-linux-arm64-musl": "15.3.0", + "@next/swc-linux-x64-gnu": "15.3.0", + "@next/swc-linux-x64-musl": "15.3.0", + "@next/swc-win32-arm64-msvc": "15.3.0", + "@next/swc-win32-x64-msvc": "15.3.0", + "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { "@opentelemetry/api": { "optional": true }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, "sass": { "optional": true } @@ -2601,15 +4363,20 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2624,14 +4391,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -2642,28 +4412,32 @@ } }, "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -2673,45 +4447,50 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "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, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "ee-first": "1.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, "node_modules/once": { @@ -2719,6 +4498,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -2740,6 +4520,24 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2782,6 +4580,16 @@ "node": ">=6" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2791,20 +4599,12 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2815,19 +4615,21 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=16" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2841,6 +4643,26 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", @@ -2868,6 +4690,12 @@ "node": "^10 || ^12 || >=14" } }, + "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==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2882,12 +4710,27 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, + "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, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2897,6 +4740,22 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2917,47 +4776,121 @@ } ] }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^19.1.0" } }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "license": "MIT" + }, + "node_modules/react-router": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", + "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz", + "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==", + "license": "MIT", + "dependencies": { + "react-router": "7.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -2966,21 +4899,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -3020,6 +4951,7 @@ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } @@ -3034,19 +4966,21 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 18" } }, "node_modules/run-parallel": { @@ -3073,14 +5007,16 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -3090,70 +5026,234 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-regex-test": { + "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" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, + "license": "ISC" + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/sharp": { + "version": "0.34.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", + "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.7.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.1", + "@img/sharp-darwin-x64": "0.34.1", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.1", + "@img/sharp-linux-arm64": "0.34.1", + "@img/sharp-linux-s390x": "0.34.1", + "@img/sharp-linux-x64": "0.34.1", + "@img/sharp-linuxmusl-arm64": "0.34.1", + "@img/sharp-linuxmusl-x64": "0.34.1", + "@img/sharp-wasm32": "0.34.1", + "@img/sharp-win32-ia32": "0.34.1", + "@img/sharp-win32-x64": "0.34.1" } }, "node_modules/shebang-command": { @@ -3161,6 +5261,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3173,41 +5274,123 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map-js": { + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -3216,35 +5399,41 @@ "node": ">=10.0.0" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3253,44 +5442,74 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/strip-bom": { @@ -3298,6 +5517,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3314,10 +5534,73 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-components": { + "version": "6.1.18", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.18.tgz", + "integrity": "sha512-Mvf3gJFzZCkhjY2Y/Fx9z1m3dxbza0uI9H1CbNZm/jSHCojzJhQ0R7bByrlFJINnMzz/gPulpoFFGymNwrsMcw==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", "dependencies": { "client-only": "0.0.1" }, @@ -3325,7 +5608,7 @@ "node": ">= 12.0.0" }, "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { @@ -3336,6 +5619,12 @@ } } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3360,20 +5649,50 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=6" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -3387,23 +5706,35 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.13.0" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -3412,9 +5743,10 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -3428,42 +5760,48 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.6" } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3473,16 +5811,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -3492,14 +5833,21 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3519,15 +5867,19 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3539,6 +5891,49 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", + "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.2", + "@unrs/resolver-binding-darwin-x64": "1.7.2", + "@unrs/resolver-binding-freebsd-x64": "1.7.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-musl": "1.7.2", + "@unrs/resolver-binding-wasm32-wasi": "1.7.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3548,16 +5943,14 @@ "punycode": "^2.1.0" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, "node_modules/which": { @@ -3565,6 +5958,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3576,39 +5970,45 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", + "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -3618,31 +6018,38 @@ } }, "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3655,13 +6062,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", @@ -3674,6 +6076,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } } } } diff --git a/pages/_app.tsx b/pages/_app.tsx deleted file mode 100644 index 021681f4..00000000 --- a/pages/_app.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import '@/styles/globals.css' -import type { AppProps } from 'next/app' - -export default function App({ Component, pageProps }: AppProps) { - return -} diff --git a/pages/_document.tsx b/pages/_document.tsx deleted file mode 100644 index 54e8bf3e..00000000 --- a/pages/_document.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Html, Head, Main, NextScript } from 'next/document' - -export default function Document() { - return ( - - - -
    - - - - ) -} diff --git a/pages/api/hello.ts b/pages/api/hello.ts deleted file mode 100644 index f8bcc7e5..00000000 --- a/pages/api/hello.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next' - -type Data = { - name: string -} - -export default function handler( - req: NextApiRequest, - res: NextApiResponse -) { - res.status(200).json({ name: 'John Doe' }) -} diff --git a/pages/index.tsx b/pages/index.tsx deleted file mode 100644 index 02c4dee0..00000000 --- a/pages/index.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import Head from 'next/head' -import Image from 'next/image' -import { Inter } from 'next/font/google' -import styles from '@/styles/Home.module.css' - -const inter = Inter({ subsets: ['latin'] }) - -export default function Home() { - return ( - <> - - Create Next App - - - - -
    -
    -

    - Get started by editing  - pages/index.tsx -

    - -
    - -
    - Next.js Logo -
    - - -
    - - ) -} diff --git a/src/app/Home/Home.style.ts b/src/app/Home/page.style.ts similarity index 100% rename from src/app/Home/Home.style.ts rename to src/app/Home/page.style.ts diff --git a/src/app/Home/Home.tsx b/src/app/Home/page.tsx similarity index 98% rename from src/app/Home/Home.tsx rename to src/app/Home/page.tsx index e3f1d953..c7432bdf 100644 --- a/src/app/Home/Home.tsx +++ b/src/app/Home/page.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import * as S from './Home.style' +import * as S from './page.style' import Button from '../../../components/common/Button' import Logo from '../../../public/assets/image/Logo.png' @@ -15,7 +15,7 @@ import HomeRegister from '../../../public/assets/image/home_register.png' import Facebook from '../../../public/assets/svg/facebook.svg' import Instagram from '../../../public/assets/svg/instagram.svg' import Twitter from '../../../public/assets/svg/twitter.svg' -import Youtube from '../../../public/assets/svg/youtube.svg' +import Youtube from '../../../public/ assets/svg/youtube.svg' import Image from 'next/image' function Home() { From 319a3998e0c65329cd38a923b2104013ed545c25 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Wed, 14 May 2025 20:42:00 +0900 Subject: [PATCH 04/12] =?UTF-8?q?chore:=EB=9E=9C=EB=94=A9=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/ClientLayout.tsx | 4 +- src/app/Home/page.tsx | 2 +- src/app/Items/Items.tsx | 4 +- src/app/ItemsDetail/ItemsDetail.tsx | 2 +- .../ItemsDetail/ItemsDetailDescription.tsx | 2 +- .../ItemsDetail/ItemsDetailQuestionArrary.tsx | 4 +- .../ItemsDetailQuestionTextarea.tsx | 4 +- src/app/LoginAndSignup/LoginField.tsx | 4 +- src/app/Nav/NavVArLayout.tsx | 2 +- .../{AddItem/AddItem.tsx => additem/page.tsx} | 12 +- .../{Boards/Boards.tsx => boards/page.tsx} | 0 {components => src/app}/common/Button.tsx | 72 ++--- .../app}/common/ButtonImage.tsx | 4 +- {components => src/app}/common/DropDown.tsx | 4 +- .../app}/common/ItemsNavVar.tsx | 4 +- {components => src/app}/common/Tag.tsx | 4 +- .../app}/common/TextInputPlaceholder.tsx | 4 +- src/app/{Faq/Faq.jsx => faq/page.jsx} | 0 src/app/globals.css | 5 +- .../app/hooks}/useCommentService.tsx | 0 .../app/hooks}/useProductService.tsx | 0 src/app/layout.tsx | 8 + .../Login.tsx => login/page.tsx} | 52 ++-- src/app/page.module.css | 168 ------------ src/app/page.style.ts | 252 +++++++++--------- src/app/page.tsx | 101 +++---- .../Signup.tsx => signup/page.tsx} | 2 +- {styles => src/app/styles}/GlobalStyles.tsx | 8 +- {styles => src/app/styles}/Home.module.css | 0 {styles => src/app/styles}/globals.css | 0 {styles => src/app/styles}/reset.css | 0 {styles => src/app/styles}/textStyle.ts | 0 {styles => src/app/styles}/theme.ts | 36 +-- {types => src/app/types}/comment.ts | 0 {types => src/app/types}/product.ts | 0 src/app/types/theme.d.ts | 33 +++ {utils => src/app/utils}/datetime.ts | 0 styles/theme.d.ts | 44 --- tsconfig.json | 5 +- 39 files changed, 317 insertions(+), 529 deletions(-) rename src/app/{AddItem/AddItem.tsx => additem/page.tsx} (92%) rename src/app/{Boards/Boards.tsx => boards/page.tsx} (100%) rename {components => src/app}/common/Button.tsx (74%) rename {components => src/app}/common/ButtonImage.tsx (97%) rename {components => src/app}/common/DropDown.tsx (97%) rename {components => src/app}/common/ItemsNavVar.tsx (97%) rename {components => src/app}/common/Tag.tsx (92%) rename {components => src/app}/common/TextInputPlaceholder.tsx (93%) rename src/app/{Faq/Faq.jsx => faq/page.jsx} (100%) rename {hooks => src/app/hooks}/useCommentService.tsx (100%) rename {hooks => src/app/hooks}/useProductService.tsx (100%) rename src/app/{LoginAndSignup/Login.tsx => login/page.tsx} (81%) delete mode 100644 src/app/page.module.css rename src/app/{LoginAndSignup/Signup.tsx => signup/page.tsx} (99%) rename {styles => src/app/styles}/GlobalStyles.tsx (77%) rename {styles => src/app/styles}/Home.module.css (100%) rename {styles => src/app/styles}/globals.css (100%) rename {styles => src/app/styles}/reset.css (100%) rename {styles => src/app/styles}/textStyle.ts (100%) rename {styles => src/app/styles}/theme.ts (61%) rename {types => src/app/types}/comment.ts (100%) rename {types => src/app/types}/product.ts (100%) create mode 100644 src/app/types/theme.d.ts rename {utils => src/app/utils}/datetime.ts (100%) delete mode 100644 styles/theme.d.ts diff --git a/src/app/ClientLayout.tsx b/src/app/ClientLayout.tsx index 5175cf63..a504592f 100644 --- a/src/app/ClientLayout.tsx +++ b/src/app/ClientLayout.tsx @@ -1,8 +1,8 @@ 'use client' import { ThemeProvider } from 'styled-components' -import { theme } from '../../styles/theme' -import GlobalStyles from '../../styles/GlobalStyles' +import { theme } from './styles/theme' +import GlobalStyles from './styles/GlobalStyles' export default function ClientLayout({ children, diff --git a/src/app/Home/page.tsx b/src/app/Home/page.tsx index c7432bdf..4d89385d 100644 --- a/src/app/Home/page.tsx +++ b/src/app/Home/page.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react' import { Link } from 'react-router-dom' import * as S from './page.style' -import Button from '../../../components/common/Button' +import Button from '../common/Button' import Logo from '../../../public/assets/image/Logo.png' import LogoFace from '../../../public/assets/image/LogoFace.png' diff --git a/src/app/Items/Items.tsx b/src/app/Items/Items.tsx index 1f2da712..4941755f 100644 --- a/src/app/Items/Items.tsx +++ b/src/app/Items/Items.tsx @@ -6,9 +6,9 @@ import { useNavigate, useLocation } from 'react-router-dom' import { GetProductIdTypes } from '../../../types/product' import BestItems from './BestItems' import RecentItems from './RecentItems' -import DropDown from '../../../components/common/DropDown' +import DropDown from '../common/DropDown' import productService from '../../app/api/services/productService' -import Button from '../../../components/common/Button' +import Button from '../common/Button' import Search from '../../../public/assets/svg/Search.svg' import ArrowLeft from '../../../public/assets/svg/ArrowLeft.svg' diff --git a/src/app/ItemsDetail/ItemsDetail.tsx b/src/app/ItemsDetail/ItemsDetail.tsx index ba91b12f..7f85e5e4 100644 --- a/src/app/ItemsDetail/ItemsDetail.tsx +++ b/src/app/ItemsDetail/ItemsDetail.tsx @@ -3,7 +3,7 @@ import { Link } from 'react-router-dom' import ItemsDetailDescription from './ItemsDetailDescription' import ItemsDetailQuestionTextarea from './ItemsDetailQuestionTextarea' -import Button from '../../../components/common/Button' +import Button from '../common/Button' import BackIcon from '../../../public/assets/svg/BackIcon.svg' diff --git a/src/app/ItemsDetail/ItemsDetailDescription.tsx b/src/app/ItemsDetail/ItemsDetailDescription.tsx index 266d2449..86fca6f4 100644 --- a/src/app/ItemsDetail/ItemsDetailDescription.tsx +++ b/src/app/ItemsDetail/ItemsDetailDescription.tsx @@ -2,7 +2,7 @@ import React from 'react' import { useLocation } from 'react-router-dom' import { useGetProductId } from '../../../hooks/useProductService' -import Tag from '../../../components/common/Tag' +import Tag from '../common/Tag' import { formatDate } from '../../../utils/datetime' import Setting from '../../../public/assets/svg/Setting.svg' diff --git a/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx b/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx index 48cd585e..48723481 100644 --- a/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx +++ b/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx @@ -1,8 +1,8 @@ import React, { useState, useEffect, useRef } from 'react' import { PostCommentType } from '../../../types/comment' -import Button from '../../../components/common/Button' -import TextInputPlaceholder from '../../../components/common/TextInputPlaceholder' +import Button from '../common/Button' +import TextInputPlaceholder from '../common/TextInputPlaceholder' import commentService from '../../../src/app/api/services/commentService' import { diffDate } from '../../../utils/datetime' import { formatDate } from '../../../utils/datetime' diff --git a/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx b/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx index 30b03573..11dc509a 100644 --- a/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx +++ b/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx @@ -4,8 +4,8 @@ import { useLocation } from 'react-router-dom' import { useGetCommentService } from '../../../hooks/useCommentService' import ItemsDetailQuestionArrary from './ItemsDetailQuestionArrary' -import TextInputPlaceholder from '../../../components/common/TextInputPlaceholder' -import Button from '../../../components/common/Button' +import TextInputPlaceholder from '../common/TextInputPlaceholder' +import Button from '../common/Button' import InquiryEmpty from '../../../public/assets/svg/InquiryEmpty.svg' import styled from 'styled-components' diff --git a/src/app/LoginAndSignup/LoginField.tsx b/src/app/LoginAndSignup/LoginField.tsx index 5948ded8..d946761b 100644 --- a/src/app/LoginAndSignup/LoginField.tsx +++ b/src/app/LoginAndSignup/LoginField.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' import styled from 'styled-components' const PlaceholderWrapper = styled.div` diff --git a/src/app/Nav/NavVArLayout.tsx b/src/app/Nav/NavVArLayout.tsx index 317a7d24..c3697b42 100644 --- a/src/app/Nav/NavVArLayout.tsx +++ b/src/app/Nav/NavVArLayout.tsx @@ -1,5 +1,5 @@ import { Outlet, useLocation } from 'react-router-dom' -import ItemsNavVar from '../../../components/common/ItemsNavVar' +import ItemsNavVar from '../common/ItemsNavVar' const NavVArLayout = () => { const { pathname } = useLocation() // 현재 페이지가 어떤 페이지인지 감지 diff --git a/src/app/AddItem/AddItem.tsx b/src/app/additem/page.tsx similarity index 92% rename from src/app/AddItem/AddItem.tsx rename to src/app/additem/page.tsx index 98b726ec..ee137323 100644 --- a/src/app/AddItem/AddItem.tsx +++ b/src/app/additem/page.tsx @@ -1,14 +1,14 @@ 'use client' import React, { useState } from 'react' -import Button from '../../../components/common/Button' -import ButtonImage from '../../../components/common/ButtonImage' -import TextInputPlaceholder from '../../../components/common/TextInputPlaceholder' -import Tag from '../../../components/common/Tag' +import Button from '../../common/Button' +import ButtonImage from '../../common/ButtonImage' +import TextInputPlaceholder from '../../common/TextInputPlaceholder' +import Tag from '../../common/Tag' import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' const AddItem = () => { const [productName, setProductName] = useState('') diff --git a/src/app/Boards/Boards.tsx b/src/app/boards/page.tsx similarity index 100% rename from src/app/Boards/Boards.tsx rename to src/app/boards/page.tsx diff --git a/components/common/Button.tsx b/src/app/common/Button.tsx similarity index 74% rename from components/common/Button.tsx rename to src/app/common/Button.tsx index f6f5178a..746a81e1 100644 --- a/components/common/Button.tsx +++ b/src/app/common/Button.tsx @@ -1,33 +1,31 @@ import styled from 'styled-components' -import { Link } from 'react-router-dom' -import { ReactNode } from 'react' +import Link from 'next/link' +import { ReactNode, CSSProperties } from 'react' interface ButtonProps { size: number - width?: number - paddingHeight?: number - paddingWidth?: number onClick?: () => void disabled?: boolean children?: ReactNode + style?: CSSProperties prefix?: ReactNode suffix?: ReactNode as?: 'button' | typeof Link to?: string + className?: string } const Button = ({ - size = 43, - width, - paddingHeight, - paddingWidth, + size = 48.5, onClick, disabled, children, + style, prefix, suffix, as = 'button', to, + className, }: ButtonProps) => { const isLink = as === Link @@ -36,16 +34,35 @@ const Button = ({ return null } + if (isLink) { + return ( + + + + + {prefix && {prefix}} + {children} + {suffix && {suffix}} + + + + + ) + } + return ( {prefix && {prefix}} @@ -60,9 +77,6 @@ export default Button interface StyledButtonWrapper { size?: number - width?: number - paddingHeight?: number - paddingWidth?: number } const ButtonWrapper = styled.button` @@ -75,13 +89,9 @@ const ButtonWrapper = styled.button` color: ${({ theme }) => theme.colors.SecondaryGray[50]}; font-weight: ${({ size }) => ButtonSize[size!]?.fontWeight || 600}; border-radius: ${({ size }) => ButtonSize[size!]?.borderRadius || '40px'}; - height: ${({ size }) => (size === 43 ? '48px' : 'auto')}; - width: ${({ width }) => (width ? `${width}px` : '100%')}; + font-size: ${({ size }) => ButtonSize[size!]?.fontSize || '16px'}; - padding: ${({ paddingHeight, paddingWidth }) => - paddingHeight && paddingWidth - ? `${paddingHeight}px ${paddingWidth}px` - : `16px`}; + transition: all 0.3s ease-in-out; &:hover { background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; @@ -111,45 +121,39 @@ const ButtonInnerText = styled.span` type ButtonSizeType = Record< number, { - height: string fontSize: string fontWeight: number - padding?: string + borderRadius: string } > const ButtonSize: ButtonSizeType = { 56: { - height: '56px', fontSize: '20px', fontWeight: 600, - padding: '12px 124px', + borderRadius: '40px', }, 48: { - height: '48px', fontSize: '18px', fontWeight: 600, - padding: '11px 71px', + borderRadius: '40px', }, 42.5: { - height: '42px', fontSize: '16px', fontWeight: 600, - padding: '9px 20px', + borderRadius: '8px', }, 48.5: { - height: '48px', fontSize: '16px', fontWeight: 600, - padding: '11px 30px', + borderRadius: '8px', }, 0: { - height: '40px', fontSize: '16px', fontWeight: 600, borderRadius: '40px', diff --git a/components/common/ButtonImage.tsx b/src/app/common/ButtonImage.tsx similarity index 97% rename from components/common/ButtonImage.tsx rename to src/app/common/ButtonImage.tsx index 04e48692..e326cec2 100644 --- a/components/common/ButtonImage.tsx +++ b/src/app/common/ButtonImage.tsx @@ -4,8 +4,8 @@ import Plus from '../../public/assets/svg/Plus.svg' import Delete from '../../public/assets/svg/Delete.svg' import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' import Image from 'next/image' const ButtonImage = () => { diff --git a/components/common/DropDown.tsx b/src/app/common/DropDown.tsx similarity index 97% rename from components/common/DropDown.tsx rename to src/app/common/DropDown.tsx index b2a43c24..43eaeb21 100644 --- a/components/common/DropDown.tsx +++ b/src/app/common/DropDown.tsx @@ -1,7 +1,7 @@ import React, { useRef, useState, useEffect } from 'react' import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' import ArrowDown from '../../public/assets/image/ArrowDown.png' import Sort from '../../public/assets/svg/Sort.svg' diff --git a/components/common/ItemsNavVar.tsx b/src/app/common/ItemsNavVar.tsx similarity index 97% rename from components/common/ItemsNavVar.tsx rename to src/app/common/ItemsNavVar.tsx index 8844f3cd..895b24c7 100644 --- a/components/common/ItemsNavVar.tsx +++ b/src/app/common/ItemsNavVar.tsx @@ -6,8 +6,8 @@ import Logo from '../../public/assets/image/Logo.png' import ProfileIcon from '../../public/assets/svg/ProfileIcon.svg' import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' import Image from 'next/image' interface ItemsNavVarProps { diff --git a/components/common/Tag.tsx b/src/app/common/Tag.tsx similarity index 92% rename from components/common/Tag.tsx rename to src/app/common/Tag.tsx index 7cf46dfe..c87ef020 100644 --- a/components/common/Tag.tsx +++ b/src/app/common/Tag.tsx @@ -1,8 +1,8 @@ import React from 'react' import Delete from '../../public/assets/svg/Delete.svg' import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' interface TagProps { tag: string diff --git a/components/common/TextInputPlaceholder.tsx b/src/app/common/TextInputPlaceholder.tsx similarity index 93% rename from components/common/TextInputPlaceholder.tsx rename to src/app/common/TextInputPlaceholder.tsx index 8b5418b0..b1c3ffdf 100644 --- a/components/common/TextInputPlaceholder.tsx +++ b/src/app/common/TextInputPlaceholder.tsx @@ -1,7 +1,7 @@ import React from 'react' import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' interface TextInputPlaceholderProps { placeholder?: string diff --git a/src/app/Faq/Faq.jsx b/src/app/faq/page.jsx similarity index 100% rename from src/app/Faq/Faq.jsx rename to src/app/faq/page.jsx diff --git a/src/app/globals.css b/src/app/globals.css index e3734be1..ebf1acbc 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -10,8 +10,11 @@ } } -html, +html { + font-size: 62.5% !important; +} body { + font-size: 1.6rem !important; max-width: 100vw; overflow-x: hidden; } diff --git a/hooks/useCommentService.tsx b/src/app/hooks/useCommentService.tsx similarity index 100% rename from hooks/useCommentService.tsx rename to src/app/hooks/useCommentService.tsx diff --git a/hooks/useProductService.tsx b/src/app/hooks/useProductService.tsx similarity index 100% rename from hooks/useProductService.tsx rename to src/app/hooks/useProductService.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 91680221..538fe6e6 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -19,3 +19,11 @@ export default function RootLayout({ ) } + +// page라우터와 app라우터 차이 +// 기본으로 만들어지는 파일 +// 이 파일은 페이지의 기본적인 레이아웃을 구성하는 요소 +// 루트에는 단 하나의 layouy을 둘 수 있음 +// 이 layout은 모든 페이지에 영향을 미치는 공통 레이아웃 +// 페이지 하위에 추가되는 layout은 해당 주소 하위에만 적용 +// layout은 주소별 공통 UI를 포함할 수 있을 뿐 아니라 _app과 _document를 대신해 웹 페이지를 시작하는데 필요한 공통 코드 삽입 diff --git a/src/app/LoginAndSignup/Login.tsx b/src/app/login/page.tsx similarity index 81% rename from src/app/LoginAndSignup/Login.tsx rename to src/app/login/page.tsx index 7c3bf627..847ff0d6 100644 --- a/src/app/LoginAndSignup/Login.tsx +++ b/src/app/login/page.tsx @@ -1,10 +1,10 @@ 'use client' import React, { useState, useEffect } from 'react' -import { Link, useNavigate } from 'react-router-dom' +import Link from 'next/link' -import LoginField from './LoginField' -import Button from '../../../components/common/Button' +import LoginField from '../LoginAndSignup/LoginField' +import Button from '../common/Button' import Logo from '../../../public/assets/image/Logo.png' import LogoFace from '../../../public/assets/image/LogoFace.png' @@ -14,8 +14,9 @@ import VisibillityOff from '../../../public/assets/svg/btn_visibillity_off.svg' import Visibillity from '../../../public/assets/svg/btn_visibillity.svg' import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' +import Image from 'next/image' const Bone = styled.div` display: flex; @@ -46,23 +47,7 @@ const LogoContainer = styled.div` margin-bottom: 1.5rem; } ` -const LogoFaceImage = styled.img` - width: 6.438rem; - height: 6.438rem; - @media (max-width: 375px) { - margin: auto 11px auto 0; - width: 3.187rem; - height: 3.187rem; - } -` -const LogoImage = styled.img` - width: 16.625rem; - height: 5rem; - @media (max-width: 375px) { - width: 8.313rem; - height: 2.813rem; - } -` + const ButtonWrapper = styled.div` margin-bottom: 3rem; width: 100%; @@ -106,7 +91,6 @@ const Register = styled.div` ` const Login = () => { - const navigate = useNavigate() const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [emailError, setEmailError] = useState('') @@ -142,7 +126,6 @@ const Login = () => { setPasswordError(passwordValidation) if (!emailValidation && !passwordValidation) { - navigate(`/items`) } } useEffect(() => { @@ -152,11 +135,11 @@ const Login = () => { return ( - - + + 판다마켓 로고 사진 - - + + 판다마켓 로고 사진 { error={passwordError} /> - @@ -199,17 +177,17 @@ const Login = () => { 간편 로그인하기 - 구글 로고 사진 + 구글 로고 사진 - 카카오 로고 사진 + 카카오 로고 사진 판다마켓이 처음이신가요?   - 회원가입 + 회원가입 diff --git a/src/app/page.module.css b/src/app/page.module.css deleted file mode 100644 index a11c8f31..00000000 --- a/src/app/page.module.css +++ /dev/null @@ -1,168 +0,0 @@ -.page { - --gray-rgb: 0, 0, 0; - --gray-alpha-200: rgba(var(--gray-rgb), 0.08); - --gray-alpha-100: rgba(var(--gray-rgb), 0.05); - - --button-primary-hover: #383838; - --button-secondary-hover: #f2f2f2; - - display: grid; - grid-template-rows: 20px 1fr 20px; - align-items: center; - justify-items: center; - min-height: 100svh; - padding: 80px; - gap: 64px; - font-family: var(--font-geist-sans); -} - -@media (prefers-color-scheme: dark) { - .page { - --gray-rgb: 255, 255, 255; - --gray-alpha-200: rgba(var(--gray-rgb), 0.145); - --gray-alpha-100: rgba(var(--gray-rgb), 0.06); - - --button-primary-hover: #ccc; - --button-secondary-hover: #1a1a1a; - } -} - -.main { - display: flex; - flex-direction: column; - gap: 32px; - grid-row-start: 2; -} - -.main ol { - font-family: var(--font-geist-mono); - padding-left: 0; - margin: 0; - font-size: 14px; - line-height: 24px; - letter-spacing: -0.01em; - list-style-position: inside; -} - -.main li:not(:last-of-type) { - margin-bottom: 8px; -} - -.main code { - font-family: inherit; - background: var(--gray-alpha-100); - padding: 2px 4px; - border-radius: 4px; - font-weight: 600; -} - -.ctas { - display: flex; - gap: 16px; -} - -.ctas a { - appearance: none; - border-radius: 128px; - height: 48px; - padding: 0 20px; - border: none; - border: 1px solid transparent; - transition: - background 0.2s, - color 0.2s, - border-color 0.2s; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - font-size: 16px; - line-height: 20px; - font-weight: 500; -} - -a.primary { - background: var(--foreground); - color: var(--background); - gap: 8px; -} - -a.secondary { - border-color: var(--gray-alpha-200); - min-width: 158px; -} - -.footer { - grid-row-start: 3; - display: flex; - gap: 24px; -} - -.footer a { - display: flex; - align-items: center; - gap: 8px; -} - -.footer img { - flex-shrink: 0; -} - -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - a.primary:hover { - background: var(--button-primary-hover); - border-color: transparent; - } - - a.secondary:hover { - background: var(--button-secondary-hover); - border-color: transparent; - } - - .footer a:hover { - text-decoration: underline; - text-underline-offset: 4px; - } -} - -@media (max-width: 600px) { - .page { - padding: 32px; - padding-bottom: 80px; - } - - .main { - align-items: center; - } - - .main ol { - text-align: center; - } - - .ctas { - flex-direction: column; - } - - .ctas a { - font-size: 14px; - height: 40px; - padding: 0 16px; - } - - a.secondary { - min-width: auto; - } - - .footer { - flex-wrap: wrap; - align-items: center; - justify-content: center; - } -} - -@media (prefers-color-scheme: dark) { - .logo { - filter: invert(); - } -} diff --git a/src/app/page.style.ts b/src/app/page.style.ts index 1cc96239..1f2f390f 100644 --- a/src/app/page.style.ts +++ b/src/app/page.style.ts @@ -1,6 +1,7 @@ import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from './styles/theme' +import { textStyle } from './styles/textStyle' +import Button from './common/Button' export const HeaderTop = styled.header` display: flex; @@ -15,28 +16,39 @@ export const HeaderNav = styled.nav` justify-content: space-between; align-items: center; width: 100%; - padding: 0.6rem 0px; - margin: 0 13rem; - @media (max-width: 744px) { - margin: 0 1.5rem; + padding: 0.95rem 0px; + margin: 0 40rem; + @media (max-width: 1023px) { + margin: 0 2.4rem; } - @media (max-width: 375px) { + @media (max-width: 743px) { margin: 0 1rem; } ` - +export const PandaLogo = styled.div` + display: flex; + @media (max-width: 743px) { + display: none; + } +` +export const PandaLogoName = styled.div` + display: flex; +` export const HeaderLogo = styled.div` width: 100%; height: 100%; display: flex; align-items: center; + gap: 0.85rem; ` -export const ButtonWrapper = styled.div` - width: auto; - height: auto; - @media (max-width: 744px) { - width: max-content; +export const PandaBackground = styled.div` + width: 74.6rem; + height: 30.4rem; + position: relative; + @media (max-width: 743px) { + width: 100%; + height: 20rem; } ` @@ -45,7 +57,7 @@ export const HeaderLogoFace = styled.img` height: 2.5rem; margin-right: 0.5rem; display: flex; - @media (max-width: 375px) { + @media (max-width: 743px) { width: 0; } ` @@ -67,10 +79,10 @@ export const HeaderLogin = styled.a` display: flex; justify-content: center; align-items: center; - @media (max-width: 744px) { + @media (max-width: 1023px) { width: 9.73rem; } - @media (max-width: 375px) { + @media (max-width: 743px) { width: 9.73rem; } ` @@ -83,9 +95,9 @@ export const HeaderMain = styled.div` export const HeaderMainContainer = styled.div` width: max-content; display: flex; - padding: 12.5rem 0px 0px 0px; + padding: 20rem 0px 0px 0px; margin: 0 auto; - @media (max-width: 744px) { + @media (max-width: 1023px) { width: 100%; height: 771px; flex-direction: column; @@ -93,7 +105,7 @@ export const HeaderMainContainer = styled.div` justify-content: space-between; padding: 0; } - @media (max-width: 375px) { + @media (max-width: 743px) { width: 100%; height: auto; img { @@ -105,37 +117,44 @@ export const HeaderMainContainer = styled.div` export const HeaderMainTitle = styled.div` width: auto; margin: auto 0; - @media (max-width: 744px) { + @media (max-width: 1023px) { width: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; } - @media (max-width: 375px) { - width: 15rem; - margin-bottom: 8.25rem; + @media (max-width: 743px) { + width: 24rem; + margin-bottom: 13.2rem; } ` export const HeaderTitleFont = styled.h1` - width: 20rem; + width: 32.5rem; ${(props) => textStyle(40, 700)(props)} - margin: 0 4rem 2rem 0; + margin: 0 6.2rem 3.2rem 0; color: ${theme.colors.SecondaryGray[700]}; - @media (max-width: 744px) { + @media (max-width: 1023px) { margin-top: 84px; width: auto; margin: 84px auto 24px; } - @media (max-width: 375px) { - margin-bottom: 1.125rem; - text-align: center; + @media (max-width: 743px) { ${(props) => textStyle(32, 700)(props)} - width: 254px; + width: 26rem; + margin-bottom: 1.8rem; + text-align: center; } ` +export const ItemsButton = styled(Button)` + padding: 1.2rem 12.4rem; + width: max-content; + @media (max-width: 768px) { + padding: 1.1rem 7.1rem; + } +` export const HeaderItems = styled.a` width: 7.25rem; background-color: ${theme.colors.PrimaryBlue[100]}; @@ -145,7 +164,7 @@ export const HeaderItems = styled.a` text-decoration: none; padding: 0.75rem 7.75rem; display: inline-block; - @media (max-width: 375px) { + @media (max-width: 743px) { padding: 0.5rem 4rem; margin-top: 1.13rem; } @@ -157,103 +176,96 @@ export const MainBasic = styled.main` display: flex; flex-direction: column; align-items: center; - @media (max-width: 744px) { - margin: 24px; + @media (max-width: 1023px) { + margin: 2.4rem; } - @media (max-width: 375px) { + @media (max-width: 743px) { margin: 52px 16px 2.5rem 15px; - width: 344px; } ` export const MainTheme = styled.div` display: flex; background-color: #fcfcfc; - margin: 8.63rem auto; - @media (max-width: 744px) { + margin: 13.8rem auto; + @media (max-width: 1023px) { width: 100%; flex-direction: column; margin: 0; } ` - -export const MainPopularSellImage = styled.picture` - width: auto; - height: 27.75rem; - - @media (max-width: 744px) { +// 지우셈 +export const MainPopularSellImage = styled.div` + @media (max-width: 1023px) { img { width: 100%; - height: 32.813rem; + height: 52.5rem; + border-radius: 1.4rem; } } - @media (max-width: 375px) { - height: 16.187rem; + @media (max-width: 743px) { + height: 25.9rem; img { - width: 100%; height: 100%; } } ` export const MainThemeBasic = styled.div` - width: 18.625rem; + width: 30.8rem; display: flex; justify-content: center; align-items: flex-start; background-color: #fcfcfc; flex-direction: column; - margin: auto 4rem; - @media (max-width: 744px) { + margin: auto 2.3rem auto 6.4rem; + @media (max-width: 1023px) { width: 100%; margin: 0; } - @media (max-width: 375px) { + @media (max-width: 743px) { height: 134px; - margin: 1.5rem auto 2.69rem 0; + margin: 2.4rem auto 4rem 0; } ` export const MainPopularSellFontTop = styled.p` - margin: 0 0px 0.75rem 0; + margin: 0 0px 1.2rem 0; ${(props) => textStyle(18, 700)(props)} color: ${theme.colors.PrimaryBlue[100]}; - @media (max-width: 744px) { - margin: 1.5rem auto 1rem; + @media (max-width: 1023px) { + margin: 2.4rem auto 1.6rem; } - @media (max-width: 375px) { + @media (max-width: 743px) { margin: 0 auto 0.5rem 0rem; ${(props) => textStyle(16, 700)(props)} } ` export const MainPopularSellFontMiddle = styled.h2` - width: 306px; - margin: 0 auto 1.5rem 0; + margin: 0 auto 2.4rem 0; ${(props) => textStyle(40, 700)(props)} color: ${theme.colors.SecondaryGray[700]}; - @media (max-width: 744px) { + @media (max-width: 1023px) { ${(props) => textStyle(32, 700)(props)} width:100%; } - @media (max-width: 375px) { + @media (max-width: 743px) { ${(props) => textStyle(24, 700)(props)} margin-bottom: 1rem; - line-height: 2rem; } ` export const MainPopularSellFontBottom = styled.p` ${(props) => textStyle(24, 500)(props)} color: ${theme.colors.SecondaryGray[700]}; - width: 100%; - @media (max-width: 744px) { + + @media (max-width: 1023px) { ${(props) => textStyle(18, 500)(props)} - width:100%; - width: 15.75rem; - margin-bottom: 3.25rem; + width: 23.6rem; + margin-bottom: 5.2rem; } - @media (max-width: 375px) { + @media (max-width: 743px) { margin: 0; ${(props) => textStyle(16, 500)(props)} width: 205px; @@ -263,13 +275,13 @@ export const MainPopularSellFontBottom = styled.p` export const MainThemeCenter = styled.div` display: flex; background-color: #fcfcfc; - margin: 8.63rem auto; - @media (max-width: 744px) { + margin: 13.8rem auto; + @media (max-width: 1023px) { width: 100%; flex-direction: column-reverse; margin: 0; } - @media (max-width: 375px) { + @media (max-width: 743px) { flex-wrap: wrap-reverse; } ` @@ -277,26 +289,31 @@ export const MainThemeCenter = styled.div` export const MainThemeBasicMiddle = styled(MainThemeBasic)` align-items: flex-end; text-align: right; - @media (max-width: 375px) { + + margin: auto 6.4rem auto 1.3rem; + @media (max-width: 1023px) { + margin: 0; + } + @media (max-width: 743px) { width: 330px; - margin-right: 0; + margin: 2.4rem auto 4rem auto; } ` export const MainSearchImage = styled.picture` - width: 579px; - height: 444px; - @media (max-width: 744px) { + height: 44.4rem; + @media (max-width: 1023px) { width: 100%; height: 100%; margin: 0; img { width: 100%; - height: 32.5rem; + height: 52rem; + border-radius: 1.4rem; } } - @media (max-width: 375px) { - height: 16.187rem; + @media (max-width: 743px) { + height: 25.9rem; img { width: 100%; height: 100%; @@ -313,9 +330,9 @@ export const FooterMainContainer = styled.footer` export const FooterEmpty = styled.div` width: 100%; - height: 138px; + height: 13.8rem; background-color: #fcfcfc; - @media (max-width: 744px) { + @media (max-width: 1023px) { width: 0; height: 0; } @@ -327,19 +344,12 @@ export const FooterContainer = styled.div` align-items: center; width: 100%; background-color: #cfe5ff; - @media (max-width: 744px) { - } - @media (max-width: 375px) { - height: 33.75rem; - } ` export const FooterBackground = styled.div` display: flex; align-items: center; - height: 397px; - margin-top: 9rem; - width: 69.375rem; - @media (max-width: 744px) { + margin-top: 14.3rem; + @media (max-width: 1023px) { flex-direction: column; justify-content: space-between; width: 100%; @@ -348,29 +358,34 @@ export const FooterBackground = styled.div` } ` -export const FooterFont = styled.h2` +export const FooterFont = styled.div` ${(props) => textStyle(40, 700)(props)} - @media (max-width: 744px) { - margin: 12.562rem auto 13.562rem; - width: 20.438rem; + width: 32.5rem; + height: 17.2rem; + margin-right: 6.5rem; + @media (max-width: 1023px) { + margin: 20.1rem auto 21.7rem; + width: 32.5rem; text-align: center; line-height: 56px; } - @media (max-width: 375px) { + @media (max-width: 743px) { ${(props) => textStyle(32, 700)(props)} - margin: 121px auto 131px; + margin: 12rem auto 13rem; width: 254px; - height: 90px; + height: fit-content; text-align: center; } ` export const FooterImage = styled.picture` - width: 46.63rem; - height: 24.81rem; - @media (max-width: 375px) { + width: 74.6rem; + height: 39rem; + @media (max-width: 743px) { width: 100%; + height: 19.8rem; img { + height: 19.8rem; width: 100%; } } @@ -384,17 +399,17 @@ export const FooterNav = styled.div` ` export const FooterNavMain = styled.div` - height: 1.25rem; - width: 70rem; + height: 2rem; + width: 112rem; display: flex; justify-content: space-between; align-items: center; - margin: 2rem 0 6.75rem 0; - @media (max-width: 744px) { - width: 33.5rem; - margin: 2rem 8rem 6.75rem 8rem; + margin: 3.2rem 0 10.8rem 0; + @media (max-width: 1023px) { + width: 53.6rem; + margin: 3.2rem auto 10.8rem auto; } - @media (max-width: 375px) { + @media (max-width: 743px) { margin: 2rem; display: grid; grid-template-areas: @@ -407,24 +422,19 @@ export const FooterNavMain = styled.div` export const Codeit = styled.p` color: ${theme.colors.SecondaryGray[400]}; - @media (max-width: 744px) { + @media (max-width: 1023px) { ${(props) => textStyle(16, 400)(props)} } - @media (max-width: 375px) { + @media (max-width: 743px) { grid-area: ct; - font-weight: 400; - font-size: 16px; - width: 6.88rem; - height: 1rem; - font-size: 1rem; line-height: 18.4px; - text-align: center; } ` export const PrivacyFaq = styled.div` + display: flex; margin-right: 13px; - @media (max-width: 375px) { + @media (max-width: 743px) { grid-area: hd; align-items: center; justify-items: center; @@ -434,8 +444,8 @@ export const PrivacyFaq = styled.div` ` export const Social = styled.div` - width: 7.25rem; - height: 20px; + width: 11.6rem; + height: 2rem; display: flex; justify-content: space-between; @image { @@ -448,8 +458,10 @@ export const Privacy = styled.div` margin: auto 2rem auto 0; color: ${theme.colors.SecondaryGray[200]}; text-decoration: none; - @media (max-width: 375px) { - margin: 0 30px 0 0; + @media (max-width: 743px) { + ${(props) => textStyle(16, 400)(props)} + margin: 0 3rem 0 0; + width: max-content; } ` @@ -457,7 +469,7 @@ export const Faq = styled.div` color: ${theme.colors.SecondaryGray[200]}; text-decoration: none; margin: auto 0; - @media (max-width: 375px) { + @media (max-width: 743px) { margin-right: 2rem; } ` diff --git a/src/app/page.tsx b/src/app/page.tsx index 86ad8455..4507a39c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,10 +1,10 @@ -'use client' // 클라이언트 컴포넌트로 지정 +'use client' -import React, { useEffect, useState } from 'react' +import Image from 'next/image' import Link from 'next/link' import * as S from './page.style' -import Button from '../../components/common/Button' +import Button from './common/Button' import Logo from '../../public/assets/image/Logo.png' import LogoFace from '../../public/assets/image/LogoFace.png' @@ -19,48 +19,41 @@ import Twitter from '../../public/assets/svg/twitter.svg' import Youtube from '../../public/assets/svg/youtube.svg' function Home() { - const [buttonStyle, setButtonStyle] = useState({ - width: 364, - paddingWidth: 43, - }) - - const handleResize = () => { - if (window.innerWidth < 375) { - setButtonStyle({ width: 258, paddingWidth: 71 }) - } else { - setButtonStyle({ width: 364, paddingWidth: 124 }) - } - } - - // placeholder useEffect 적용 - useEffect(() => { - handleResize() - window.addEventListener('resize', handleResize) - return () => window.removeEventListener('resize', handleResize) - }, []) - return ( <> - + + 판다마켓 로고 사진 + - + + 판다마켓 로고 사진 + - - - + + @@ -69,24 +62,20 @@ function Home() { 일상의 모든 물건을 거래해 보세요 - - - + + + 구경하러 가기 + - 판다마켓 백그라운드사진 + + 판다마켓 백그라운드사진 + - 판다마켓 인기 상품 사진 + 판다마켓 인기 상품 사진
    @@ -121,12 +110,12 @@ function Home() {
    - 판다마켓 상품 검색 사진 + 판다마켓 상품 검색 사진 - 판다마켓 인기 상품 등록 + 판다마켓 인기 상품 등록
    @@ -149,11 +138,9 @@ function Home() { -
    - 믿을 수 있는 판다마켓 중고 거래 -
    + 믿을 수 있는 판다마켓 중고 거래 - 판다마켓 백그라운드사진 + 판다마켓 백그라운드사진
    @@ -170,16 +157,16 @@ function Home() { - 페이스북 로고 사진 + 페이스북 로고 사진 - 트위터 로고 사진 + 트위터 로고 사진 - 유튜브 로고 사진 + 유튜브 로고 사진 - 인스타그램 로고 사진 + 인스타그램 로고 사진 diff --git a/src/app/LoginAndSignup/Signup.tsx b/src/app/signup/page.tsx similarity index 99% rename from src/app/LoginAndSignup/Signup.tsx rename to src/app/signup/page.tsx index 49305301..07be307f 100644 --- a/src/app/LoginAndSignup/Signup.tsx +++ b/src/app/signup/page.tsx @@ -5,7 +5,7 @@ import { Link, useNavigate } from 'react-router-dom' import Image from 'next/image' import LoginField from './LoginField' -import Button from '../../../components/common/Button' +import Button from '../common/Button' import Logo from '../../../public/assets/image/Logo.png' import LogoFace from '../../../public/assets/image/LogoFace.png' diff --git a/styles/GlobalStyles.tsx b/src/app/styles/GlobalStyles.tsx similarity index 77% rename from styles/GlobalStyles.tsx rename to src/app/styles/GlobalStyles.tsx index 45167538..ac2e8edd 100644 --- a/styles/GlobalStyles.tsx +++ b/src/app/styles/GlobalStyles.tsx @@ -1,5 +1,5 @@ -import { createGlobalStyle } from "styled-components"; -import "../styles/reset.css"; +import { createGlobalStyle } from 'styled-components' +import './reset.css' const GlobalStyles = createGlobalStyle` * { @@ -25,6 +25,6 @@ const GlobalStyles = createGlobalStyle` background: none; cursor: pointer; } -`; +` -export default GlobalStyles; +export default GlobalStyles diff --git a/styles/Home.module.css b/src/app/styles/Home.module.css similarity index 100% rename from styles/Home.module.css rename to src/app/styles/Home.module.css diff --git a/styles/globals.css b/src/app/styles/globals.css similarity index 100% rename from styles/globals.css rename to src/app/styles/globals.css diff --git a/styles/reset.css b/src/app/styles/reset.css similarity index 100% rename from styles/reset.css rename to src/app/styles/reset.css diff --git a/styles/textStyle.ts b/src/app/styles/textStyle.ts similarity index 100% rename from styles/textStyle.ts rename to src/app/styles/textStyle.ts diff --git a/styles/theme.ts b/src/app/styles/theme.ts similarity index 61% rename from styles/theme.ts rename to src/app/styles/theme.ts index 0c4ad7e0..ce0d0023 100644 --- a/styles/theme.ts +++ b/src/app/styles/theme.ts @@ -1,4 +1,6 @@ -export const theme = { +import { DefaultTheme } from 'styled-components' + +export const theme: DefaultTheme = { colors: { PrimaryBlue: { 100: '#3692FF', @@ -55,37 +57,7 @@ export const theme = { }, 40: { fontSize: '40px', - lineHeight: 1.4, - }, - }, - ButtonSize: { - 56: { - height: '56px', - fontSize: '20px', - fontWeight: 600, - padding: '12px 124px', - borderRadius: '40px', - }, - 48: { - height: '48px', - fontSize: '18px', - fontWeight: 600, - padding: '11px 71px', - borderRadius: '40px', - }, - 42.5: { - height: '42px', - fontSize: '16px', - fontWeight: 600, - padding: '8px 23px', - borderRadius: '8px', - }, - 48.5: { - height: '48px', - fontSize: '16px', - fontWeight: 600, - padding: '11px 30px', - borderRadius: '8px', + lineHeight: '56px', }, }, } diff --git a/types/comment.ts b/src/app/types/comment.ts similarity index 100% rename from types/comment.ts rename to src/app/types/comment.ts diff --git a/types/product.ts b/src/app/types/product.ts similarity index 100% rename from types/product.ts rename to src/app/types/product.ts diff --git a/src/app/types/theme.d.ts b/src/app/types/theme.d.ts new file mode 100644 index 00000000..1d3033e4 --- /dev/null +++ b/src/app/types/theme.d.ts @@ -0,0 +1,33 @@ +import 'styled-components' + +declare module 'styled-components' { + export interface DefaultTheme { + colors: { + PrimaryBlue: { + 100: string + 200: string + 300: string + } + SecondaryGray: { + 50: string + 100: string + 200: string + 400: string + 500: string + 600: string + 700: string + 800: string + 900: string + } + white: string + black: string + error: string + } + Typography: { + [key: number]: { + fontSize: string + lineHeight: string + } + } + } +} diff --git a/utils/datetime.ts b/src/app/utils/datetime.ts similarity index 100% rename from utils/datetime.ts rename to src/app/utils/datetime.ts diff --git a/styles/theme.d.ts b/styles/theme.d.ts deleted file mode 100644 index dde8fa41..00000000 --- a/styles/theme.d.ts +++ /dev/null @@ -1,44 +0,0 @@ -import 'styled-components' - -declare module 'styled-components' { - export interface DefaultTheme { - colors: { - PrimaryBlue: { [key: number]: string } - SecondaryGray: { [key: number]: string } - white: string - black: string - error: string - } - Typography: { - [key: number]: { - fontSize: string - lineHeight: string - letterSpacing?: string - } - } - ButtonSize: { - [key: number]: { - height: string - fontSize: string - fontWeight: number - padding: string - borderRadius: string - } - } - } -} -// declare module 'styled-components' { -// export interface DefaultTheme { -// Typography: { -// [key: number]: { -// fontSize: string -// lineHeight: string -// letterSpacing?: string -// } -// } -// colors: { -// PrimaryBlue: { [key: number]: string } -// SecondaryGray: { [key: number]: string } -// } -// } -// } diff --git a/tsconfig.json b/tsconfig.json index 3f34af91..b20a53a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ "isolatedModules": true, "jsx": "preserve", "incremental": true, + "typeRoots": ["./node_modules/@types", "src/app/types"], "plugins": [ { "name": "next" @@ -25,9 +26,11 @@ "include": [ "next-env.d.ts", "src/**/*", + "src/app/types/**/*", "**/*.ts", "**/*.tsx", - ".next/types/**/*.ts" + ".next/types/**/*.ts", + "src/app/styles" ], "exclude": ["node_modules"] } From dae16f662cfc64c7f8a8127f89be9d7e54e69146 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Thu, 15 May 2025 13:12:31 +0900 Subject: [PATCH 05/12] =?UTF-8?q?chore:=EB=A1=9C=EA=B7=B8=EC=9D=B8?= =?UTF-8?q?=EA=B9=8C=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/favicon.ico | Bin 25931 -> 0 bytes public/next.svg | 1 - public/vercel.svg | 1 - src/app/LoginAndSignup/LoginField.tsx | 42 ++++++---- src/app/additem/page.tsx | 12 +-- src/app/login/page.tsx | 107 ++++++++++++++++++-------- src/app/signup/page.tsx | 34 ++------ 7 files changed, 116 insertions(+), 81 deletions(-) delete mode 100644 public/favicon.ico delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28c..00000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index d2f84222..00000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/app/LoginAndSignup/LoginField.tsx b/src/app/LoginAndSignup/LoginField.tsx index d946761b..c9082dfd 100644 --- a/src/app/LoginAndSignup/LoginField.tsx +++ b/src/app/LoginAndSignup/LoginField.tsx @@ -2,22 +2,23 @@ import React, { useState } from 'react' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' import styled from 'styled-components' +import Image from 'next/image' -const PlaceholderWrapper = styled.div` - height: 3.75rem; -` const Field = styled.span` display: inline-block; - margin-bottom: 1rem; + margin-bottom: 1.6rem; + @media (max-width: 743px) { + margin-bottom: 0.8rem; + } ` interface InputProps { $isError?: boolean } const Input = styled.input` width: 100%; - padding: 1rem 1.5rem; - border: none; - border-radius: 12px; + padding: 1.5rem 2.4rem; + + border-radius: 1.2rem; ${(props) => textStyle(16, 400)(props)} color: ${theme.colors.SecondaryGray[800]}; background-color: ${theme.colors.SecondaryGray[100]}; @@ -33,20 +34,24 @@ const Input = styled.input` ` const InputWrapper = styled.label` width: 100%; - height: 6.125rem; - margin-bottom: 3rem; + height: 9.8rem; + margin-bottom: 2.4rem; ${(props) => textStyle(18, 700)(props)} color: ${theme.colors.SecondaryGray[800]}; + @media (max-width: 743px) { + ${(props) => textStyle(14, 700)(props)} + height: 8.8rem; + } ` -const Icon = styled.img` +const IconWrapper = styled.div` width: 24px; height: 24px; position: relative; left: 594px; top: -41px; cursor: pointer; - @media (max-width: 375px) { + @media (max-width: 743px) { left: 302px; } ` @@ -54,6 +59,8 @@ const ErrorMessage = styled.div` color: ${theme.colors.error}; ${(props) => textStyle(14, 600)(props)} margin: 0.5rem 1rem; + top: -28px; + position: relative; ` interface LoginFieldtProps { label: string @@ -92,7 +99,7 @@ const LoginField = ({ <> {label} - + <> {icon && ( - + + {`${label} + )} - + {error && {error}} diff --git a/src/app/additem/page.tsx b/src/app/additem/page.tsx index ee137323..af5288e7 100644 --- a/src/app/additem/page.tsx +++ b/src/app/additem/page.tsx @@ -1,14 +1,14 @@ 'use client' import React, { useState } from 'react' -import Button from '../../common/Button' -import ButtonImage from '../../common/ButtonImage' -import TextInputPlaceholder from '../../common/TextInputPlaceholder' -import Tag from '../../common/Tag' +import Button from '../common/Button' +import ButtonImage from '../common/ButtonImage' +import TextInputPlaceholder from '../common/TextInputPlaceholder' +import Tag from '../common/Tag' import styled from 'styled-components' -import { theme } from '../../styles/theme' -import { textStyle } from '../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' const AddItem = () => { const [productName, setProductName] = useState('') diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 847ff0d6..e53eff7b 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -23,58 +23,94 @@ const Bone = styled.div` align-items: center; justify-content: center; flex-direction: column; - width: 40rem; - margin: 14.438rem auto auto auto; - @media (max-width: 744px) { - margin: 11.875rem auto auto auto; + width: 64rem; + margin: 23.1rem auto auto auto; + @media (max-width: 1023px) { + margin: 19rem auto auto auto; } - @media (max-width: 375px) { - margin: 5rem 1rem auto 1rem; - width: 21.437rem; + @media (max-width: 743px) { + margin: 8rem auto auto auto; + width: 34.3rem; } ` - const LogoContainer = styled.div` - width: 24.75rem; - height: 8.25rem; display: flex; align-items: center; justify-content: space-between; - margin-bottom: 2.5rem; - @media (max-width: 375px) { - width: 12.375rem; - height: 4.125rem; - margin-bottom: 1.5rem; + margin-bottom: 4rem; + @media (max-width: 743px) { + width: 19.8rem; + height: 6.6rem; + margin-bottom: 2.4rem; + } +` +const LogoPanda = styled.div` + img { + width: 10.3rem; + height: 10.3rem; + margin-right: 2.2rem; + display: flex; + } + @media (max-width: 743px) { + img { + width: 5.1rem; + height: 5.1rem; + margin-right: 1.1rem; + display: flex; + } + } +` +const LogoPandaText = styled.div` + img { + width: 26.6rem; + height: 9rem; + display: flex; + align-items: center; + } + @media (max-width: 743px) { + img { + width: 13.3rem; + height: 4.5rem; + } } ` const ButtonWrapper = styled.div` - margin-bottom: 3rem; + margin-bottom: 2.4rem; width: 100%; ` +const LoginButton = styled(Button)` + padding: 1.2rem 29.4rem; + width: max-content; + @media (max-width: 743px) { + padding: 1.2rem 14.5rem; + } +` const SimpleLoginWrapper = styled.div` - height: 4.625rem; + height: fit-content; width: 100%; display: flex; align-items: center; justify-content: space-between; background-color: #e6f2ff; - padding: 1rem 1.438rem; - margin-bottom: 3rem; + padding: 1.6rem 2.3rem; + margin-bottom: 2.4rem; ` - const SimpleLogin = styled.div` ${(props) => textStyle(16, 500)(props)} color: ${theme.colors.SecondaryGray[800]}; ` const ImageWrapper = styled.div` - height: 2.625rem; - width: 6.25rem; + height: 4.2rem; + width: 10rem; display: flex; - justify-content: space-between; + gap: 1.6rem; + flex-direction: row; + align-items: center; img { - width: 2.625rem; - height: 2.625rem; + width: 4.2rem; + height: 4.2rem; + display: flex; } ` const FooterContainer = styled.div` @@ -118,6 +154,7 @@ const Login = () => { return '' } + const handleLogin = () => { const emailValidation = validateEmail(email) const passwordValidation = validatePassword(password) @@ -135,12 +172,16 @@ const Login = () => { return ( - - 판다마켓 로고 사진 - - - 판다마켓 로고 사진 - + + + 판다마켓 로고 사진 + + + + + 판다마켓 로고 사진 + + { error={passwordError} /> - + 간편 로그인하기 diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx index 07be307f..3ce46293 100644 --- a/src/app/signup/page.tsx +++ b/src/app/signup/page.tsx @@ -1,10 +1,9 @@ 'use client' import React, { useState, useEffect } from 'react' -import { Link, useNavigate } from 'react-router-dom' import Image from 'next/image' -import LoginField from './LoginField' +import LoginField from '../LoginAndSignup/LoginField' import Button from '../common/Button' import Logo from '../../../public/assets/image/Logo.png' @@ -14,9 +13,10 @@ import Kakao from '../../../public/assets/svg/Kakao.svg' import VisibillityOff from '../../../public/assets/svg/btn_visibillity_off.svg' import Visibillity from '../../../public/assets/svg/btn_visibillity.svg' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' import styled from 'styled-components' +import Link from 'next/link' const Bone = styled.div` display: flex; @@ -44,23 +44,7 @@ const LogoContainer = styled.div` margin-bottom: 1.5rem; } ` -// const LogoFaceImage = styled.img` -// width: 6.438rem; -// height: 6.438rem; -// @media (max-width: 375px) { -// margin: auto 11px auto 0; -// width: 3.187rem; -// height: 3.187rem; -// } -// ` -// const LogoImage = styled.img` -// width: 16.625rem; -// height: 5rem; -// @media (max-width: 375px) { -// width: 8.313rem; -// height: 2.813rem; -// } -// ` + const ButtonWrapper = styled.div` margin-bottom: 1.5rem; width: 100%; @@ -104,7 +88,6 @@ const Register = styled.div` ` const Signup = () => { - const navigate = useNavigate() const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [passwordConfirm, setPasswordConfirm] = useState('') @@ -155,7 +138,6 @@ const Signup = () => { setPasswordError(passwordValidation) setPasswordConfirmError(passwordConfirmValidation) if (!emailValidation && !passwordValidation && !passwordValidation) { - navigate(`/items`) } } @@ -167,10 +149,10 @@ const Signup = () => { return ( - + 판다마켓 로고 사진 - + 판다마켓 로고 사진 @@ -240,7 +222,7 @@ const Signup = () => { 이미 회원이신가요?   - + 로그인 From d09f1c19f8b2a896fc465167be0586799d549ab0 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Thu, 15 May 2025 22:00:42 +0900 Subject: [PATCH 06/12] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8/=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=EA=B0=80=EC=9E=85=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 1 + package-lock.json | 149 +++++++++++++++++++----- package.json | 1 + src/app/Items/BestItems.tsx | 27 +---- src/app/Items/RecentItems.tsx | 6 +- src/app/Items/{Items.tsx => page.tsx} | 37 ++---- src/app/LoginAndSignup/LoginField.tsx | 21 ++-- src/app/api/client/requestor.tsx | 16 +-- src/app/api/services/commentService.tsx | 11 +- src/app/api/services/productService.tsx | 3 +- src/app/common/DropDown.tsx | 61 +++++----- src/app/login/page.tsx | 4 +- src/app/signup/page.tsx | 117 +++++++++++++------ 13 files changed, 287 insertions(+), 167 deletions(-) create mode 100644 .env rename src/app/Items/{Items.tsx => page.tsx} (88%) diff --git a/.env b/.env new file mode 100644 index 00000000..a8f20aeb --- /dev/null +++ b/.env @@ -0,0 +1 @@ +VITE_API_ENDPOINT=https://panda-market-api.vercel.app/ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index cdab536f..784a89f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "dependencies": { "@types/styled-components": "^5.1.34", + "axios": "^1.9.0", "next": "15.3.0", "react": "^19.0.0", "react-dom": "^19.0.0", @@ -1753,6 +1754,12 @@ "node": ">= 0.4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -1779,6 +1786,17 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -1827,12 +1845,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1882,7 +1901,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2012,6 +2030,18 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2236,6 +2266,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2273,7 +2312,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2378,7 +2416,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2388,7 +2425,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2426,7 +2462,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2439,7 +2474,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3109,10 +3143,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3175,6 +3210,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -3191,6 +3246,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -3215,7 +3306,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3254,7 +3344,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3279,7 +3368,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -3366,7 +3454,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3433,7 +3520,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3446,7 +3532,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -3462,7 +3547,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3801,6 +3885,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4152,7 +4237,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4191,12 +4275,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -4256,15 +4341,16 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4731,6 +4817,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5699,6 +5791,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, diff --git a/package.json b/package.json index 562bddf2..1ea366c9 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@types/styled-components": "^5.1.34", + "axios": "^1.9.0", "next": "15.3.0", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/src/app/Items/BestItems.tsx b/src/app/Items/BestItems.tsx index 844bbbd6..a7b60cc3 100644 --- a/src/app/Items/BestItems.tsx +++ b/src/app/Items/BestItems.tsx @@ -1,34 +1,15 @@ 'use client' import React, { useEffect, useState } from 'react' -import { Link } from 'react-router-dom' +import Link from 'next/link' -import { GetProductType } from '../../../types/product' +import { GetProductType } from '../types/product' import HeartInactive from '../../../public/assets/image/HeartInactive.png' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' import styled from 'styled-components' -// interface Product { -// id: number -// name: string -// description: string -// price: number -// tags: string[] -// images: string[] -// favoriteCount: number -// ownerId: number -// createdAt: string -// updatedAt: string -// } -// interface ProductsProps { -// products: { -// list: Product[] -// totalCount: number -// } -// } - const BestItems = ({ products }: GetProductType) => { const [itemsDisplay, setItemsDisplay] = useState(1) const list = products.list || [] diff --git a/src/app/Items/RecentItems.tsx b/src/app/Items/RecentItems.tsx index a141f52b..eed70f81 100644 --- a/src/app/Items/RecentItems.tsx +++ b/src/app/Items/RecentItems.tsx @@ -3,14 +3,14 @@ import React, { useEffect, useState } from 'react' import { Link } from 'react-router-dom' -import { GetProductIdTypes } from '../../../types/product' +import { GetProductIdTypes } from '../types/product' import HeartInactive from '../../../public/assets/image/HeartInactive.png' import NoImage from '../../../public/assets/image/NoImage.png' import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' const RecentItems = ({ products }: { products: GetProductIdTypes[] }) => { const [itemsDisplay, setItemsDisplay] = useState(1) diff --git a/src/app/Items/Items.tsx b/src/app/Items/page.tsx similarity index 88% rename from src/app/Items/Items.tsx rename to src/app/Items/page.tsx index 4941755f..eb120fe9 100644 --- a/src/app/Items/Items.tsx +++ b/src/app/Items/page.tsx @@ -1,13 +1,12 @@ 'use client' import React, { useEffect, useState } from 'react' -import { useNavigate, useLocation } from 'react-router-dom' -import { GetProductIdTypes } from '../../../types/product' +import { GetProductIdTypes } from '../types/product' import BestItems from './BestItems' import RecentItems from './RecentItems' import DropDown from '../common/DropDown' -import productService from '../../app/api/services/productService' +import productService from '../api/services/productService' import Button from '../common/Button' import Search from '../../../public/assets/svg/Search.svg' @@ -15,8 +14,8 @@ import ArrowLeft from '../../../public/assets/svg/ArrowLeft.svg' import ArrowRight from '../../../public/assets/svg/ArrowRight.svg' import styled, { css } from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' type SelectOption = { value: string @@ -24,9 +23,6 @@ type SelectOption = { } const Items = () => { - const navigate = useNavigate() - const location = useLocation() // location을 써서 url 주소를 가져와 선택된 옵션에 맞게 변경경 - const [bestProducts, setBestProducts] = useState([]) const [sortedProducts, setSortedProducts] = useState([]) const [totalItems, setTotalItems] = useState(0) // 전체 상품 개수 저장 @@ -40,21 +36,17 @@ const Items = () => { const [currentPage, setCurrentPage] = useState(1) useEffect(() => { - const queryParams = new URLSearchParams(location.search) + const queryParams = new URLSearchParams() const orderBy = queryParams.get('orderBy') ?? 'recent' const page = parseInt(queryParams.get('page') ?? '1', 10) setSelectedOption(orderBy) setCurrentPage(page) - }, [location.search]) + }, []) - const updateURL = (orderBy: string, page: number) => { - navigate(`?orderBy=${orderBy}&page=${page}`) - } + const updateURL = (orderBy: string, page: number) => {} - const handleAdditem = () => { - navigate(`/additem`) - } + const handleAdditem = () => {} // BestItems 데이터 불러오기, bestProducts useEffect(() => { productService.getProduct(1, 10, 'favorite', '').then((response) => { @@ -125,12 +117,7 @@ const Items = () => { - @@ -177,7 +164,7 @@ export default Items const Bone = styled.div` width: 75rem; margin: 1.5rem auto; - @media (max-width: 1199px) { + @media (max-width: 1024px) { width: 43.5rem; margin: 1.5rem 1.5rem 2.5rem 1.5rem; } @@ -237,7 +224,7 @@ const NavSearch = styled.input` background-color: ${theme.colors.SecondaryGray[100]}; border: none; margin-right: 1.3333rem; - @media (max-width: 1199px) { + @media (max-width: 1024px) { width: 15.125rem; padding: 9px 24px 9px 44px; } @@ -274,7 +261,7 @@ const Pagenation = styled.div` align-items: center; justify-content: space-between; margin: 2.688rem auto 0 auto; - @media (max-width: 1199px) { + @media (max-width: 1024px) { margin: 2.5rem auto 0 auto; } ` diff --git a/src/app/LoginAndSignup/LoginField.tsx b/src/app/LoginAndSignup/LoginField.tsx index c9082dfd..911ace5c 100644 --- a/src/app/LoginAndSignup/LoginField.tsx +++ b/src/app/LoginAndSignup/LoginField.tsx @@ -55,12 +55,15 @@ const IconWrapper = styled.div` left: 302px; } ` +const ErrorPosition = styled.div` + position: relative; +` const ErrorMessage = styled.div` color: ${theme.colors.error}; ${(props) => textStyle(14, 600)(props)} - margin: 0.5rem 1rem; + margin: 0.5rem; top: -28px; - position: relative; + position: absolute; ` interface LoginFieldtProps { label: string @@ -110,18 +113,22 @@ const LoginField = ({ onBlur={handleBlur} $isError={!!error} /> - {icon && ( - + + {icon ? ( {`${label} - - )} + ) : ( +
    + )} + - {error && {error}} + + {error && {error}} + ) diff --git a/src/app/api/client/requestor.tsx b/src/app/api/client/requestor.tsx index 6c02b5b1..6eb63282 100644 --- a/src/app/api/client/requestor.tsx +++ b/src/app/api/client/requestor.tsx @@ -1,12 +1,8 @@ -// import axios from 'axios' +import axios from 'axios' -// const requestor = axios.create({ -// baseURL: import.meta.env.VITE_API_ENDPOINT.trim(), -// timeout: 60000, -// headers: { -// 'Content-Type': 'application/json', -// Accept: 'application/json', -// }, -// }) +const requestor = axios.create({ + baseURL: process.env.NEXT_PUBLIC_API_ENDPOINT, + withCredentials: true, +}) -// export default requestor +export default requestor diff --git a/src/app/api/services/commentService.tsx b/src/app/api/services/commentService.tsx index 02a7c8f8..c92ae30c 100644 --- a/src/app/api/services/commentService.tsx +++ b/src/app/api/services/commentService.tsx @@ -1,11 +1,14 @@ import requestor from '../client/requestor' +import { AxiosResponse } from 'axios' -import { Comment } from '../../types/comment' -import { Axios, AxiosResponse } from 'axios' +import { PostCommentType, GetCommentType } from '../../types/comment' class CommentService { // 틀릴 수도 - postProductComment(productId, body) { + postProductComment( + productId: number, + body: Omit + ): Promise> { const requestBody = { ...body, productId: productId, @@ -17,7 +20,7 @@ class CommentService { productId: number, limit: number, cursor?: number - ): Promise> { + ): Promise> { let url = `/products/${productId}/comments?limit=${limit}` if (cursor) { diff --git a/src/app/api/services/productService.tsx b/src/app/api/services/productService.tsx index 248926cc..ea0e05bc 100644 --- a/src/app/api/services/productService.tsx +++ b/src/app/api/services/productService.tsx @@ -1,5 +1,6 @@ -import { Axios, AxiosResponse } from 'axios' import requestor from '../client/requestor' +import { AxiosResponse } from 'axios' + import { GetProductIdTypes } from '../../types/product' class ProductService { diff --git a/src/app/common/DropDown.tsx b/src/app/common/DropDown.tsx index 43eaeb21..ad271d20 100644 --- a/src/app/common/DropDown.tsx +++ b/src/app/common/DropDown.tsx @@ -2,8 +2,8 @@ import React, { useRef, useState, useEffect } from 'react' import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' -import ArrowDown from '../../public/assets/image/ArrowDown.png' -import Sort from '../../public/assets/svg/Sort.svg' +import ArrowDown from '../../../public/assets/image/ArrowDown.png' +import Sort from '../../../public/assets/svg/Sort.svg' type OptionType = { name: string @@ -19,7 +19,6 @@ type DropDownProps = { const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { const [isOpen, setIsOpen] = useState(false) const selectRef = useRef(null) - const [windowWidth, setWindowWidth] = useState(window.innerWidth) const toggleDropdown = () => { setIsOpen(!isOpen) @@ -30,36 +29,35 @@ const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { setIsOpen(false) } - useEffect(() => { - const handleResize = () => { - setWindowWidth(window.innerWidth) - } + // useEffect(() => { + // const handleResize = () => {} - window.addEventListener('resize', handleResize) // resize: 창 크기가 변경될 때 발생하는 이벤트 / handleResize: 이벤트가 발생할 때 실행할 함수 - return () => window.removeEventListener('resize', handleResize) - }, []) + // window.addEventListener('resize', handleResize) // resize: 창 크기가 변경될 때 발생하는 이벤트 / handleResize: 이벤트가 발생할 때 실행할 함수 + // return () => window.removeEventListener('resize', handleResize) + // }, []) return ( -
    - - {window.innerWidth <= 743 ? ( - - ) : ( - selectList.find((item) => item.value === selected)?.name - )} - - + <> + //
    + // + // {window.innerWidth <= 743 ? ( + // + // ) : ( + // selectList.find((item) => item.value === selected)?.name + // )} + // + // - {isOpen && ( - - {selectList.map((item) => ( - - ))} - - )} -
    + // {isOpen && ( + // + // {selectList.map((item) => ( + // + // ))} + // + // )} + //
    ) } @@ -94,12 +92,15 @@ const SortImage = styled.img` height: 24px; } ` -const ArrowDownImage = styled.img<{ isOpen: boolean }>` +const ArrowDownImage = styled.img.withConfig({ + shouldForwardProp: (prop) => prop !== 'isOpen', +})<{ isOpen: boolean }>` width: 1.5rem; height: 1.5rem; cursor: pointer; transition: transform 0.3s ease; transform: ${({ isOpen }) => (isOpen ? 'rotate(180deg)' : 'rotate(0deg)')}; + @media (max-width: 743px) { width: 0; height: 0; diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index e53eff7b..832f6600 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react' import Link from 'next/link' +import { useRouter } from 'next/navigation' import LoginField from '../LoginAndSignup/LoginField' import Button from '../common/Button' @@ -133,7 +134,7 @@ const Login = () => { const [passwordError, setPasswordError] = useState('') const [showPassword, setShowPassword] = useState(false) const [isState, setIsState] = useState(false) - + const router = useRouter() const togglePasswordVisibility = () => { setShowPassword((prev) => !prev) } @@ -163,6 +164,7 @@ const Login = () => { setPasswordError(passwordValidation) if (!emailValidation && !passwordValidation) { + router.push('/items') } } useEffect(() => { diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx index 3ce46293..9b77178b 100644 --- a/src/app/signup/page.tsx +++ b/src/app/signup/page.tsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react' import Image from 'next/image' +import { useRouter } from 'next/navigation' import LoginField from '../LoginAndSignup/LoginField' import Button from '../common/Button' @@ -23,55 +24,93 @@ const Bone = styled.div` align-items: center; justify-content: center; flex-direction: column; - width: 40rem; - margin: 3.75rem auto auto auto; - @media (max-width: 375px) { - margin: 5rem 1rem auto 1rem; - width: 21.437rem; + width: 64rem; + margin: 23.1rem auto auto auto; + @media (max-width: 1023px) { + margin: 19rem auto auto auto; + } + @media (max-width: 743px) { + margin: 8rem auto auto auto; + width: 34.3rem; } ` - const LogoContainer = styled.div` - width: 24.75rem; - height: 8.25rem; display: flex; align-items: center; justify-content: space-between; - margin-bottom: 2.5rem; - @media (max-width: 375px) { - width: 12.375rem; - height: 4.125rem; - margin-bottom: 1.5rem; + margin-bottom: 4rem; + @media (max-width: 743px) { + width: 19.8rem; + height: 6.6rem; + margin-bottom: 2.4rem; + } +` +const LogoPanda = styled.div` + img { + width: 10.3rem; + height: 10.3rem; + margin-right: 2.2rem; + display: flex; + } + @media (max-width: 743px) { + img { + width: 5.1rem; + height: 5.1rem; + margin-right: 1.1rem; + display: flex; + } + } +` +const LogoPandaText = styled.div` + img { + width: 26.6rem; + height: 9rem; + display: flex; + align-items: center; + } + @media (max-width: 743px) { + img { + width: 13.3rem; + height: 4.5rem; + } } ` - const ButtonWrapper = styled.div` - margin-bottom: 1.5rem; + margin-bottom: 2.4rem; width: 100%; ` +const SignupButton = styled(Button)` + padding: 1.2rem 28.5rem; + width: max-content; + @media (max-width: 743px) { + padding: 1.2rem 13.6rem; + } +` const SimpleLoginWrapper = styled.div` - height: 4.625rem; + height: fit-content; width: 100%; display: flex; align-items: center; justify-content: space-between; background-color: #e6f2ff; - padding: 1rem 1.438rem; - margin-bottom: 1.5rem; + padding: 1.6rem 2.3rem; + margin-bottom: 2.4rem; ` - const SimpleLogin = styled.div` ${(props) => textStyle(16, 500)(props)} color: ${theme.colors.SecondaryGray[800]}; ` const ImageWrapper = styled.div` - height: 2.625rem; - width: 6.25rem; + height: 4.2rem; + width: 10rem; display: flex; - justify-content: space-between; + gap: 1.6rem; + flex-direction: row; + align-items: center; img { - width: 2.625rem; - height: 2.625rem; + width: 4.2rem; + height: 4.2rem; + display: flex; } ` const FooterContainer = styled.div` @@ -100,7 +139,7 @@ const Signup = () => { password: false, confirmPassword: false, }) - + const router = useRouter() const togglePasswordVisibility = (field: keyof typeof passwordVisibility) => { setPasswordVisibility((prev) => ({ ...prev, @@ -138,6 +177,7 @@ const Signup = () => { setPasswordError(passwordValidation) setPasswordConfirmError(passwordConfirmValidation) if (!emailValidation && !passwordValidation && !passwordValidation) { + router.push('/login') } } @@ -149,12 +189,16 @@ const Signup = () => { return ( - - 판다마켓 로고 사진 - - - 판다마켓 로고 사진 - + + + 판다마켓 로고 사진 + + + + + 판다마켓 로고 사진 + + { placeholder="닉네임을 입력해주세요" id="name" value={name} + onChange={(e) => { + setName(e.target.value) + }} > { error={passwordConfirmError} /> - + 간편 로그인하기 - 구글 로고 사진 + 구글 로고 사진 - 카카오 로고 사진 + 카카오 로고 사진 From 5f827f676bc111a5b02fe7072cdce22920d2e1a3 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Fri, 16 May 2025 19:59:23 +0900 Subject: [PATCH 07/12] =?UTF-8?q?chore:=20=EC=8A=A4=ED=94=84=EB=A6=B0?= =?UTF-8?q?=ED=8A=B8=20=EB=AF=B8=EC=85=98=209=20=EC=A0=84=20=EB=84=A5?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- next.config.ts | 12 +- src/app/Home/page.style.ts | 4 +- src/app/Home/page.tsx | 48 ++----- src/app/Items/BestItems.tsx | 72 ++++++---- src/app/Items/RecentItems.tsx | 58 ++++---- .../[productId]}/ItemsDetailDescription.tsx | 113 +++++++-------- .../ItemsDetailQuestionArrary.tsx | 85 ++++++------ .../ItemsDetailQuestionTextarea.tsx | 122 ++++++++-------- .../[productId]/page.tsx} | 85 ++++++------ src/app/Items/page.tsx | 131 +++++++++++------- src/app/additem/page.tsx | 34 ++--- src/app/api/client/interceptors.tsx | 30 ++-- src/app/api/client/requestor.tsx | 1 - src/app/api/services/commentService.tsx | 20 ++- src/app/api/services/productService.tsx | 27 ++-- src/app/common/Button.tsx | 28 ++-- src/app/common/ButtonImage.tsx | 88 +++++++----- src/app/common/DropDown.tsx | 97 +++++++------ src/app/common/ItemsNavVar.tsx | 98 +++++++------ src/app/common/Tag.tsx | 31 ++--- src/app/hooks/useCommentService.tsx | 13 +- src/app/hooks/useProductService.tsx | 2 +- 23 files changed, 624 insertions(+), 577 deletions(-) rename src/app/{ItemsDetail => Items/[productId]}/ItemsDetailDescription.tsx (66%) rename src/app/{ItemsDetail => Items/[productId]}/ItemsDetailQuestionArrary.tsx (80%) rename src/app/{ItemsDetail => Items/[productId]}/ItemsDetailQuestionTextarea.tsx (72%) rename src/app/{ItemsDetail/ItemsDetail.tsx => Items/[productId]/page.tsx} (52%) diff --git a/.env b/.env index a8f20aeb..341d49d1 100644 --- a/.env +++ b/.env @@ -1 +1 @@ -VITE_API_ENDPOINT=https://panda-market-api.vercel.app/ \ No newline at end of file +NEXT_PUBLIC_API_ENDPOINT=https://panda-market-api.vercel.app \ No newline at end of file diff --git a/next.config.ts b/next.config.ts index 0bcedd13..e0bb3e07 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,14 +2,20 @@ import type { NextConfig } from 'next' const nextConfig: NextConfig = { reactStrictMode: true, - // 추가적인 설정들 webpack(config, { isServer }) { - // 예시로 웹팩 설정 if (!isServer) { - config.resolve.fallback = { fs: false } // 예시 설정 + config.resolve.fallback = { fs: false } } return config }, + async rewrites() { + return [ + { + source: '/api/proxy/:path*', + destination: 'https://panda-market-api.vercel.app/:path*', + }, + ] + }, } export default nextConfig diff --git a/src/app/Home/page.style.ts b/src/app/Home/page.style.ts index cb4b9b27..04c6fcd8 100644 --- a/src/app/Home/page.style.ts +++ b/src/app/Home/page.style.ts @@ -1,6 +1,6 @@ import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' export const HeaderTop = styled.header` display: flex; diff --git a/src/app/Home/page.tsx b/src/app/Home/page.tsx index 4d89385d..a3690225 100644 --- a/src/app/Home/page.tsx +++ b/src/app/Home/page.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { useEffect, useState } from 'react' -import { Link } from 'react-router-dom' +import React from 'react' +import Link from 'next/link' import * as S from './page.style' import Button from '../common/Button' @@ -19,46 +19,20 @@ import Youtube from '../../../public/ assets/svg/youtube.svg' import Image from 'next/image' function Home() { - const [buttonStyle, setButtonStyle] = useState({ - width: 364, - paddingWidth: 43, - }) - - const handleResize = () => { - if (window.innerWidth < 375) { - setButtonStyle({ width: 258, paddingWidth: 71 }) - } else { - setButtonStyle({ width: 364, paddingWidth: 124 }) - } - } - - // placeholder useEffect 적용 - useEffect(() => { - handleResize() - window.addEventListener('resize', handleResize) - return () => window.removeEventListener('resize', handleResize) - }, []) - return ( <> - + 판다마켓 로고 사진 - + 판다마켓 로고 사진 - @@ -71,13 +45,7 @@ function Home() { 일상의 모든 물건을 거래해 보세요 - @@ -163,10 +131,10 @@ function Home() { ©codeit - 2024 - + Privacy Policy - + FAQ diff --git a/src/app/Items/BestItems.tsx b/src/app/Items/BestItems.tsx index a7b60cc3..6db2f4bd 100644 --- a/src/app/Items/BestItems.tsx +++ b/src/app/Items/BestItems.tsx @@ -2,23 +2,28 @@ import React, { useEffect, useState } from 'react' import Link from 'next/link' -import { GetProductType } from '../types/product' +import { GetProductIdTypes } from '../types/product' import HeartInactive from '../../../public/assets/image/HeartInactive.png' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' import styled from 'styled-components' +import Image from 'next/image' -const BestItems = ({ products }: GetProductType) => { +interface BestItemsProps { + products: GetProductIdTypes[] +} + +const BestItems = ({ products }: BestItemsProps) => { const [itemsDisplay, setItemsDisplay] = useState(1) - const list = products.list || [] + const list = products || [] console.log(products) useEffect(() => { const handleReasize = () => { if (window.innerWidth <= 743) { setItemsDisplay(1) - } else if (window.innerWidth <= 1199) { + } else if (window.innerWidth <= 1023) { setItemsDisplay(2) } else { setItemsDisplay(4) @@ -36,17 +41,13 @@ const BestItems = ({ products }: GetProductType) => { {list.slice(0, itemsDisplay).map((product) => ( - + 0 ? product.images[0] - : product.images + : '' } alt={product.name} /> @@ -56,7 +57,7 @@ const BestItems = ({ products }: GetProductType) => { {product.price.toLocaleString('ko-KR')}원 - + HeartInactive {product.favoriteCount} @@ -71,34 +72,46 @@ const BestItems = ({ products }: GetProductType) => { export default BestItems const Bone = styled.div` - height: 26.625rem; + height: 42.6rem; width: auto; - margin-bottom: 2.5rem; - @media (max-width: 1199px) { - height: 27.125rem; + margin-bottom: 4rem; + @media (max-width: 1023px) { + height: 48.2rem; } @media (max-width: 743px) { - margin-bottom: 1.5rem; + margin-bottom: 2.4rem; } ` const Title = styled.div` ${(props) => textStyle(20, 700)(props)} color: ${theme.colors.SecondaryGray[900]}; - margin-bottom: 1rem; + margin-bottom: 1.6rem; ` const BestItem = styled.div` display: flex; - height: 23.625rem; - justify-content: center; + height: 37.8rem; flex-direction: column; cursor: pointer; + justify-content: space-between; + img { + width: 28.2rem; + height: 28.2rem; + border-radius: 1rem; + } + @media (max-width: 1023px) { + height: 43.4rem; + img { + width: 34.3rem; + height: 34.3rem; + } + } ` const BestItemImage = styled.img` width: 17.625rem; height: 17.625rem; border-radius: 1rem; - @media (max-width: 1199px) { + @media (max-width: 1023px) { height: 21.437rem; width: 100%; } @@ -107,18 +120,18 @@ const BestItemsDisplay = styled.div` display: flex; align-items: center; justify-content: space-between; - @media (max-width: 1199px) { + @media (max-width: 1023px) { gap: 10px; } ` const ProductDescription = styled.div` width: 100%; - height: 5rem; - margin-top: 1rem; + height: 8rem; + margin-top: 1.6rem; display: flex; flex-direction: column; justify-content: space-between; - @media (max-width: 1199px) { + @media (max-width: 1023px) { margin-top: 0.625rem; } ` @@ -135,8 +148,9 @@ const ProductFavoriteCount = styled.div` color: ${theme.colors.SecondaryGray[600]}; display: flex; align-items: center; -` -const HeartInactiveImage = styled.img` - width: 1rem; - height: 1rem; + gap: 0.4rem; + img { + width: 1.6rem; + height: 1.6rem; + } ` diff --git a/src/app/Items/RecentItems.tsx b/src/app/Items/RecentItems.tsx index eed70f81..87584928 100644 --- a/src/app/Items/RecentItems.tsx +++ b/src/app/Items/RecentItems.tsx @@ -1,7 +1,8 @@ 'use client' import React, { useEffect, useState } from 'react' -import { Link } from 'react-router-dom' +import Link from 'next/link' +import Image from 'next/image' import { GetProductIdTypes } from '../types/product' @@ -19,7 +20,7 @@ const RecentItems = ({ products }: { products: GetProductIdTypes[] }) => { const handleReasize = () => { if (window.innerWidth <= 743) { setItemsDisplay(4) - } else if (window.innerWidth >= 744 && window.innerWidth <= 1199) { + } else if (window.innerWidth >= 744 && window.innerWidth <= 1023) { setItemsDisplay(6) } else { setItemsDisplay(10) @@ -35,18 +36,13 @@ const RecentItems = ({ products }: { products: GetProductIdTypes[] }) => { {products.slice(0, itemsDisplay).map((product) => ( - + 0 && - !product.images.includes('https://via.placeholder.com/300') + Array.isArray(product.images) && product.images.length > 0 ? product.images[0] - : NoImage + : NoImage.src } alt={product.name} /> @@ -56,10 +52,7 @@ const RecentItems = ({ products }: { products: GetProductIdTypes[] }) => { {product.price.toLocaleString('ko-KR')}원 - + HeartInactive {product.favoriteCount} @@ -75,20 +68,30 @@ const RecentItems = ({ products }: { products: GetProductIdTypes[] }) => { export default RecentItems const RecentItem = styled.div` - height: 42.125rem; + height: 67.4rem; @media (max-width: 743px) { - height: 35rem; + height: fit-content; } ` const RecentItemKey = styled.div` display: flex; - height: 19.813rem; - width: 13.8125rem; + height: 31.7rem; + width: 22.1rem; justify-content: center; flex-direction: column; + img { + width: 22.1rem; + height: 22.1rem; + border-radius: 1rem; + } @media (max-width: 743px) { - height: 16.5rem; - width: 10.5rem; + height: 26.4rem; + width: 16.8rem; + img { + width: 16.8rem; + height: 16.8rem; + border-radius: 1rem; + } } ` const RecentItemImage = styled.img` @@ -103,15 +106,15 @@ const RecentItemsDisplay = styled.div` flex-direction: row; flex-wrap: wrap; align-content: flex-start; - row-gap: 2.5rem; + row-gap: 4rem; @media (max-width: 743px) { row-gap: 2rem; } ` const ProductDescription = styled.div` width: 100%; - height: 5rem; - margin-top: 1rem; + height: 8rem; + margin-top: 1.6rem; display: flex; flex-direction: column; justify-content: space-between; @@ -129,8 +132,9 @@ const ProductFavoriteCount = styled.div` color: ${theme.colors.SecondaryGray[600]}; display: flex; align-items: center; -` -const HeartInactiveImage = styled.img` - width: 1rem; - height: 1rem; + gap: 0.4rem; + img { + width: 1.6rem; + height: 1.6rem; + } ` diff --git a/src/app/ItemsDetail/ItemsDetailDescription.tsx b/src/app/Items/[productId]/ItemsDetailDescription.tsx similarity index 66% rename from src/app/ItemsDetail/ItemsDetailDescription.tsx rename to src/app/Items/[productId]/ItemsDetailDescription.tsx index 86fca6f4..493220f4 100644 --- a/src/app/ItemsDetail/ItemsDetailDescription.tsx +++ b/src/app/Items/[productId]/ItemsDetailDescription.tsx @@ -1,46 +1,50 @@ +'use client' + import React from 'react' -import { useLocation } from 'react-router-dom' +import { useParams } from 'next/navigation' -import { useGetProductId } from '../../../hooks/useProductService' -import Tag from '../common/Tag' -import { formatDate } from '../../../utils/datetime' +import { useGetProductId } from '../../hooks/useProductService' +import Tag from '../../common/Tag' +import { formatDate } from '../../utils/datetime' -import Setting from '../../../public/assets/svg/Setting.svg' -import ProfileIcon from '../../../public/assets/svg/ProfileIcon.svg' -import HeartInactive from '../../../public/assets/image/HeartInactive.png' +import Setting from '../../../../public/assets/svg/Setting.svg' +import ProfileIcon from '../../../../public/assets/svg/ProfileIcon.svg' +import HeartInactive from '../../../../public/assets/image/HeartInactive.png' import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' import Image from 'next/image' const ItemsDetailDescription = () => { - const location = useLocation() // product 데어터 받기 - // useGetProductId 이용 - const product = location.state?.product - const productsId = useGetProductId(product.id) - if (!productsId) { + const params = useParams() + const productId = Number(params.productId) + + // 커스텀 훅으로 데이터 fetch + const product = useGetProductId(productId) + + if (!product) { return
    상품 정보를 불러오는 중입니다...
    } return ( - + - {productsId.name} + {product.name} 상품설정버튼 {product.price.toLocaleString()}원 상품 소개 - {productsId.description} + {product.description} 상품 태그 - {productsId.tags?.map((tag, index) => ( + {product.tags?.map((tag, index) => ( ))} @@ -49,13 +53,13 @@ const ItemsDetailDescription = () => { 프로필아이콘
    - {productsId.ownerNickname} - {formatDate(productsId.createdAt)} + {product.ownerNickname} + {formatDate(product.createdAt)}
    - -
    {productsId.favoriteCount}
    + 하트활성화/비활성화 +
    {product.favoriteCount}
    @@ -71,60 +75,61 @@ const Bone = styled.div` display: flex; align-items: center; justify-content: space-between; - padding-bottom: 2.5rem; + padding-bottom: 4rem; border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; - @media (max-width: 1199px) { + @media (max-width: 1023px) { align-items: flex-start; } @media (max-width: 743px) { flex-direction: column; + padding-bottom: 2.4rem; } ` const ProductImage = styled.img` - width: 30.375rem; - height: 30.375rem; + width: 48.6rem; + height: 48.6rem; border-radius: 1rem; - @media (max-width: 1199px) { - width: 21.25rem; - height: 21.25rem; + @media (max-width: 1023px) { + width: 34rem; + height: 34rem; } @media (max-width: 743px) { - width: 100%; - height: 21.4375rem; margin-bottom: 1rem; } ` const TitleDescription = styled.div` - width: 43.125rem; - height: 31rem; + width: 69rem; + height: 49.6rem; position: relative; - @media (max-width: 1199px) { - width: 21.25rem; - height: 30.25rem; + @media (max-width: 1023px) { + width: 34rem; + height: 48.4rem; } @media (max-width: 743px) { - height: 29.25rem; + height: 49.2rem; } ` const ProductTitleWrapper = styled.div` - height: 7rem; + height: 9.8rem; display: flex; justify-content: space-evenly; flex-direction: column; border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; @media (max-width: 743px) { - height: 5.125rem; + height: 6.6rem; + justify-content: flex-start; } ` const ProductTitle = styled.div` display: flex; justify-content: space-between; + align-items: center; cursor: pointer; ` const ProductName = styled.div` ${(props) => textStyle(24, 600)(props)} color: ${theme.colors.SecondaryGray[800]}; - @media (max-width: 1199px) { + @media (max-width: 1023px) { ${(props) => textStyle(20, 600)(props)} } @media (max-width: 743px) { @@ -134,7 +139,7 @@ const ProductName = styled.div` const ProductPrice = styled.div` ${(props) => textStyle(40, 600)(props)} color: ${theme.colors.SecondaryGray[800]}; - @media (max-width: 1199px) { + @media (max-width: 1023px) { ${(props) => textStyle(32, 600)(props)} } @media (max-width: 743px) { @@ -142,23 +147,20 @@ const ProductPrice = styled.div` } ` const ProductDescriptionWrapper = styled.div` - margin: 1.5rem 0; + margin: 2.4rem 0; height: auto; - @media (max-width: 743px) { - margin: 1rem 0 1.5rem; + @media (max-width: 1023px) { + margin: 1rem 0 2.3rem; } ` const ProductDescriptionText = styled.div` ${(props) => textStyle(16, 600)(props)} color: ${theme.colors.SecondaryGray[600]}; - height: 26px; + margin-bottom: 1rem; - @media (max-width: 1199px) { + @media (max-width: 1023px) { ${(props) => textStyle(14, 600)(props)} } - @media (max-width: 743px) { - margin: 0.5rem 0; - } ` const ProductDescription = styled.div` ${(props) => textStyle(16, 400)(props)} @@ -167,7 +169,7 @@ const ProductDescription = styled.div` const ProductTagWrapper = styled.div` ${(props) => textStyle(16, 400)(props)} color: ${theme.colors.SecondaryGray[600]}; - @media (max-width: 1199px) { + @media (max-width: 1023px) { ${(props) => textStyle(14, 600)(props)} } @media (max-width: 743px) { @@ -176,7 +178,7 @@ const ProductTagWrapper = styled.div` ` const ProductTag = styled.div` display: flex; - gap: 0.5rem; + gap: 0.8rem; flex-direction: row; flex-wrap: wrap; ` @@ -192,14 +194,15 @@ const ProductFooterLeft = styled.div` align-items: center; justify-content: center; display: flex; - gap: 1rem; + gap: 1.6rem; ` const ProductFooterRight = styled.div` display: flex; - gap: 4px; - padding: 4px 12px; + gap: 0.6rem; + align-items: center; + padding: 0.4rem 1.2rem; border: 1px solid ${theme.colors.SecondaryGray[200]}; - border-radius: 35px; + border-radius: 3.5rem; ` const OwnerNickname = styled.div` ${(props) => textStyle(14, 500)(props)} diff --git a/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx b/src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx similarity index 80% rename from src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx rename to src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx index 48723481..368947b3 100644 --- a/src/app/ItemsDetail/ItemsDetailQuestionArrary.tsx +++ b/src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx @@ -1,18 +1,20 @@ +'use client' + import React, { useState, useEffect, useRef } from 'react' +import Image from 'next/image' -import { PostCommentType } from '../../../types/comment' -import Button from '../common/Button' -import TextInputPlaceholder from '../common/TextInputPlaceholder' -import commentService from '../../../src/app/api/services/commentService' -import { diffDate } from '../../../utils/datetime' -import { formatDate } from '../../../utils/datetime' +import { PostCommentType } from '../../types/comment' +import Button from '../../common/Button' +import TextInputPlaceholder from '../../common/TextInputPlaceholder' +import commentService from '../../../../src/app/api/services/commentService' +import { diffDate } from '../../utils/datetime' +import { formatDate } from '../../utils/datetime' -import Setting from '../../../public/assets/svg/Setting.svg' -import ProfileIcon from '../../../public/assets/svg/ProfileIcon.svg' +import Setting from '../../../../public/assets/svg/Setting.svg' import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' interface ItemsDetailQuestionArraryProps { productQuestion: PostCommentType @@ -72,7 +74,7 @@ const ItemsDetailQuestionArrary = ({ {/*로그인을 하지 않아 토큰?전달이 되지 않은 상태*/} setUserComment(e.target.value)} @@ -82,14 +84,9 @@ const ItemsDetailQuestionArrary = ({ 취소 - + @@ -104,8 +101,12 @@ const ItemsDetailQuestionArrary = ({ {/*이미지가 없을 경우 기본 이미지 적용*/} 유저프로필사진 @@ -128,7 +129,7 @@ const ItemsDetailQuestionArrary = ({
    - textStyle(16, 600)(props)} @@ -181,24 +190,25 @@ const Bone = styled.div` display: flex; align-items: end; justify-content: space-between; - height: 92px; + height: 10rem; position: relative; - padding-bottom: 0.8rem; - margin-top: 1.5rem; -} + padding-bottom: 1.2rem; + + margin-top: 2.4rem; + @media (max-width: 1023px) { + margin-top: 0; + } ` const QuestionContent = styled.div` ${(props) => textStyle(14, 400)(props)} color: ${theme.colors.SecondaryGray[800]}; - margin-bottom: 1.5rem; + margin-bottom: 2.4rem; ` const UserProfileImageWrapper = styled.div` display: flex; gap: 0.5rem; img { - width: 32px; - height: 32px; border-radius: 50%; } ` @@ -218,24 +228,9 @@ const DiffDate = styled.div` const SettingButtonWrapper = styled.div` position: relative; top: -42px; -` -const SettingButton = styled.img` - width: auto; - height: auto; cursor: pointer; - transition: all 0.3s ease-in-out; - position: relative; - &:hover { - background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; - border-radius: 50%; - transform: scale(1.05); - } - &:active { - background: ${({ theme }) => theme.colors.PrimaryBlue[200]}; - border-radius: 50%; - transform: scale(0.95); - } ` + const SelectOption = styled.ul` position: absolute; top: 1.8rem; diff --git a/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx b/src/app/Items/[productId]/ItemsDetailQuestionTextarea.tsx similarity index 72% rename from src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx rename to src/app/Items/[productId]/ItemsDetailQuestionTextarea.tsx index 11dc509a..d01656b1 100644 --- a/src/app/ItemsDetail/ItemsDetailQuestionTextarea.tsx +++ b/src/app/Items/[productId]/ItemsDetailQuestionTextarea.tsx @@ -1,75 +1,37 @@ 'use client' + import React, { useEffect, useState } from 'react' -import { useLocation } from 'react-router-dom' +import { useParams } from 'next/navigation' +import Image from 'next/image' -import { useGetCommentService } from '../../../hooks/useCommentService' +import { useGetCommentService } from '../../hooks/useCommentService' import ItemsDetailQuestionArrary from './ItemsDetailQuestionArrary' -import TextInputPlaceholder from '../common/TextInputPlaceholder' -import Button from '../common/Button' -import InquiryEmpty from '../../../public/assets/svg/InquiryEmpty.svg' +import TextInputPlaceholder from '../../common/TextInputPlaceholder' +import Button from '../../common/Button' -import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' +import InquiryEmpty from '../../../../public/assets/svg/InquiryEmpty.svg' -const Bone = styled.div` - width: 75rem; - margin: 2.5rem auto 0; - @media (max-width: 1199px) { - width: 43.5rem; - } - @media (max-width: 743px) { - width: 21.5rem; - } -` -const ProductQuestionWrapper = styled.div` - margin: 2.5rem auto 1.5rem; - @media (max-width: 743px) { - margin: 2.5rem auto; - } -` -const ProductQuestionText = styled.div` - ${(props) => textStyle(16, 600)(props)} - color: ${theme.colors.SecondaryGray[900]}; - margin-bottom: 0.5625rem; -` -// state 값에 따라 버튼 효과 활성화 / 비활성화 -const ButtonWrapper = styled.div` - width: fit-content; - margin: 1rem 0 0 auto; -` -const ItemsQuestionWrapper = styled.div` - position: relative; - display: flex; - flex-direction: column; -` +import styled from 'styled-components' +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' -const InquiryEmptyWrapper = styled.div` - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; -` -const InquiryEmptyText = styled.div` - ${(props) => textStyle(16, 400)(props)} - color: ${theme.colors.SecondaryGray[400]}; - margin-top: 0.5rem; -` const ItemsDetailQuestionTextarea = () => { - const location = useLocation() // product 데어터 받기 + const params = useParams() // product 데어터 받기 const [isEditing, setIsEditing] = useState(false) const [questionText, setQuestionText] = useState('') const [textareaStyle, setTextareaStyle] = useState({ height: '84px', }) // useProductComments 훅 이용 - const product = location.state?.product - const productQuestion = useGetCommentService(product.id) + const productId = Number(params.productId) + // 커스텀 훅으로 데이터 fetch + const productQuestion = useGetCommentService(productId) + console.log(productQuestion) const handleResize = () => { - if (window.innerWidth < 375) { + if (window.innerWidth < 744) { setTextareaStyle({ height: '129px' }) - } else if (window.innerWidth < 744) { + } else if (window.innerWidth < 1024) { setTextareaStyle({ height: '84px' }) } } @@ -95,20 +57,18 @@ const ItemsDetailQuestionTextarea = () => { onChange={(e) => setQuestionText(e.target.value)} /> - + {productQuestion.list.length === 0 ? ( - 문의가 없습니다 + 문의가 없습니다 문의가 없습니다 ) : ( @@ -130,3 +90,45 @@ const ItemsDetailQuestionTextarea = () => { } export default ItemsDetailQuestionTextarea + +const Bone = styled.div`` +const ProductQuestionWrapper = styled.div` + margin: 4rem auto 2.4rem; + @media (max-width: 1023px) { + margin: 4rem auto; + } + @media (max-width: 743px) { + margin: 2.5rem auto; + } +` +const ProductQuestionText = styled.div` + ${(props) => textStyle(16, 600)(props)} + color: ${theme.colors.SecondaryGray[900]}; + margin-bottom: 0.9rem; +` + +const ButtonWrapper = styled.div` + width: fit-content; + margin: 1.6rem 0 0 auto; +` +const RegisterButton = styled(Button)` + padding: 0.8rem 2.3rem; + width: max-content; +` +const ItemsQuestionWrapper = styled.div` + position: relative; + display: flex; + flex-direction: column; +` + +const InquiryEmptyWrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +` +const InquiryEmptyText = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; + margin-top: 0.5rem; +` diff --git a/src/app/ItemsDetail/ItemsDetail.tsx b/src/app/Items/[productId]/page.tsx similarity index 52% rename from src/app/ItemsDetail/ItemsDetail.tsx rename to src/app/Items/[productId]/page.tsx index 7f85e5e4..cf04b23e 100644 --- a/src/app/ItemsDetail/ItemsDetail.tsx +++ b/src/app/Items/[productId]/page.tsx @@ -1,63 +1,35 @@ +'use client' + import React from 'react' -import { Link } from 'react-router-dom' +import ItemsNavVar from '@/app/common/ItemsNavVar' import ItemsDetailDescription from './ItemsDetailDescription' import ItemsDetailQuestionTextarea from './ItemsDetailQuestionTextarea' -import Button from '../common/Button' +import Button from '../../common/Button' -import BackIcon from '../../../public/assets/svg/BackIcon.svg' +import BackIcon from '../../../../public/assets/svg/BackIcon.svg' import styled from 'styled-components' -import { theme } from '../../../styles/theme' -import { textStyle } from '../../../styles/textStyle' - -const Bone = styled.div` - width: 75rem; - margin: 1.5rem auto 4rem; - - @media (max-width: 1199px) { - width: 43.5rem; - margin: 1.5rem 1.5rem 2.5rem 1.5rem; - } - @media (max-width: 743px) { - width: 21.437rem; - margin: 1rem; - } -` - -const ButtonWrapper = styled.div` - display: flex; - justify-content: center; - margin: 4.6875rem auto; - width: max-content; - ${(props) => textStyle(18, 600)(props)} - color: ${theme.colors.SecondaryGray[100]}; - @media (max-width: 1199px) { - margin: 3.5rem auto 10.4375rem auto; - } - @media (max-width: 743px) { - margin: 2.5rem auto 2.5rem auto; - } -` +import { theme } from '../../styles/theme' +import { textStyle } from '../../styles/textStyle' +import Image from 'next/image' const ItemsDetail = () => { return ( <> + - + @@ -65,3 +37,36 @@ const ItemsDetail = () => { } export default ItemsDetail + +const Bone = styled.div` + width: 120rem; + margin: 1.5rem auto 22.2rem; + + @media (max-width: 1023px) { + width: 69.6rem; + margin: 1.5rem auto 24.3rem auto; + } + @media (max-width: 743px) { + width: 34.4rem; + margin: 1rem auto 6.5rem auto; + } +` + +const ButtonWrapper = styled.div` + display: flex; + justify-content: center; + margin: 4.6875rem auto; + width: max-content; + ${(props) => textStyle(18, 600)(props)} + color: ${theme.colors.SecondaryGray[100]}; + @media (max-width: 1023px) { + margin: 3.5rem auto 10.4375rem auto; + } + @media (max-width: 743px) { + margin: 4rem auto 2.5rem auto; + } +` +const ListButton = styled(Button)` + padding: 1.1rem 3.9rem; + width: max-content; +` diff --git a/src/app/Items/page.tsx b/src/app/Items/page.tsx index eb120fe9..6b9a7053 100644 --- a/src/app/Items/page.tsx +++ b/src/app/Items/page.tsx @@ -1,8 +1,12 @@ 'use client' import React, { useEffect, useState } from 'react' +import Image from 'next/image' +import { useRouter } from 'next/navigation' import { GetProductIdTypes } from '../types/product' + +import ItemsNavVar from '../common/ItemsNavVar' import BestItems from './BestItems' import RecentItems from './RecentItems' import DropDown from '../common/DropDown' @@ -26,7 +30,7 @@ const Items = () => { const [bestProducts, setBestProducts] = useState([]) const [sortedProducts, setSortedProducts] = useState([]) const [totalItems, setTotalItems] = useState(0) // 전체 상품 개수 저장 - + const router = useRouter() const selectList: SelectOption[] = [ { value: 'recent', name: '최신순' }, { value: 'favorite', name: '좋아요순' }, @@ -44,16 +48,31 @@ const Items = () => { setCurrentPage(page) }, []) - const updateURL = (orderBy: string, page: number) => {} - - const handleAdditem = () => {} - // BestItems 데이터 불러오기, bestProducts + const handleAdditem = () => { + router.push('/additem') + } useEffect(() => { - productService.getProduct(1, 10, 'favorite', '').then((response) => { - setBestProducts(response.data) - }) + productService + .getProduct(1, 5, 'favorite', '') + .then((response) => { + const sorted = [...(response.data.list || [])].sort((a, b) => { + if (selectedOption === 'recent') { + return ( + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) // Date 쓸 때는 getTime을 써야 함함 + } else if (selectedOption === 'favorite') { + return b.favoriteCount - a.favoriteCount + } + return 0 + }) + console.log(sorted) + setBestProducts(sorted) + console.log('bestList:', sorted) + }) + .catch((error) => { + console.error('베스트 상품 불러오기 실패:', error) + }) }, []) - // 페이지네이션 useEffect(() => { productService @@ -93,7 +112,7 @@ const Items = () => { const handleNextPage = () => { setCurrentPage((prev) => { const nextPage = prev + 1 - updateURL(selectedOption, nextPage) + return nextPage }) } @@ -101,32 +120,34 @@ const Items = () => { const handlePrevPage = () => { setCurrentPage((prev) => { const prevPage = prev > 1 ? prev - 1 : 1 - updateURL(selectedOption, prevPage) + return prevPage }) } return ( <> + 전체상품 - + + 검색 아이콘 + - + { setSelectedOption(value) - updateURL(value, currentPage) }} /> @@ -136,7 +157,7 @@ const Items = () => { - + 왼쪽 페이지 화살표 {pages.map((page) => ( { $isActive={currentPage === page} onClick={() => { setCurrentPage(page) - updateURL(selectedOption, page) }} > {page} ))} - + 오른쪽 페이지 화살표 @@ -162,27 +182,26 @@ const Items = () => { export default Items const Bone = styled.div` - width: 75rem; - margin: 1.5rem auto; - @media (max-width: 1024px) { - width: 43.5rem; - margin: 1.5rem 1.5rem 2.5rem 1.5rem; + width: 120rem; + margin: 2.4rem auto; + @media (max-width: 1023px) { + width: 69.6rem; } @media (max-width: 743px) { - width: 21.437rem; - margin: 1rem; + width: 34.4rem; + margin: 1rem auto; } ` const NavVAr = styled.div` - height: 2.625rem; + height: 4.2rem; width: 100%; - margin: 1.5rem auto; + margin: 0 auto 2.4rem; display: flex; align-items: center; justify-content: space-between; @media (max-width: 743px) { flex-wrap: wrap; - margin: 1.5rem auto 4.5rem; + margin: 0 auto 6.6rem; } ` const NavTitle = styled.div` @@ -199,48 +218,57 @@ const NavRightWrapper = styled.div` height: 100%; display: flex; align-items: center; + position: relative; @media (max-width: 743px) { flex-wrap: wrap; } ` -const SearchIcon = styled.img` - width: 1.5rem; - height: 1.5rem; - position: relative; - right: -38px; +const SearchIcon = styled.div` + position: absolute; + right: 585px; + z-index: 10; + display: flex; + @media (max-width: 1023px) { + right: 412px; + } @media (max-width: 743px) { - left: 8px; - z-index: 1; - top: 10px; + right: 308px; + top: 28px; } ` +const RegisterButton = styled(Button)` + padding: 0.8rem 2.3rem; + width: max-content; +` const NavSearch = styled.input` - width: 20.313rem; + width: 32.5rem; height: 100%; - padding: 9px 107px 9px 44px; - border-radius: 12px; + padding: 0.9rem 10.7rem 0.9rem 4.4rem; + border-radius: 1.2rem; ${(props) => textStyle(16, 400)(props)} color: ${theme.colors.SecondaryGray[400]}; background-color: ${theme.colors.SecondaryGray[100]}; border: none; - margin-right: 1.3333rem; - @media (max-width: 1024px) { + margin-right: 1.2rem; + @media (max-width: 1023px) { width: 15.125rem; padding: 9px 24px 9px 44px; } @media (max-width: 743px) { position: relative; - left: -28px; - top: 10px; + top: 19px; + padding: 9px 40px 9px 44px; + width: max-content; + margin: 0; } ` const ButtonWrapper = styled.div` - margin-right: 1.3333rem; + margin-right: 1.2rem; @media (max-width: 743px) { - position: absolute; + position: relative; width: max-content; - top: 546px; - left: 226px; + top: -74px; + left: 206px; } button { transition: all 0.3s ease-in-out; @@ -254,14 +282,15 @@ const ButtonWrapper = styled.div` } } ` + const Pagenation = styled.div` - width: 19rem; - height: 2.5rem; + width: 30.4rem; + height: 4rem; display: flex; align-items: center; justify-content: space-between; - margin: 2.688rem auto 0 auto; - @media (max-width: 1024px) { + margin: 4.3rem auto 0 auto; + @media (max-width: 1023px) { margin: 2.5rem auto 0 auto; } ` diff --git a/src/app/additem/page.tsx b/src/app/additem/page.tsx index af5288e7..71412973 100644 --- a/src/app/additem/page.tsx +++ b/src/app/additem/page.tsx @@ -1,6 +1,7 @@ 'use client' import React, { useState } from 'react' +import ItemsNavVar from '../common/ItemsNavVar' import Button from '../common/Button' import ButtonImage from '../common/ButtonImage' import TextInputPlaceholder from '../common/TextInputPlaceholder' @@ -44,18 +45,14 @@ const AddItem = () => { return ( <> +
    싱품 등록하기 - +
    @@ -117,16 +114,18 @@ const AddItem = () => { export default AddItem const Bone = styled.div` - width: 75rem; + width: 120rem; display: flex; align-items: center; margin: 1.5rem auto auto auto; flex-direction: column; - @media (max-width: 1199px) { - width: 43.5rem; + @media (max-width: 1023px) { + width: 69.6rem; + margin-bottom: 7.8rem; } @media (max-width: 743px) { - width: 21.625rem; + width: 34.6rem; + margin-bottom: 7rem; } ` const Header = styled.div` @@ -134,7 +133,7 @@ const Header = styled.div` align-items: center; justify-content: space-between; width: 100%; - margin-bottom: 1.8125rem; + margin-bottom: 2.4rem; ` const ProductRegister = styled.div` ${(props) => textStyle(20, 700)(props)} @@ -143,21 +142,24 @@ const ProductRegister = styled.div` const ButtonWrapper = styled.div` width: max-content; ` +const RegisterButton = styled(Button)` + padding: 0.8rem 2.3rem; + width: max-content; +` const Main = styled.div` width: 100%; - margin-bottom: 78px; ` const DisplayWrapper = styled.div` width: 100%; - margin-bottom: 2rem; + margin-bottom: 3.2rem; @media (max-width: 743px) { - margin-bottom: 1.5rem; + margin-bottom: 2.4rem; } ` const ProductText = styled.div` ${(props) => textStyle(18, 700)(props)} color: ${theme.colors.SecondaryGray[800]}; - margin-bottom: 1rem; + margin-bottom: 1.6rem; ` const TagDisplay = styled.div` display: flex; diff --git a/src/app/api/client/interceptors.tsx b/src/app/api/client/interceptors.tsx index f9385f9f..283f37cf 100644 --- a/src/app/api/client/interceptors.tsx +++ b/src/app/api/client/interceptors.tsx @@ -1,16 +1,24 @@ -// import { AxiosRequestConfig } from 'axios' +import { AxiosRequestConfig } from 'axios' +// requestInterceptor.ts +export const requestInterceptor = ( + config: AxiosRequestConfig +): AxiosRequestConfig => { + if (typeof window !== 'undefined') { + // 클라이언트 환경인지 확인 + const token: string | null = localStorage.getItem('token') -// export const requestInterceptor = ( -// config: AxiosRequestConfig -// ): AxiosRequestConfig => { -// const token: string | null = localStorage.getItem('token') + const isAuthRequired = + config.url && + !(config.url.includes('/products') && !config.url.includes('/favorite')) -// if (token) { -// config.headers = config.headers || {} -// config.headers['Authorization'] = `Basic ${token}` -// } -// return config -// } + if (token && isAuthRequired) { + config.headers = config.headers || {} + config.headers['Authorization'] = `Basic ${token}` + } + } + + return config +} // 전 코드 // import { AxiosRequestConfig } from 'axios' diff --git a/src/app/api/client/requestor.tsx b/src/app/api/client/requestor.tsx index 6eb63282..1d63f2de 100644 --- a/src/app/api/client/requestor.tsx +++ b/src/app/api/client/requestor.tsx @@ -1,7 +1,6 @@ import axios from 'axios' const requestor = axios.create({ - baseURL: process.env.NEXT_PUBLIC_API_ENDPOINT, withCredentials: true, }) diff --git a/src/app/api/services/commentService.tsx b/src/app/api/services/commentService.tsx index c92ae30c..140aff7a 100644 --- a/src/app/api/services/commentService.tsx +++ b/src/app/api/services/commentService.tsx @@ -13,7 +13,10 @@ class CommentService { ...body, productId: productId, } - return requestor.post(`/products/${productId}/comments`, requestBody) + return requestor.post( + `/api/proxy/products/${productId}/comments`, + requestBody + ) } getProductComment( @@ -21,7 +24,7 @@ class CommentService { limit: number, cursor?: number ): Promise> { - let url = `/products/${productId}/comments?limit=${limit}` + let url = `/api/proxy/products/${productId}/comments?limit=${limit}` if (cursor) { url += `&cursor=${cursor}` @@ -36,21 +39,24 @@ class CommentService { ...body, articleId: articleId, } - return requestor.post(`/articles/${articleId}/comments`, requestBody) + return requestor.post( + `/api/proxy/articles/${articleId}/comments`, + requestBody + ) } - getArticleComment(articleId, limit, cursor) { + getArticleComment(articleId: number, limit: number, cursor?: number) { return requestor.get( - `/articles/${articleId}/comments?limit=${limit}&cursor=${cursor}` + `/api/proxy/articles/${articleId}/comments?limit=${limit}&cursor=${cursor}` ) } patchComment(commentId, body) { - return requestor.patch(`/comments/${commentId}`, body) + return requestor.patch(`/api/proxy/comments/${commentId}`, body) } deleteComment(commentId) { - return requestor.delete(`/comments/${commentId}`) + return requestor.delete(`/api/proxy/comments/${commentId}`) } } diff --git a/src/app/api/services/productService.tsx b/src/app/api/services/productService.tsx index ea0e05bc..7cc2132a 100644 --- a/src/app/api/services/productService.tsx +++ b/src/app/api/services/productService.tsx @@ -9,17 +9,24 @@ class ProductService { const requestBody = { ...body, } - return requestor.post(`/products`, requestBody) + return requestor.post(`/api/proxy/products`, requestBody) } - getProduct(page: number, pageSize: number, orderBy: string, keyword: string) { - return requestor.get( - `/products?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}&keyword=${keyword}` - ) + getProduct( + page: number, + pageSize: number, + orderBy: string, + keyword?: string + ) { + let url = `/api/proxy/products?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}` + if (keyword) { + url += `&keyword=${encodeURIComponent(keyword)}` + } + return requestor.get(url) } getProductId(productId: number): Promise> { - return requestor.get(`/products/${productId}`) + return requestor.get(`/api/proxy/products/${productId}`) } patchProductId(productId, body) { @@ -28,19 +35,19 @@ class ProductService { ...body, productId: productId, } - return requestor.patch(`/products/${productId}`, requestBody) + return requestor.patch(`/api/proxy/products/${productId}`, requestBody) } deleteProductId(productId) { - return requestor.delete(`/products/${productId}`) + return requestor.delete(`/api/proxy/products/${productId}`) } postProductIdFavorite(productId) { - return requestor.post(`/products/${productId}/favorite`) + return requestor.post(`/api/proxy/products/${productId}/favorite`) } deleteProductIdFavorite(productId) { - return requestor.delete(`/products/${productId}/favorite`) + return requestor.delete(`/api/proxy/products/${productId}/favorite`) } } diff --git a/src/app/common/Button.tsx b/src/app/common/Button.tsx index 746a81e1..3190047c 100644 --- a/src/app/common/Button.tsx +++ b/src/app/common/Button.tsx @@ -23,38 +23,28 @@ const Button = ({ style, prefix, suffix, - as = 'button', to, className, }: ButtonProps) => { - const isLink = as === Link + const isLink = !!to if (isLink && !to) { console.error('Error: "to" prop is required when "as" is Link.') return null } - if (isLink) { return ( - - - - - {prefix && {prefix}} - {children} - {suffix && {suffix}} - - - + + + + {prefix && {prefix}} + {children} + {suffix && {suffix}} + + ) } - return ( { } const handleDeleteClick = () => { - setImagePreview('`') + setImagePreview('') } console.log(imagePreview) return ( @@ -42,20 +42,18 @@ const ButtonImage = () => { - + 이미지등록아이콘 이미지 등록 {imagePreview && (
    - 미리보기 이미지 - <> - - + + 미리보기 이미지 + + + 삭제버튼 +
    )}
    @@ -77,35 +75,33 @@ const ImageWrapper = styled.div` height: auto; display: flex; gap: 24px; - @media (max-width: 1199px) { + @media (max-width: 1023px) { gap: 10px; } @media (max-width: 743px) { - width: 21.625rem; + width: 34.6rem; + height: 16.8rem; position: relative; } ` const Bone = styled.div` - width: 17.625rem; - height: 17.625rem; + width: 28.2rem; + height: 28.2rem; background-color: #e5e7eb; border-radius: 12px; cursor: pointer; display: flex; align-items: center; justify-content: center; - @media (max-width: 1199px) { - width: 10.5rem; - height: 10.5rem; - } - @media (max-width: 743px) { - width: 10.5rem; - height: 10.5rem; + position: relative; + @media (max-width: 1023px) { + width: 16.8rem; + height: 16.8rem; } ` const Container = styled.div` width: fit-content; - height: 5.375rem; + height: 8.6rem; display: flex; align-items: center; justify-content: space-between; @@ -118,23 +114,39 @@ const Text = styled.div` ${(props) => textStyle(16, 400)(props)} color: ${theme.colors.SecondaryGray[400]}; ` -const PreviewImage = styled.img` - width: 17.625rem; - height: 17.625rem; +const PreviewImageWrapper = styled.div` + width: fit-content; + height: fit-content; border-radius: 12px; - object-fit: cover; - @media (max-width: 1199px) { - width: 10.5rem; - height: 10.5rem; + + img { + width: 28.2rem; + height: 28.2rem; + border-radius: 12px; + } + @media (max-width: 1023px) { + img { + width: 16.8rem; + height: 16.8rem; + } } ` -const DeleteIcon = styled.img` - width: 1.375rem; - height: 1.5rem; - position: absolute; - right: 0.75rem; - top: 0.75rem; - cursor: pointer; + +const DeleteIcon = styled.div` + img { + width: 2rem; + height: 2rem; + position: relative; + right: -25.25rem; + top: -27.25rem; + cursor: pointer; + } + @media (max-width: 1023px) { + img { + right: -14.25rem; + top: -16.25rem; + } + } ` const ErrorMessage = styled.div` ${(props) => textStyle(16, 400)(props)} diff --git a/src/app/common/DropDown.tsx b/src/app/common/DropDown.tsx index ad271d20..b6e5cb04 100644 --- a/src/app/common/DropDown.tsx +++ b/src/app/common/DropDown.tsx @@ -1,10 +1,14 @@ +'use client' import React, { useRef, useState, useEffect } from 'react' import styled from 'styled-components' -import { theme } from '../styles/theme' -import { textStyle } from '../styles/textStyle' +import Image from 'next/image' + import ArrowDown from '../../../public/assets/image/ArrowDown.png' import Sort from '../../../public/assets/svg/Sort.svg' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' + type OptionType = { name: string value: string @@ -29,67 +33,58 @@ const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { setIsOpen(false) } - // useEffect(() => { - // const handleResize = () => {} + useEffect(() => { + const handleResize = () => {} - // window.addEventListener('resize', handleResize) // resize: 창 크기가 변경될 때 발생하는 이벤트 / handleResize: 이벤트가 발생할 때 실행할 함수 - // return () => window.removeEventListener('resize', handleResize) - // }, []) + window.addEventListener('resize', handleResize) // resize: 창 크기가 변경될 때 발생하는 이벤트 / handleResize: 이벤트가 발생할 때 실행할 함수 + return () => window.removeEventListener('resize', handleResize) + }, []) return ( - <> - //
    - // - // {window.innerWidth <= 743 ? ( - // - // ) : ( - // selectList.find((item) => item.value === selected)?.name - // )} - // - // - - // {isOpen && ( - // - // {selectList.map((item) => ( - // - // ))} - // - // )} - //
    +
    + + {window.innerWidth <= 743 ? ( + Sort + ) : ( + selectList.find((item) => item.value === selected)?.name + )} + + + {isOpen && ( + + {selectList.map((item) => ( + + ))} + + )} +
    ) } export default DropDown const SelectBox = styled.div` - width: 8.125rem; + width: 13rem; height: 100%; cursor: pointer; - padding: 0.5rem 1.25rem; + padding: 0.8rem 2rem; border: 1px solid ${theme.colors.SecondaryGray[200]}; - border-radius: 0.75rem; + border-radius: 1.2rem; background-color: white; position: relative; display: flex; align-items: center; justify-content: space-between; @media (max-width: 743px) { - width: 2.625rem; - height: 2.625rem; + width: max-content; + height: max-content; justify-content: center; position: relative; - left: 14px; - top: 10px; - } -` -const SortImage = styled.img` - width: 0; - height: 0; - @media (max-width: 743px) { - width: 24px; - height: 24px; + left: 150px; + top: -24px; + padding: 0.9rem; } ` const ArrowDownImage = styled.img.withConfig({ @@ -108,19 +103,18 @@ const ArrowDownImage = styled.img.withConfig({ ` const SelectOption = styled.ul` position: absolute; - top: 3.8rem; - left: 0; + top: 5.8rem; + width: 100%; border: 1px solid #cccccc; border-radius: 12px; background-color: #ffffff; color: #181818; ${(props) => textStyle(16, 400)(props)} - max-height: 300px; - overflow-y: auto; + z-index: 10; list-style: none; - padding: 0; + display: flex; align-items: center; flex-direction: column; @@ -137,8 +131,13 @@ const SelectOption = styled.ul` ` const Option = styled.li` ${(props) => textStyle(16, 400)(props)} - padding: 8px 35px; + padding: 9px 28px; cursor: pointer; + width: inherit; + display: flex; + align-items: center; + justify-content: center; + border-radius: 12px; &:hover { background-color: #f6f6f6; } diff --git a/src/app/common/ItemsNavVar.tsx b/src/app/common/ItemsNavVar.tsx index 895b24c7..2e5bac1d 100644 --- a/src/app/common/ItemsNavVar.tsx +++ b/src/app/common/ItemsNavVar.tsx @@ -1,9 +1,9 @@ -import { Link } from 'react-router-dom' +import Link from 'next/link' import React from 'react' -import LogoFace from '../../public/assets/image/LogoFace.png' -import Logo from '../../public/assets/image/Logo.png' -import ProfileIcon from '../../public/assets/svg/ProfileIcon.svg' +import LogoFace from '../../../public/assets/image/LogoFace.png' +import Logo from '../../../public/assets/image/Logo.png' +import ProfileIcon from '../../../public/assets/svg/ProfileIcon.svg' import styled from 'styled-components' import { theme } from '../styles/theme' @@ -21,18 +21,22 @@ const ItemsNavVar = ({ isItemsPage, isBoardsPage }: ItemsNavVarProps) => { - - 판다마켓 로고 사진 + + + 판다마켓 로고 사진 + - - 판다마켓 로고 사진 + + + 판다마켓 로고 사진 + - + 자유게시판 - + 중고마켓 @@ -46,51 +50,79 @@ const ItemsNavVar = ({ isItemsPage, isBoardsPage }: ItemsNavVarProps) => { export default ItemsNavVar const Bone = styled.div` - height: 4.375rem; display: flex; align-items: center; justify-content: space-between; - padding: 0 12.5rem 0 12.5rem; + padding: 0 20rem 0 20rem; position: sticky; border-bottom: 1px solid #dfdfdf; - @media (max-width: 1199px) { - margin: auto 1.5rem; - padding: 0; + height: 7rem; + @media (max-width: 1023px) { + padding: 0 2.4rem; } @media (max-width: 743px) { - margin: auto 1rem; + padding: 0 1.6rem; } ` const LeftWrapper = styled.div` display: flex; align-items: center; justify-content: space-between; - width: 24.125rem; + width: 38.6rem; ${(props) => textStyle(18, 700)(props)} color: ${theme.colors.SecondaryGray[600]}; - @media (max-width: 1199px) { + @media (max-width: 1023px) { width: 23.375rem; } @media (max-width: 743px) { - width: 14rem; + width: 22.4rem; } ` const HeaderLogo = styled.div` display: flex; align-items: center; justify-content: space-between; + gap: 0.8rem; @media (max-width: 743px) { position: relative; left: -8px; } ` +const PandaLogoWrapper = styled.div` + img { + width: 4rem; + height: 4rem; + display: flex; + } + + @media (max-width: 743px) { + img { + display: none; + } + } +` +const PandaTextWrapper = styled.div` + img { + width: 10.3rem; + height: 3.5rem; + display: flex; + } + @media (max-width: 1023px) { + } + @media (max-width: 743px) { + img { + width: 8.1rem; + height: 2.3rem; + } + } +` const NavContent = styled.div` display: flex; align-items: center; justify-content: space-around; - width: 12.438rem; + width: 20rem; @media (max-width: 743px) { - width: 8.4375rem; + width: 13.5rem; justify-content: space-between; } ` @@ -133,27 +165,3 @@ const FreeBordLink = styled.div` padding: 21px 0px; } ` -const LogoFaceImage = styled.img` - width: 2.5rem; - height: 2.5rem; - margin-right: 0.537rem; - @media (max-width: 743px) { - width: 0; - height: 0; - } -` -const LogoImage = styled.img` - width: 6.438rem; - height: 2.188rem; - @media (max-width: 743px) { - width: 5.062rem; - height: 1.3125rem; - display: flex; - align-items: center; - justify-content: center; - } -` -const ProfileIconImage = styled.img` - width: 2.5rem; - height: 2.5rem; -` diff --git a/src/app/common/Tag.tsx b/src/app/common/Tag.tsx index c87ef020..d39a4b04 100644 --- a/src/app/common/Tag.tsx +++ b/src/app/common/Tag.tsx @@ -1,8 +1,11 @@ import React from 'react' -import Delete from '../../public/assets/svg/Delete.svg' + +import Delete from '../../../public/assets/svg/Delete.svg' + import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' +import Image from 'next/image' interface TagProps { tag: string @@ -13,20 +16,14 @@ interface TagProps { const Tag = ({ tag, onClick, showDelete = false }: TagProps) => { console.log('Tag 컴포넌트에 전달된 productTags:', tag) return ( - <> -
    - - #{tag} - {showDelete && ( - onClick?.(tag)} - /> - )} - -
    - +
    + + #{tag} + {showDelete && ( + 삭제 onClick?.(tag)} /> + )} + +
    ) } @@ -47,7 +44,3 @@ const Text = styled.div` color: ${theme.colors.SecondaryGray[800]}; margin-right: 0.5rem; ` -const DeleteIcon = styled.img` - width: fit-content; - height: fit-content; -` diff --git a/src/app/hooks/useCommentService.tsx b/src/app/hooks/useCommentService.tsx index 8f425df4..7c353758 100644 --- a/src/app/hooks/useCommentService.tsx +++ b/src/app/hooks/useCommentService.tsx @@ -1,15 +1,12 @@ -import { useEffect, useState } from 'react' -import { PostCommentType } from '../types/comment' +'use client' -import commentService from '../src/app/api/services/commentService' +import { useEffect, useState } from 'react' +import { GetCommentType } from '../types/comment' -interface ProductComment { - list: PostCommentType[] - nextCursor: number | null -} +import commentService from '../../../src/app/api/services/commentService' export const useGetCommentService = (productId: number, limit = 3) => { - const [productQuestion, setProductQuestion] = useState({ + const [productQuestion, setProductQuestion] = useState({ list: [], nextCursor: null, }) diff --git a/src/app/hooks/useProductService.tsx b/src/app/hooks/useProductService.tsx index 7d260d17..b13083b0 100644 --- a/src/app/hooks/useProductService.tsx +++ b/src/app/hooks/useProductService.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' -import productService from '../src/app/api/services/productService' +import productService from '../../../src/app/api/services/productService' import { GetProductIdTypes } from '../types/product' export const useGetProductId = (productId: number) => { From 17343aa1a0897add6ee2d7dee5202884e8053da2 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Fri, 16 May 2025 22:43:19 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feature:=20boards=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/image/BestBadge.png | Bin 0 -> 1355 bytes .../[productId]/ItemsDetailQuestionArrary.tsx | 2 - src/app/api/services/articleService.jsx | 44 ------ src/app/api/services/articleService.tsx | 53 +++++++ src/app/boards/BestBoards.tsx | 137 ++++++++++++++++++ src/app/boards/page.tsx | 37 ++++- src/app/types/article.ts | 18 +++ src/app/types/comment.ts | 2 +- 8 files changed, 244 insertions(+), 49 deletions(-) create mode 100644 public/assets/image/BestBadge.png delete mode 100644 src/app/api/services/articleService.jsx create mode 100644 src/app/api/services/articleService.tsx create mode 100644 src/app/boards/BestBoards.tsx create mode 100644 src/app/types/article.ts diff --git a/public/assets/image/BestBadge.png b/public/assets/image/BestBadge.png new file mode 100644 index 0000000000000000000000000000000000000000..20eafca8333aba7345b3bd60ce52f9b51e15e756 GIT binary patch literal 1355 zcmV-R1+@B!P) z6jvC>|Fg!Vf{9X;HnoLVt70rP8f>7@1nC9ZQkZ=7l~+}V8PkB38=4-pO_D081tCO zqh+Z(U#kPww*mtn0e8>O=`C)0uR7lG$3@`OSHR{s6UT6+f4%`&w^E6B;=qN`0pq^_YnqfOH#_6wIW`kfxPlq;xw5(9Y1n<;PQMoA;9p|Q zVMizm(Q{1-jY;JZWZO|C#O75h99D}!O{aj0pMm4DhKdWFF(wE}C3FV{Xp@8biK2A|{?aqf-f#1WW1@x9gA&_X?)R?3a~(s7AHx&{i(_qyKA<-?Kv98P*yr zfxWSdUNkbP+D&m<%IT>yAV?$~#J%}RmUQ?<(ub~UsK{N@;|ChZm1P$IX`DMy}ddahh zqFKMvdFIL|3~3aJA&Qq>97vd8ykMx~W|iK!pMP7o#(YHRF0tG`>v{@;MiGJApE)$=n&5+DsVQ740jP3)A*tKOwYL_ z0+z>e&w%R`VPZ-pe-;HC!~K(=%s$5Np`k|Wj;x+`7=jx}4MlQ`QNHwl%m;=YeGwXS zU$+ycn*UYe&@-4nbXlxRVTxy;6illEf+q^B#`vD5lg{_(4Xobp_=!ZYc4|VWMp<*T zBtL}fFu?KBE%BYbuGI9|8O!S03uor-Ihnu}Pf{gxdJQ*{k=fM8E_}ya{R@G3%W4rO zZ0}?Eu%#v1BC+jT_y`5*c2!%MPsKkxZhQpcuNbl;IpM0#cP&}*NEez z1OeF~EZ(xoPAza9VzNOxwnFV|0?a~DwrWvG!s#;IDEb(+2*fc7MXA*xOk;VCj1>d_ zAP8%Iqdg^@+~N6u3PUTj^dv?^$f&2dUV0BjCBP4~%7>@-T|l zRDx*I3Zr4wCMN{jWJZ-tDvMeuF?Cw-qCz38sGYBQ9@)bky*t6r#S`0*>NS%`2~z+7 N002ovPDHLkV1iX}d{O`a literal 0 HcmV?d00001 diff --git a/src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx b/src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx index 368947b3..3b3002f9 100644 --- a/src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx +++ b/src/app/Items/[productId]/ItemsDetailQuestionArrary.tsx @@ -24,8 +24,6 @@ interface ItemsDetailQuestionArraryProps { const ItemsDetailQuestionArrary = ({ productQuestion, - setIsEditing, - isEditing, }: ItemsDetailQuestionArraryProps) => { const [isDropDownOpen, setIsDropDownOpen] = useState(false) const dropDownRef = useRef(null) diff --git a/src/app/api/services/articleService.jsx b/src/app/api/services/articleService.jsx deleted file mode 100644 index 988f2016..00000000 --- a/src/app/api/services/articleService.jsx +++ /dev/null @@ -1,44 +0,0 @@ -import requestor from '../client/requestor' - -class ArticleService { - postArticle(body) { - // 틀릴 수도 - const requestBody = { - ...body, - } - return requestor.post(`/articles`, requestBody) - } - - getArticle(page, pageSize, orderBy, keyword) { - return requestor.get( - `/articles?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}&keyword=${keyword}` - ) - } - - getArticleId(articleId) { - return requestor.get(`p/articles/${articleId}`) - } - - patchArticleId(articleId, body) { - // 틀릴수도 - return requestor.patch(`/articles/${articleId}`, { - data: body, - }) - } - - deleteArticleId(articleId) { - return requestor.delete(`/articles/${articleId}`) - } - - postArticleLike(articleId) { - return requestor.post(`/articles/${articleId}/like`) - } - - deleteArticleLike(articleId) { - return requestor.delete(`/articles/${articleId}/like`) - } -} - -const articleService = new ArticleService() - -export default articleService diff --git a/src/app/api/services/articleService.tsx b/src/app/api/services/articleService.tsx new file mode 100644 index 00000000..0f657557 --- /dev/null +++ b/src/app/api/services/articleService.tsx @@ -0,0 +1,53 @@ +import requestor from '../client/requestor' +import { AxiosResponse } from 'axios' +import { GetArticleType, GetArticleIdType } from '@/app/types/article' + +class ArticleService { + postArticle(body) { + // 틀릴 수도 + const requestBody = { + ...body, + } + return requestor.post(`/api/proxy/articles`, requestBody) + } + + getArticle( + page: number, + pageSize: number, + orderBy: string, + keyword?: string + ): Promise> { + let url = `/api/proxy/articles?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}&keyword=${keyword}` + if (keyword) { + url += `&keyword=${encodeURIComponent(keyword)}` + } + return requestor.get(url) + } + + getArticleId(articleId: number): Promise> { + return requestor.get(`p/articles/${articleId}`) + } + + patchArticleId(articleId, body) { + // 틀릴수도 + return requestor.patch(`/api/proxy/articles/${articleId}`, { + data: body, + }) + } + + deleteArticleId(articleId) { + return requestor.delete(`/api/proxy/articles/${articleId}`) + } + + postArticleLike(articleId) { + return requestor.post(`/api/proxy/articles/${articleId}/like`) + } + + deleteArticleLike(articleId) { + return requestor.delete(`/api/proxy/articles/${articleId}/like`) + } +} + +const articleService = new ArticleService() + +export default articleService diff --git a/src/app/boards/BestBoards.tsx b/src/app/boards/BestBoards.tsx new file mode 100644 index 00000000..2b5c0efb --- /dev/null +++ b/src/app/boards/BestBoards.tsx @@ -0,0 +1,137 @@ +'use client' +import React, { useEffect, useState } from 'react' +import Image from 'next/image' + +import { GetArticleType, GetArticleIdType } from '../types/article' + +import HeartInactive from '../../../public/assets/image/HeartInactive.png' +import BestBadge from '../../../public/assets/image/BestBadge.png' +import { formatDate } from '../utils/datetime' + +import styled, { css } from 'styled-components' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' + +type BestBoardsProps = { + articleList: GetArticleType +} + +const BestBoards = ({ articleList }: BestBoardsProps) => { + const [itemsDisplay, setItemsDisplay] = useState(1) + + useEffect(() => { + const handleReasize = () => { + if (window.innerWidth <= 743) { + setItemsDisplay(1) + } else if (window.innerWidth >= 744 && window.innerWidth <= 1023) { + setItemsDisplay(2) + } else { + setItemsDisplay(3) + } + } + handleReasize() + window.addEventListener('resize', handleReasize) + + return () => window.removeEventListener('resize', handleReasize) + }, []) + return ( + <> + 베스트 게시글 + + {articleList.list.slice(0, itemsDisplay).map((article) => ( + + + 베스트 게시글 오피셜 아이콘 + + + {article.content} + + 게시글 이미지 + + + + + {article.writer.nickname} + + 하트 비활성화/활성화 + {article.likeCount} + + + {formatDate(article.createdAt)} + + + ))} + + + ) +} + +export default BestBoards + +const BoneWrapper = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +` +const BestBoardsTitle = styled.div` + ${(props) => textStyle(20, 800)(props)} + margin-bottom:2.4rem; +` +const MainWrapper = styled.div` + width: 38.4rem; + height: 16.9rem; + padding: 0 2.4rem 1.6rem 2.4rem; + border-radius: 8px; + background-color: ${theme.colors.SecondaryGray[50]}; + display: flex; + + justify-content: space-between; + flex-direction: column; +` +const BestIcon = styled.div`` +const Description = styled.div` + display: flex; + gap: 0.8rem; +` +const MainFooter = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +` +const TextDescription = styled.div` + ${(props) => textStyle(20, 600)(props)} +` +const DescriptionImage = styled.div` + img { + width: 7.2rem; + height: 7.2rem; + } +` +const NameHeart = styled.div` + display: flex; + align-items: center; + justify-content: center; + gap: 0.8rem; + height: 2.4rem; +` +const CreateDate = styled.div` + ${(props) => textStyle(14, 400)(props)} + color: ${theme.colors.SecondaryGray[500]}; +` +const UserName = styled.div` + ${(props) => textStyle(14, 400)(props)} + color: ${theme.colors.SecondaryGray[500]}; +` +const UserHeart = styled.div` + display: flex; + align-items: center; + img { + width: 1.6rem; + height: 1.6rem; + } +` + +const HeartCount = styled.div` + ${(props) => textStyle(14, 400)(props)} + color: ${theme.colors.SecondaryGray[500]}; +` diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx index 1a0f8a7b..ff1e15e6 100644 --- a/src/app/boards/page.tsx +++ b/src/app/boards/page.tsx @@ -1,7 +1,40 @@ -import React from 'react' +'use client' +import React, { useEffect, useState } from 'react' + +import ItemsNavVar from '../common/ItemsNavVar' +import BestBoards from './BestBoards' +import articleService from '../api/services/articleService' +import { GetArticleType, GetArticleIdType } from '../types/article' + +import styled, { css } from 'styled-components' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' const Boards = () => { - return <>dd + const [articleList, setArticleList] = useState() + + useEffect(() => { + const getArticle = async () => { + try { + const response = await articleService.getArticle(1, 5, 'like', '') + setArticleList(response.data) + } catch (error) { + console.log(error) + } + } + getArticle() + }, []) + return ( + <> + + {articleList && } + + ) } export default Boards + +const Bone = styled.div` + width: 120rem; + margin: 2.4rem auto auto auto; +` diff --git a/src/app/types/article.ts b/src/app/types/article.ts new file mode 100644 index 00000000..5289338d --- /dev/null +++ b/src/app/types/article.ts @@ -0,0 +1,18 @@ +export interface GetArticleType { + totalCount: number | null + list: GetArticleIdType[] +} + +export interface GetArticleIdType { + updatedAt: string + createdAt: string + likeCount: number + writer: { + nickname: string + id: number + } + image: string + content: string + title: string + id: number +} diff --git a/src/app/types/comment.ts b/src/app/types/comment.ts index c7835afa..7e6cabae 100644 --- a/src/app/types/comment.ts +++ b/src/app/types/comment.ts @@ -1,5 +1,5 @@ export interface GetCommentType { - nextCursor: number + nextCursor: number | null list: PostCommentType[] } From a36c8bff9b2142b3316ae7d1a6cabf83e87bcacc Mon Sep 17 00:00:00 2001 From: ramong26 Date: Sat, 17 May 2025 11:43:45 +0900 Subject: [PATCH 09/12] =?UTF-8?q?=EC=A4=91=EA=B0=84=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/boards/BestBoards.tsx | 1 + src/app/boards/BoardDetailArrary.tsx | 106 ++++++++++++++++++++ src/app/boards/BoardList.tsx | 140 +++++++++++++++++++++++++++ src/app/boards/page.tsx | 55 ++++++++--- 4 files changed, 289 insertions(+), 13 deletions(-) create mode 100644 src/app/boards/BoardDetailArrary.tsx create mode 100644 src/app/boards/BoardList.tsx diff --git a/src/app/boards/BestBoards.tsx b/src/app/boards/BestBoards.tsx index 2b5c0efb..82041f08 100644 --- a/src/app/boards/BestBoards.tsx +++ b/src/app/boards/BestBoards.tsx @@ -72,6 +72,7 @@ const BoneWrapper = styled.div` display: flex; align-items: center; justify-content: space-between; + margin-bottom: 4rem; ` const BestBoardsTitle = styled.div` ${(props) => textStyle(20, 800)(props)} diff --git a/src/app/boards/BoardDetailArrary.tsx b/src/app/boards/BoardDetailArrary.tsx new file mode 100644 index 00000000..18db544f --- /dev/null +++ b/src/app/boards/BoardDetailArrary.tsx @@ -0,0 +1,106 @@ +'use client' + +import React, { useState, useEffect, useRef } from 'react' + +import { GetArticleType, GetArticleIdType } from '../types/article' +import { diffDate } from '../utils/datetime' +import { formatDate } from '../utils/datetime' + +import Setting from '../../../../public/assets/svg/Setting.svg' + +import styled from 'styled-components' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' + +type BestBoardsProps = { + article: GetArticleIdType +} + +const BoardDetailArrary = ({ article }: BestBoardsProps) => { + return ( + <> + + + {article.content} + 게시글 상세 이미지 + + + {/*이미지가 없을 경우 기본 이미지 적용*/} + 유저프로필사진 + + {article.writer.nickname} + {/*날짜 차이가 31일을 넘길 경우 createAt을 출력*/} + + {diffDate(article.createdAt) > 31 ? ( + <> + {formatDate(article.createdAt)} + + ) : ( + <> + {diffDate(article.createdAt)} + 일 전 + + )} + + + + + ) +} + +export default BoardDetailArrary + +const Bone = styled.div` + display: flex; + flex-direction: column; + justify-content: space-between; + height: max-content; + border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; + + position: relative; + padding-bottom: 2.4rem; + + margin-top: 2.4rem; + @media (max-width: 1023px) { + margin-top: 0; + } +` +const ContentWrappeer = styled.div` + display: flex; + align-items: flex-start; + justify-content: space-between; + img { + width: 7.2rem; + height: 7.2rem; + } +` + +const QuestionContent = styled.div` + ${(props) => textStyle(20, 600)(props)} + color: ${theme.colors.SecondaryGray[800]}; + margin-bottom: 2.4rem; +` +const UserProfileImageWrapper = styled.div` + display: flex; + align-items: center; + gap: 0.8rem; + img { + width: 2.6rem; + height: 2.6rem; + border-radius: 50%; + } +` + +const UserProfileName = styled.div` + ${(props) => textStyle(12, 400)(props)} + color: ${theme.colors.SecondaryGray[600]}; +` +const DiffDate = styled.div` + ${(props) => textStyle(12, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; +` diff --git a/src/app/boards/BoardList.tsx b/src/app/boards/BoardList.tsx new file mode 100644 index 00000000..13bf8880 --- /dev/null +++ b/src/app/boards/BoardList.tsx @@ -0,0 +1,140 @@ +'use client' +import React, { useState } from 'react' +import Image from 'next/image' + +import { GetArticleType, GetArticleIdType } from '../types/article' + +import BoardDetailArrary from './BoardDetailArrary' +import DropDown from '../common/DropDown' +import Button from '../common/Button' + +import InquiryEmpty from '../../../public/assets/svg/InquiryEmpty.svg' +import Search from '../../../public/assets/svg/Search.svg' + +import styled, { css } from 'styled-components' +import { theme } from '../styles/theme' +import { textStyle } from '../styles/textStyle' + +type SelectOption = { + value: string + name: string +} +type BestBoardsProps = { + articleList: GetArticleType +} +const BoardList = ({ articleList }: BestBoardsProps) => { + console.log(articleList) + const selectList: SelectOption[] = [ + { value: 'recent', name: '최신순' }, + { value: 'favorite', name: '좋아요순' }, + ] + const [selectedOption, setSelectedOption] = useState(selectList[0].value) + return ( + <> + + 게시글 + 글쓰기 + + + + + + 검색아이콘 + + + { + setSelectedOption(value) + }} + /> + + + {articleList.list?.length === 0 ? ( + + 관련된 게시글이 없습니다. + 문의가 없습니다 + + ) : ( + + {articleList.list?.map((article) => ( + + ))} + + )} + + + ) +} + +export default BoardList +const BoardHeader = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 2.4rem; +` +const BestBoardsTitle = styled.div` + ${(props) => textStyle(20, 800)(props)} +` +const WriterButton = styled(Button)` + padding: 0.8rem 2.3rem; + width: max-content; +` + +const SearchList = styled.div` + display: flex; + align-items: center; + justify-content: space-between; +` +const TextInputIcon = styled.div` + position: relative; +` +const NavSearch = styled.input` + width: 105.4rem; + height: 4.2rem; + padding: 0.9rem 8.7rem 0.9rem 4.4rem; + border-radius: 1.2rem; + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; + background-color: ${theme.colors.SecondaryGray[100]}; + border: none; + margin-right: 1.2rem; + @media (max-width: 1023px) { + width: 15.125rem; + padding: 9px 24px 9px 44px; + } + @media (max-width: 743px) { + position: relative; + top: 19px; + padding: 9px 40px 9px 44px; + width: max-content; + margin: 0; + } +` +const PlaceholderIcon = styled.div` + width: max-content; + position: absolute; + top: 10px; + left: 20px; +` + +const BoardsList = styled.div`` +const ItemsQuestionWrapper = styled.div` + position: relative; + display: flex; + flex-direction: column; +` + +const InquiryEmptyWrapper = styled.div` + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +` +const InquiryEmptyText = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[400]}; + margin-top: 0.5rem; +` diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx index ff1e15e6..5fb77be9 100644 --- a/src/app/boards/page.tsx +++ b/src/app/boards/page.tsx @@ -3,31 +3,59 @@ import React, { useEffect, useState } from 'react' import ItemsNavVar from '../common/ItemsNavVar' import BestBoards from './BestBoards' +import BoardList from './BoardList' import articleService from '../api/services/articleService' -import { GetArticleType, GetArticleIdType } from '../types/article' +import { GetArticleType } from '../types/article' -import styled, { css } from 'styled-components' +import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' +type SelectOption = { + value: string + name: string +} + const Boards = () => { const [articleList, setArticleList] = useState() + const selectList: SelectOption[] = [ + { value: 'recent', name: '최신순' }, + { value: 'like', name: '좋아요순' }, + ] + const [selectedOption, setSelectedOption] = useState(selectList[0].value) useEffect(() => { - const getArticle = async () => { - try { - const response = await articleService.getArticle(1, 5, 'like', '') - setArticleList(response.data) - } catch (error) { - console.log(error) - } - } - getArticle() - }, []) + articleService + .getArticle(1, 5, 'like', '') + .then((response) => { + const sorted = [...(response.data.list || [])].sort((a, b) => { + if (selectedOption === 'recent') { + return ( + new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() + ) + } else if (selectedOption === 'like') { + return b.likeCount - a.likeCount + } + return 0 + }) + + setArticleList({ + totalCount: response.data.totalCount, + list: sorted, + }) + }) + .catch((error) => { + console.error('게시글 불러오기 실패:', error) + }) + }, [selectedOption]) + return ( <> - {articleList && } + + {articleList && } + {articleList && } + ) } @@ -36,5 +64,6 @@ export default Boards const Bone = styled.div` width: 120rem; + margin: 2.4rem auto auto auto; ` From 226104e7dc552a1ee26d26804d9652539ce79046 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Mon, 19 May 2025 13:34:25 +0900 Subject: [PATCH 10/12] =?UTF-8?q?feature:=EB=AC=B4=ED=95=9C=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/Items/page.tsx | 2 +- src/app/boards/BestBoards.tsx | 3 +- src/app/boards/BoardDetailArrary.tsx | 4 +- src/app/boards/BoardList.tsx | 71 ++++++++++++++++++++---- src/app/boards/page.tsx | 80 ++++++++++++++++++---------- src/app/styles/GlobalStyles.tsx | 1 + 6 files changed, 119 insertions(+), 42 deletions(-) diff --git a/src/app/Items/page.tsx b/src/app/Items/page.tsx index 6b9a7053..2ca4f9f7 100644 --- a/src/app/Items/page.tsx +++ b/src/app/Items/page.tsx @@ -88,7 +88,7 @@ const Items = () => { } return 0 }) - console.log(sorted) + setSortedProducts(sorted) setTotalItems(response.data.totalCount) }) diff --git a/src/app/boards/BestBoards.tsx b/src/app/boards/BestBoards.tsx index 82041f08..599f750f 100644 --- a/src/app/boards/BestBoards.tsx +++ b/src/app/boards/BestBoards.tsx @@ -13,7 +13,7 @@ import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' type BestBoardsProps = { - articleList: GetArticleType + articleList?: GetArticleType } const BestBoards = ({ articleList }: BestBoardsProps) => { @@ -34,6 +34,7 @@ const BestBoards = ({ articleList }: BestBoardsProps) => { return () => window.removeEventListener('resize', handleReasize) }, []) + if (!articleList) return null return ( <> 베스트 게시글 diff --git a/src/app/boards/BoardDetailArrary.tsx b/src/app/boards/BoardDetailArrary.tsx index 18db544f..7472b018 100644 --- a/src/app/boards/BoardDetailArrary.tsx +++ b/src/app/boards/BoardDetailArrary.tsx @@ -2,12 +2,10 @@ import React, { useState, useEffect, useRef } from 'react' -import { GetArticleType, GetArticleIdType } from '../types/article' +import { GetArticleIdType } from '../types/article' import { diffDate } from '../utils/datetime' import { formatDate } from '../utils/datetime' -import Setting from '../../../../public/assets/svg/Setting.svg' - import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' diff --git a/src/app/boards/BoardList.tsx b/src/app/boards/BoardList.tsx index 13bf8880..32416e33 100644 --- a/src/app/boards/BoardList.tsx +++ b/src/app/boards/BoardList.tsx @@ -1,8 +1,8 @@ 'use client' -import React, { useState } from 'react' +import React, { useState, useRef, useEffect } from 'react' import Image from 'next/image' -import { GetArticleType, GetArticleIdType } from '../types/article' +import { GetArticleType } from '../types/article' import BoardDetailArrary from './BoardDetailArrary' import DropDown from '../common/DropDown' @@ -11,7 +11,7 @@ import Button from '../common/Button' import InquiryEmpty from '../../../public/assets/svg/InquiryEmpty.svg' import Search from '../../../public/assets/svg/Search.svg' -import styled, { css } from 'styled-components' +import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' @@ -21,14 +21,57 @@ type SelectOption = { } type BestBoardsProps = { articleList: GetArticleType + selectedOption: string + setSelectedOption: (value: string) => void + loadMore: () => void + hasMore: boolean + searchTerm: string + setSearchTerm: (value: string) => void } -const BoardList = ({ articleList }: BestBoardsProps) => { +const BoardList = ({ + articleList, + selectedOption, + setSelectedOption, + loadMore, + hasMore, + searchTerm, + setSearchTerm, +}: BestBoardsProps) => { console.log(articleList) const selectList: SelectOption[] = [ { value: 'recent', name: '최신순' }, - { value: 'favorite', name: '좋아요순' }, + { value: 'like', name: '좋아요순' }, ] - const [selectedOption, setSelectedOption] = useState(selectList[0].value) + const observerRef = useRef(null) + const scrollContainerRef = useRef(null) + const loadingRef = useRef(false) + + useEffect(() => { + if (!hasMore || !observerRef.current || !scrollContainerRef.current) return + + let observer: IntersectionObserver | null = null + + const callback = async (entries: IntersectionObserverEntry[]) => { + if (entries[0].isIntersecting && !loadingRef.current) { + loadingRef.current = true + await loadMore() + setTimeout(() => { + loadingRef.current = false + }, 500) // 시간을 넣어 무한 스크롤이 한 번에 여러번 호출되지 않게 + } + } + + observer = new IntersectionObserver(callback, { + root: scrollContainerRef.current, + threshold: 0.9, + }) + + observer.observe(observerRef.current) + + return () => { + if (observer) observer.disconnect() + } + }, [hasMore, loadMore]) return ( <> @@ -37,7 +80,11 @@ const BoardList = ({ articleList }: BestBoardsProps) => { - + setSearchTerm(e.target.value)} + /> 검색아이콘 @@ -50,7 +97,7 @@ const BoardList = ({ articleList }: BestBoardsProps) => { }} /> - + {articleList.list?.length === 0 ? ( 관련된 게시글이 없습니다. @@ -58,9 +105,10 @@ const BoardList = ({ articleList }: BestBoardsProps) => { ) : ( - {articleList.list?.map((article) => ( + {articleList.list.map((article) => ( ))} + {hasMore &&
    } )} @@ -120,7 +168,10 @@ const PlaceholderIcon = styled.div` left: 20px; ` -const BoardsList = styled.div`` +const BoardsList = styled.div` + overflow-y: auto; + height: 60vh; +` const ItemsQuestionWrapper = styled.div` position: relative; display: flex; diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx index 5fb77be9..699de896 100644 --- a/src/app/boards/page.tsx +++ b/src/app/boards/page.tsx @@ -11,50 +11,76 @@ import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' -type SelectOption = { - value: string - name: string -} - const Boards = () => { const [articleList, setArticleList] = useState() - const selectList: SelectOption[] = [ - { value: 'recent', name: '최신순' }, - { value: 'like', name: '좋아요순' }, - ] - const [selectedOption, setSelectedOption] = useState(selectList[0].value) - + const [bestArticleList, setBestArticleList] = useState() + const [page, setPage] = useState(1) + const [hasMore, setHasMore] = useState(true) + const [selectedOption, setSelectedOption] = useState('recent') + const orderBy = selectedOption === 'recent' ? 'recent' : 'like' + // BestBoards에 관한 useEffect useEffect(() => { articleService .getArticle(1, 5, 'like', '') .then((response) => { - const sorted = [...(response.data.list || [])].sort((a, b) => { - if (selectedOption === 'recent') { - return ( - new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime() - ) - } else if (selectedOption === 'like') { - return b.likeCount - a.likeCount - } - return 0 - }) - - setArticleList({ + const sorted = [...(response.data.list || [])].sort( + (a, b) => b.likeCount - a.likeCount + ) + setBestArticleList({ totalCount: response.data.totalCount, list: sorted, }) }) .catch((error) => { - console.error('게시글 불러오기 실패:', error) + console.error('베스트 게시글 불러오기 실패:', error) }) - }, [selectedOption]) + }, []) + // BoardList 관한 useEffect + useEffect(() => { + const fetchArticles = async () => { + try { + const response = await articleService.getArticle(page, 5, orderBy, '') + const newList = response.data.list || [] + setArticleList((prev) => { + const combinedList = + page === 1 ? newList : [...(prev?.list || []), ...newList] + return { + totalCount: response.data.totalCount, + list: combinedList, + } + }) + + if (newList.length < 5) { + setHasMore(false) + } + } catch (error) { + console.error('게시글 불러오기 실패:', error) + } + } + + fetchArticles() + }, [page, selectedOption]) + + useEffect(() => { + setArticleList(undefined) // 선택이 바뀌면 리스트를 초기화 + setPage(1) + setHasMore(true) + }, [selectedOption]) return ( <> - {articleList && } - {articleList && } + {articleList && } + {articleList && ( + setPage((prev) => prev + 1)} + hasMore={hasMore} + /> + )} ) diff --git a/src/app/styles/GlobalStyles.tsx b/src/app/styles/GlobalStyles.tsx index ac2e8edd..1d0b9566 100644 --- a/src/app/styles/GlobalStyles.tsx +++ b/src/app/styles/GlobalStyles.tsx @@ -9,6 +9,7 @@ const GlobalStyles = createGlobalStyle` word-break: keep-all; } body { + overflow-y: hidden; font-family: 'Arial', sans-serif; background-color: #ffffff; color: #212529; From 21d5efc9131770b8260b720ca9683cca97481fb4 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Mon, 19 May 2025 14:41:26 +0900 Subject: [PATCH 11/12] =?UTF-8?q?style:=20=EB=B0=98=EC=9D=91=ED=98=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/Home/page.tsx | 8 +-- src/app/Items/BestItems.tsx | 2 +- src/app/Items/RecentItems.tsx | 6 +- src/app/Items/page.tsx | 2 + src/app/api/services/articleService.tsx | 12 +++- src/app/boards/BestBoards.tsx | 37 +++++------- src/app/boards/BoardDetailArrary.tsx | 80 +++++++++++++++++-------- src/app/boards/BoardList.tsx | 16 ++++- src/app/boards/page.tsx | 63 ++++++++++++++++--- src/app/common/Button.tsx | 2 +- src/app/common/DropDown.tsx | 25 ++++++-- src/app/common/ItemsNavVar.tsx | 8 +-- src/app/login/page.tsx | 8 ++- src/app/page.tsx | 8 +-- src/app/signup/page.tsx | 6 +- 15 files changed, 196 insertions(+), 87 deletions(-) diff --git a/src/app/Home/page.tsx b/src/app/Home/page.tsx index a3690225..8a37f74c 100644 --- a/src/app/Home/page.tsx +++ b/src/app/Home/page.tsx @@ -24,10 +24,10 @@ function Home() { - + 판다마켓 로고 사진 - + 판다마켓 로고 사진 @@ -131,10 +131,10 @@ function Home() { ©codeit - 2024 - + Privacy Policy - + FAQ diff --git a/src/app/Items/BestItems.tsx b/src/app/Items/BestItems.tsx index 6db2f4bd..d01f1f0c 100644 --- a/src/app/Items/BestItems.tsx +++ b/src/app/Items/BestItems.tsx @@ -41,7 +41,7 @@ const BestItems = ({ products }: BestItemsProps) => { {list.slice(0, itemsDisplay).map((product) => ( - + { {products.slice(0, itemsDisplay).map((product) => ( - + { { diff --git a/src/app/api/services/articleService.tsx b/src/app/api/services/articleService.tsx index 0f657557..5b50cb53 100644 --- a/src/app/api/services/articleService.tsx +++ b/src/app/api/services/articleService.tsx @@ -17,10 +17,18 @@ class ArticleService { orderBy: string, keyword?: string ): Promise> { - let url = `/api/proxy/articles?page=${page}&pageSize=${pageSize}&orderBy=${orderBy}&keyword=${keyword}` + const params = new URLSearchParams({ + page: page.toString(), + pageSize: pageSize.toString(), + orderBy, + }) + if (keyword) { - url += `&keyword=${encodeURIComponent(keyword)}` + params.append('keyword', keyword) } + + const url = `/api/proxy/articles?${params.toString()}` + return requestor.get(url) } diff --git a/src/app/boards/BestBoards.tsx b/src/app/boards/BestBoards.tsx index 599f750f..9c978c4b 100644 --- a/src/app/boards/BestBoards.tsx +++ b/src/app/boards/BestBoards.tsx @@ -1,14 +1,13 @@ -'use client' -import React, { useEffect, useState } from 'react' +import React from 'react' import Image from 'next/image' -import { GetArticleType, GetArticleIdType } from '../types/article' +import { GetArticleType } from '../types/article' import HeartInactive from '../../../public/assets/image/HeartInactive.png' import BestBadge from '../../../public/assets/image/BestBadge.png' import { formatDate } from '../utils/datetime' -import styled, { css } from 'styled-components' +import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' @@ -17,29 +16,12 @@ type BestBoardsProps = { } const BestBoards = ({ articleList }: BestBoardsProps) => { - const [itemsDisplay, setItemsDisplay] = useState(1) - - useEffect(() => { - const handleReasize = () => { - if (window.innerWidth <= 743) { - setItemsDisplay(1) - } else if (window.innerWidth >= 744 && window.innerWidth <= 1023) { - setItemsDisplay(2) - } else { - setItemsDisplay(3) - } - } - handleReasize() - window.addEventListener('resize', handleReasize) - - return () => window.removeEventListener('resize', handleReasize) - }, []) if (!articleList) return null return ( <> 베스트 게시글 - {articleList.list.slice(0, itemsDisplay).map((article) => ( + {articleList.list.map((article) => ( 베스트 게시글 오피셜 아이콘 @@ -74,6 +56,9 @@ const BoneWrapper = styled.div` align-items: center; justify-content: space-between; margin-bottom: 4rem; + @media (max-width: 1023px) { + margin-bottom: 2.4rem; + } ` const BestBoardsTitle = styled.div` ${(props) => textStyle(20, 800)(props)} @@ -86,9 +71,12 @@ const MainWrapper = styled.div` border-radius: 8px; background-color: ${theme.colors.SecondaryGray[50]}; display: flex; - justify-content: space-between; flex-direction: column; + @media (max-width: 1023px) { + width: 34rem; + height: 19.8rem; + } ` const BestIcon = styled.div`` const Description = styled.div` @@ -102,6 +90,9 @@ const MainFooter = styled.div` ` const TextDescription = styled.div` ${(props) => textStyle(20, 600)(props)} + @media (max-width: 1023px) { + ${(props) => textStyle(18, 600)(props)} + } ` const DescriptionImage = styled.div` img { diff --git a/src/app/boards/BoardDetailArrary.tsx b/src/app/boards/BoardDetailArrary.tsx index 7472b018..630e8369 100644 --- a/src/app/boards/BoardDetailArrary.tsx +++ b/src/app/boards/BoardDetailArrary.tsx @@ -6,9 +6,12 @@ import { GetArticleIdType } from '../types/article' import { diffDate } from '../utils/datetime' import { formatDate } from '../utils/datetime' +import HeartInactive from '../../../public/assets/image/HeartInactive.png' + import styled from 'styled-components' import { theme } from '../styles/theme' import { textStyle } from '../styles/textStyle' +import Image from 'next/image' type BestBoardsProps = { article: GetArticleIdType @@ -23,28 +26,39 @@ const BoardDetailArrary = ({ article }: BestBoardsProps) => { 게시글 상세 이미지 - {/*이미지가 없을 경우 기본 이미지 적용*/} - 유저프로필사진 + + {/*이미지가 없을 경우 기본 이미지 적용*/} + 유저프로필사진 - {article.writer.nickname} - {/*날짜 차이가 31일을 넘길 경우 createAt을 출력*/} - - {diffDate(article.createdAt) > 31 ? ( - <> - {formatDate(article.createdAt)} - - ) : ( - <> - {diffDate(article.createdAt)} - 일 전 - - )} - + {article.writer.nickname} + {/*날짜 차이가 31일을 넘길 경우 createAt을 출력*/} + + {diffDate(article.createdAt) > 31 ? ( + <> + {formatDate(article.createdAt)} + + ) : ( + <> + {diffDate(article.createdAt)} + 일 전 + + )} + + + + HeartInactive + <>{article.likeCount} + @@ -59,13 +73,13 @@ const Bone = styled.div` justify-content: space-between; height: max-content; border-bottom: 1px solid ${theme.colors.SecondaryGray[200]}; - position: relative; padding-bottom: 2.4rem; - + padding-right: 2rem; margin-top: 2.4rem; - @media (max-width: 1023px) { + @media (max-width: 743px) { margin-top: 0; + margin-bottom: 2.4rem; } ` const ContentWrappeer = styled.div` @@ -82,18 +96,26 @@ const QuestionContent = styled.div` ${(props) => textStyle(20, 600)(props)} color: ${theme.colors.SecondaryGray[800]}; margin-bottom: 2.4rem; + @media (max-width: 743px) { + ${(props) => textStyle(18, 600)(props)} + } ` const UserProfileImageWrapper = styled.div` display: flex; align-items: center; - gap: 0.8rem; + justify-content: space-between; img { width: 2.6rem; height: 2.6rem; border-radius: 50%; } ` - +const NameProfile = styled.div` + display: flex; + align-items: center; + justify-content: center; + gap: 0.8rem; +` const UserProfileName = styled.div` ${(props) => textStyle(12, 400)(props)} color: ${theme.colors.SecondaryGray[600]}; @@ -102,3 +124,9 @@ const DiffDate = styled.div` ${(props) => textStyle(12, 400)(props)} color: ${theme.colors.SecondaryGray[400]}; ` +const HeartCount = styled.div` + ${(props) => textStyle(16, 400)(props)} + color: ${theme.colors.SecondaryGray[500]}; + display: flex; + gap: 0.8rem; +` diff --git a/src/app/boards/BoardList.tsx b/src/app/boards/BoardList.tsx index 32416e33..432289e8 100644 --- a/src/app/boards/BoardList.tsx +++ b/src/app/boards/BoardList.tsx @@ -122,6 +122,12 @@ const BoardHeader = styled.div` align-items: center; justify-content: space-between; margin-bottom: 2.4rem; + @media (max-width: 1023px) { + margin-bottom: 4.8rem; + } + @media (max-width: 743px) { + margin-bottom: 1.6rem; + } ` const BestBoardsTitle = styled.div` ${(props) => textStyle(20, 800)(props)} @@ -135,6 +141,12 @@ const SearchList = styled.div` display: flex; align-items: center; justify-content: space-between; + @media (max-width: 1023px) { + margin-bottom: 4rem; + } + @media (max-width: 743px) { + margin-bottom: 1.6rem; + } ` const TextInputIcon = styled.div` position: relative; @@ -150,12 +162,12 @@ const NavSearch = styled.input` border: none; margin-right: 1.2rem; @media (max-width: 1023px) { - width: 15.125rem; + width: 55rem; padding: 9px 24px 9px 44px; } @media (max-width: 743px) { position: relative; - top: 19px; + padding: 9px 40px 9px 44px; width: max-content; margin: 0; diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx index 699de896..5f24ac24 100644 --- a/src/app/boards/page.tsx +++ b/src/app/boards/page.tsx @@ -17,11 +17,24 @@ const Boards = () => { const [page, setPage] = useState(1) const [hasMore, setHasMore] = useState(true) const [selectedOption, setSelectedOption] = useState('recent') + const [searchTerm, setSearchTerm] = useState('') + const [debouncedSearchTerm, setDebouncedSearchTerm] = useState('') + const [bestPageSize, setBestPageSize] = useState(3) // 심화 페이지 사이즈 조절 + const orderBy = selectedOption === 'recent' ? 'recent' : 'like' // BestBoards에 관한 useEffect + useEffect(() => { + const timer = setTimeout(() => { + setDebouncedSearchTerm(searchTerm) + }, 500) // <- 디바운스 지연 시간 + + return () => clearTimeout(timer) + }, [searchTerm]) + + //BestBoards useEffect(() => { articleService - .getArticle(1, 5, 'like', '') + .getArticle(1, bestPageSize, 'like', '') .then((response) => { const sorted = [...(response.data.list || [])].sort( (a, b) => b.likeCount - a.likeCount @@ -34,12 +47,18 @@ const Boards = () => { .catch((error) => { console.error('베스트 게시글 불러오기 실패:', error) }) - }, []) - // BoardList 관한 useEffect + }, [bestPageSize]) + + // BoardList useEffect(() => { const fetchArticles = async () => { try { - const response = await articleService.getArticle(page, 5, orderBy, '') + const response = await articleService.getArticle( + page, + 5, + orderBy, + debouncedSearchTerm // ← 디바운스된 검색어 사용 + ) const newList = response.data.list || [] setArticleList((prev) => { @@ -60,13 +79,34 @@ const Boards = () => { } fetchArticles() - }, [page, selectedOption]) + }, [page, selectedOption, debouncedSearchTerm]) + // 선택/검색이 바뀌면 초기화 useEffect(() => { - setArticleList(undefined) // 선택이 바뀌면 리스트를 초기화 setPage(1) setHasMore(true) }, [selectedOption]) + + useEffect(() => { + setPage(1) + setHasMore(true) + }, [debouncedSearchTerm]) + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth <= 743) { + setBestPageSize(1) + } else if (window.innerWidth <= 1023) { + setBestPageSize(2) + } else { + setBestPageSize(3) + } + } + + handleResize() // 처음 렌더링 시에도 계산 + window.addEventListener('resize', handleResize) + return () => window.removeEventListener('resize', handleResize) + }, []) return ( <> @@ -79,6 +119,8 @@ const Boards = () => { setSelectedOption={setSelectedOption} loadMore={async () => setPage((prev) => prev + 1)} hasMore={hasMore} + searchTerm={searchTerm} + setSearchTerm={setSearchTerm} /> )} @@ -90,6 +132,13 @@ export default Boards const Bone = styled.div` width: 120rem; - margin: 2.4rem auto auto auto; + @media (max-width: 1023px) { + width: 69.6rem; + margin: 2.4rem auto auto auto; + } + @media (max-width: 743px) { + width: 34.4rem; + margin: 1rem auto 6.5rem auto; + } ` diff --git a/src/app/common/Button.tsx b/src/app/common/Button.tsx index 3190047c..8439db93 100644 --- a/src/app/common/Button.tsx +++ b/src/app/common/Button.tsx @@ -34,7 +34,7 @@ const Button = ({ } if (isLink) { return ( - + {prefix && {prefix}} diff --git a/src/app/common/DropDown.tsx b/src/app/common/DropDown.tsx index b6e5cb04..ea10e2d0 100644 --- a/src/app/common/DropDown.tsx +++ b/src/app/common/DropDown.tsx @@ -18,9 +18,17 @@ type DropDownProps = { selectList: OptionType[] selected: string onChange: (value: string) => void + left?: string + top?: string } -const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { +const DropDown = ({ + selectList, + selected, + onChange, + left = '0', + top = '0', +}: DropDownProps) => { const [isOpen, setIsOpen] = useState(false) const selectRef = useRef(null) @@ -42,7 +50,12 @@ const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { return (
    - + {window.innerWidth <= 743 ? ( Sort ) : ( @@ -65,7 +78,7 @@ const DropDown = ({ selectList, selected, onChange }: DropDownProps) => { export default DropDown -const SelectBox = styled.div` +const SelectBox = styled.div<{ $left?: string; $top?: string }>` width: 13rem; height: 100%; cursor: pointer; @@ -81,9 +94,9 @@ const SelectBox = styled.div` width: max-content; height: max-content; justify-content: center; - position: relative; - left: 150px; - top: -24px; + + left: ${({ $left }) => $left || '0'}; + top: ${({ $top }) => $top || '0'}; padding: 0.9rem; } ` diff --git a/src/app/common/ItemsNavVar.tsx b/src/app/common/ItemsNavVar.tsx index 2e5bac1d..a9e45c71 100644 --- a/src/app/common/ItemsNavVar.tsx +++ b/src/app/common/ItemsNavVar.tsx @@ -21,22 +21,22 @@ const ItemsNavVar = ({ isItemsPage, isBoardsPage }: ItemsNavVarProps) => { - + 판다마켓 로고 사진 - + 판다마켓 로고 사진 - + 자유게시판 - + 중고마켓 diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 832f6600..074190e9 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -175,12 +175,12 @@ const Login = () => { - + 판다마켓 로고 사진 - + 판다마켓 로고 사진 @@ -230,7 +230,9 @@ const Login = () => { 판다마켓이 처음이신가요?   - 회원가입 + + 회원가입 + diff --git a/src/app/page.tsx b/src/app/page.tsx index 4507a39c..31a0c09b 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -24,7 +24,7 @@ function Home() { - + - + ©codeit - 2024 - + Privacy Policy - + FAQ diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx index 9b77178b..6beddfb3 100644 --- a/src/app/signup/page.tsx +++ b/src/app/signup/page.tsx @@ -190,12 +190,12 @@ const Signup = () => { - + 판다마켓 로고 사진 - + 판다마켓 로고 사진 @@ -269,7 +269,7 @@ const Signup = () => { 이미 회원이신가요?   - + 로그인 From 6c057b39d9d32a77df11d428701b683bd15da9c8 Mon Sep 17 00:00:00 2001 From: ramong26 Date: Mon, 19 May 2025 14:42:11 +0900 Subject: [PATCH 12/12] =?UTF-8?q?=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/boards/BoardDetailArrary.tsx | 2 +- src/app/boards/BoardList.tsx | 2 +- src/app/boards/page.tsx | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/boards/BoardDetailArrary.tsx b/src/app/boards/BoardDetailArrary.tsx index 630e8369..41041500 100644 --- a/src/app/boards/BoardDetailArrary.tsx +++ b/src/app/boards/BoardDetailArrary.tsx @@ -1,6 +1,6 @@ 'use client' -import React, { useState, useEffect, useRef } from 'react' +import React from 'react' import { GetArticleIdType } from '../types/article' import { diffDate } from '../utils/datetime' diff --git a/src/app/boards/BoardList.tsx b/src/app/boards/BoardList.tsx index 432289e8..7e7225a3 100644 --- a/src/app/boards/BoardList.tsx +++ b/src/app/boards/BoardList.tsx @@ -1,5 +1,5 @@ 'use client' -import React, { useState, useRef, useEffect } from 'react' +import React, { useRef, useEffect } from 'react' import Image from 'next/image' import { GetArticleType } from '../types/article' diff --git a/src/app/boards/page.tsx b/src/app/boards/page.tsx index 5f24ac24..78b23672 100644 --- a/src/app/boards/page.tsx +++ b/src/app/boards/page.tsx @@ -8,8 +8,6 @@ import articleService from '../api/services/articleService' import { GetArticleType } from '../types/article' import styled from 'styled-components' -import { theme } from '../styles/theme' -import { textStyle } from '../styles/textStyle' const Boards = () => { const [articleList, setArticleList] = useState()