From 15ad83a2eb080aa7216eb1776a12c1199dc65633 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Wed, 12 Nov 2025 19:20:41 +0900 Subject: [PATCH 01/20] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=EC=A1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-vote-22nd/.gitignore | 41 + next-vote-22nd/README.md | 36 + next-vote-22nd/eslint.config.mjs | 18 + next-vote-22nd/next.config.ts | 7 + next-vote-22nd/package-lock.json | 6577 ++++++++++++++++++++++++++++ next-vote-22nd/package.json | 26 + next-vote-22nd/postcss.config.mjs | 7 + next-vote-22nd/public/file.svg | 1 + next-vote-22nd/public/globe.svg | 1 + next-vote-22nd/public/next.svg | 1 + next-vote-22nd/public/vercel.svg | 1 + next-vote-22nd/public/window.svg | 1 + next-vote-22nd/src/app/favicon.ico | Bin 0 -> 25931 bytes next-vote-22nd/src/app/globals.css | 26 + next-vote-22nd/src/app/layout.tsx | 34 + next-vote-22nd/src/app/page.tsx | 65 + next-vote-22nd/tsconfig.json | 34 + 17 files changed, 6876 insertions(+) create mode 100644 next-vote-22nd/.gitignore create mode 100644 next-vote-22nd/README.md create mode 100644 next-vote-22nd/eslint.config.mjs create mode 100644 next-vote-22nd/next.config.ts create mode 100644 next-vote-22nd/package-lock.json create mode 100644 next-vote-22nd/package.json create mode 100644 next-vote-22nd/postcss.config.mjs create mode 100644 next-vote-22nd/public/file.svg create mode 100644 next-vote-22nd/public/globe.svg create mode 100644 next-vote-22nd/public/next.svg create mode 100644 next-vote-22nd/public/vercel.svg create mode 100644 next-vote-22nd/public/window.svg create mode 100644 next-vote-22nd/src/app/favicon.ico create mode 100644 next-vote-22nd/src/app/globals.css create mode 100644 next-vote-22nd/src/app/layout.tsx create mode 100644 next-vote-22nd/src/app/page.tsx create mode 100644 next-vote-22nd/tsconfig.json diff --git a/next-vote-22nd/.gitignore b/next-vote-22nd/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/next-vote-22nd/.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/next-vote-22nd/README.md b/next-vote-22nd/README.md new file mode 100644 index 0000000..e215bc4 --- /dev/null +++ b/next-vote-22nd/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/next-vote-22nd/eslint.config.mjs b/next-vote-22nd/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/next-vote-22nd/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/next-vote-22nd/next.config.ts b/next-vote-22nd/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next-vote-22nd/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/next-vote-22nd/package-lock.json b/next-vote-22nd/package-lock.json new file mode 100644 index 0000000..76b7bc6 --- /dev/null +++ b/next-vote-22nd/package-lock.json @@ -0,0 +1,6577 @@ +{ + "name": "next-vote-22nd", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-vote-22nd", + "version": "0.1.0", + "dependencies": { + "next": "16.0.1", + "react": "19.2.0", + "react-dom": "19.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.0.1", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", + "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "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.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "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.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "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.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.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/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "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.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "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.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "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.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "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.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "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.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "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.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "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-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "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-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "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.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "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.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "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.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "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.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "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-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "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.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "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/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.1.tgz", + "integrity": "sha512-LFvlK0TG2L3fEOX77OC35KowL8D7DlFF45C0OvKMC4hy8c/md1RC4UMNDlUGJqfCoCS2VWrZ4dSE6OjaX5+8mw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.1.tgz", + "integrity": "sha512-g4Cqmv/gyFEXNeVB2HkqDlYKfy+YrlM2k8AVIO/YQVEPfhVruH1VA99uT1zELLnPLIeOnx8IZ6Ddso0asfTIdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.1.tgz", + "integrity": "sha512-R0YxRp6/4W7yG1nKbfu41bp3d96a0EalonQXiMe+1H9GTHfKxGNCGFNWUho18avRBPsO8T3RmdWuzmfurlQPbg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.1.tgz", + "integrity": "sha512-kETZBocRux3xITiZtOtVoVvXyQLB7VBxN7L6EPqgI5paZiUlnsgYv4q8diTNYeHmF9EiehydOBo20lTttCbHAg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.1.tgz", + "integrity": "sha512-hWg3BtsxQuSKhfe0LunJoqxjO4NEpBmKkE+P2Sroos7yB//OOX3jD5ISP2wv8QdUwtRehMdwYz6VB50mY6hqAg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.1.tgz", + "integrity": "sha512-UPnOvYg+fjAhP3b1iQStcYPWeBFRLrugEyK/lDKGk7kLNua8t5/DvDbAEFotfV1YfcOY6bru76qN9qnjLoyHCQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.1.tgz", + "integrity": "sha512-Et81SdWkcRqAJziIgFtsFyJizHoWne4fzJkvjd6V4wEkWTB4MX6J0uByUb0peiJQ4WeAt6GGmMszE5KrXK6WKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.1.tgz", + "integrity": "sha512-qBbgYEBRrC1egcG03FZaVfVxrJm8wBl7vr8UFKplnxNRprctdP26xEv9nJ07Ggq4y1adwa0nz2mz83CELY7N6Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.1.tgz", + "integrity": "sha512-cPuBjYP6I699/RdbHJonb3BiRNEDm5CKEBuJ6SD8k3oLam2fDRMKAvmrli4QMDgT2ixyRJ0+DTkiODbIQhRkeQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", + "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", + "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/@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/@tailwindcss/node": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-x64": "4.1.17", + "@tailwindcss/oxide-freebsd-x64": "4.1.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.6.0", + "@emnapi/runtime": "^1.6.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz", + "integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.17", + "@tailwindcss/oxide": "4.1.17", + "postcss": "^8.4.41", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "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.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.3.tgz", + "integrity": "sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.4.tgz", + "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/type-utils": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "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.46.4", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.4.tgz", + "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "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": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz", + "integrity": "sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "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.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "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/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.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 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "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-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "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.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "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.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "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/baseline-browser-mapping": { + "version": "2.8.26", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.26.tgz", + "integrity": "sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "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/browserslist": { + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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.30001754", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", + "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==", + "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-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, + "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==", + "dev": true, + "license": "MIT" + }, + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "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/electron-to-chromium": { + "version": "1.5.250", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.250.tgz", + "integrity": "sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==", + "dev": true, + "license": "ISC" + }, + "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/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "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.4", + "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.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "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-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.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.19" + }, + "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "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.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.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": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.1.tgz", + "integrity": "sha512-wNuHw5gNOxwLUvpg0cu6IL0crrVC9hAwdS/7UwleNkwyaMiWIOAwf8yzXVqBBzL3c9A7jVRngJxjoSpPP1aEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.0.1", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.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": { + "@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/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.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "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.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "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-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": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "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-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "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.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "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.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "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/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "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.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "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/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==", + "dev": true, + "license": "ISC" + }, + "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/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "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-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-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "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-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-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "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/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "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/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "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/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "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/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "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, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.1.tgz", + "integrity": "sha512-e9RLSssZwd35p7/vOa+hoDFggUZIUbZhIUSLZuETCwrCVvxOs87NamoUzT+vbcNAL8Ld9GobBnWOA6SbV/arOw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.0.1", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.0.1", + "@next/swc-darwin-x64": "16.0.1", + "@next/swc-linux-arm64-gnu": "16.0.1", + "@next/swc-linux-arm64-musl": "16.0.1", + "@next/swc-linux-x64-gnu": "16.0.1", + "@next/swc-linux-x64-musl": "16.0.1", + "@next/swc-win32-arm64-msvc": "16.0.1", + "@next/swc-win32-x64-msvc": "16.0.1", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "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/next/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/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "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.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.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.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "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.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "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/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.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/tailwindcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "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/tsconfig-paths/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/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.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.4.tgz", + "integrity": "sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.4", + "@typescript-eslint/parser": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.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 <6.0.0" + } + }, + "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.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "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" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/next-vote-22nd/package.json b/next-vote-22nd/package.json new file mode 100644 index 0000000..65f8a1f --- /dev/null +++ b/next-vote-22nd/package.json @@ -0,0 +1,26 @@ +{ + "name": "next-vote-22nd", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "react": "19.2.0", + "react-dom": "19.2.0", + "next": "16.0.1" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "eslint": "^9", + "eslint-config-next": "16.0.1" + } +} diff --git a/next-vote-22nd/postcss.config.mjs b/next-vote-22nd/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/next-vote-22nd/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/next-vote-22nd/public/file.svg b/next-vote-22nd/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/next-vote-22nd/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-vote-22nd/public/globe.svg b/next-vote-22nd/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/next-vote-22nd/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-vote-22nd/public/next.svg b/next-vote-22nd/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/next-vote-22nd/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-vote-22nd/public/vercel.svg b/next-vote-22nd/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/next-vote-22nd/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-vote-22nd/public/window.svg b/next-vote-22nd/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/next-vote-22nd/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/next-vote-22nd/src/app/favicon.ico b/next-vote-22nd/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/next-vote-22nd/src/app/globals.css b/next-vote-22nd/src/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/next-vote-22nd/src/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/next-vote-22nd/src/app/layout.tsx b/next-vote-22nd/src/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/next-vote-22nd/src/app/layout.tsx @@ -0,0 +1,34 @@ +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/next-vote-22nd/src/app/page.tsx b/next-vote-22nd/src/app/page.tsx new file mode 100644 index 0000000..295f8fd --- /dev/null +++ b/next-vote-22nd/src/app/page.tsx @@ -0,0 +1,65 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
+

+ To get started, edit the page.tsx file. +

+

+ Looking for a starting point or more instructions? Head over to{" "} + + Templates + {" "} + or the{" "} + + Learning + {" "} + center. +

+
+ +
+
+ ); +} diff --git a/next-vote-22nd/tsconfig.json b/next-vote-22nd/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/next-vote-22nd/tsconfig.json @@ -0,0 +1,34 @@ +{ + "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": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} From eb51e75ad385fc0665c2d9652721b98efbb30b69 Mon Sep 17 00:00:00 2001 From: Kim YunSeong Date: Thu, 13 Nov 2025 14:48:51 +0900 Subject: [PATCH 02/20] Update issue templates --- ...4-\355\205\234\355\224\214\353\246\277.md" | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 ".github/ISSUE_TEMPLATE/\352\270\260\353\212\245-\352\260\234\353\260\234-\355\205\234\355\224\214\353\246\277.md" diff --git "a/.github/ISSUE_TEMPLATE/\352\270\260\353\212\245-\352\260\234\353\260\234-\355\205\234\355\224\214\353\246\277.md" "b/.github/ISSUE_TEMPLATE/\352\270\260\353\212\245-\352\260\234\353\260\234-\355\205\234\355\224\214\353\246\277.md" new file mode 100644 index 0000000..0ee7015 --- /dev/null +++ "b/.github/ISSUE_TEMPLATE/\352\270\260\353\212\245-\352\260\234\353\260\234-\355\205\234\355\224\214\353\246\277.md" @@ -0,0 +1,20 @@ +--- +name: 기능 개발 템플릿 +about: 개발해야 하는 기능을 단위 별로 명세합니다. +title: 'Feat: 로그인 기능 구현' +labels: '' +assignees: Tutankhannun + +--- + +## 🤖 설명 +No response + +## 📋 할일 +- [] +- [] + +## 📆 기한 + +## 📝 메모 +No response From 553aec13622805adc77bb55df97f94679286f372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Sat, 15 Nov 2025 06:43:50 +0900 Subject: [PATCH 03/20] =?UTF-8?q?Feat:=20=EA=B8=B0=EB=B3=B8-=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-vote-22nd/public/ceos-favicon-1.ico | Bin 0 -> 256670 bytes next-vote-22nd/public/file.svg | 1 - next-vote-22nd/public/globe.svg | 1 - next-vote-22nd/public/next.svg | 1 - next-vote-22nd/public/vercel.svg | 1 - next-vote-22nd/public/window.svg | 1 - next-vote-22nd/src/app/favicon.ico | Bin 25931 -> 0 bytes next-vote-22nd/src/app/globals.css | 26 --------- next-vote-22nd/src/app/layout.tsx | 31 ++++------- next-vote-22nd/src/app/page.tsx | 65 ++--------------------- next-vote-22nd/src/styles/globals.css | 41 ++++++++++++++ next-vote-22nd/tsconfig.json | 5 +- 12 files changed, 58 insertions(+), 115 deletions(-) create mode 100644 next-vote-22nd/public/ceos-favicon-1.ico delete mode 100644 next-vote-22nd/public/file.svg delete mode 100644 next-vote-22nd/public/globe.svg delete mode 100644 next-vote-22nd/public/next.svg delete mode 100644 next-vote-22nd/public/vercel.svg delete mode 100644 next-vote-22nd/public/window.svg delete mode 100644 next-vote-22nd/src/app/favicon.ico delete mode 100644 next-vote-22nd/src/app/globals.css create mode 100644 next-vote-22nd/src/styles/globals.css diff --git a/next-vote-22nd/public/ceos-favicon-1.ico b/next-vote-22nd/public/ceos-favicon-1.ico new file mode 100644 index 0000000000000000000000000000000000000000..924d49849668c8762d84093b4b907b7e9f07a1e3 GIT binary patch literal 256670 zcmeHw37i~N)qRCv!lIzarhGUc2#72Kk&tA%dnWtzOwUY05d5-~r$c;2Pi@;4ol1utU5x zvQa#0-Ix52w_&@z(TKOqG*nk*$_7uKf$ET>tXrvN{=?)4f;-0x-JCg97!?yx;3VQoEQwAn~Ro60E`xwc54ZY4k) zKgqH*ZQ~DggeIVz{}lLjB=CEH_WBUum9ORe9qo+QfE)3QhhY7QWXCkE2l_gu8+|cp zC#c(uDlg`%1hg$3Yl59mpl%;++z@=)2lx)~3{dHEzF56MyI>{oO<=d41E);D+KA6b zTR{tL1JMP(W*E6xT}VL1_A~luGqv~-1DGS^m4hUKxaG5B z^v>4x{YG%$Z$Pc|_90`QjX$M0=J8$aw^^zXsm)qVLr!u>4W z_a5Z&b?5;2HbMuqHlm)?6oA|zuUO9#FgrrVJA1e2av%A6J776LyEiChdok~sfLu6+ z;iGI9C6X9#D2qs7JW8M!{_pQ&oGkJ)eEC8#+$66)o+O}JrW$Kd z_G|x^w#d%N!}kdHJ#*h_^Zc520ChmBC1Ug}kp98(#DkzdYcK3owqYaRa=aenZaDL_ zY7d()p?$HT#x-DEWMapc`!3-?Rbee{R?kr@kZLLGp1 zlyQ<93=`w0WDyC}f&`c!)7S}X#=Z$cd0ee`MEudvmbT1m;rq)o1Xluxe{0qG+d{1K zUn|@%yY6F~$~kBU)NKKA*j%!R1gaqc9iwl!>^}5^GUH;R*k7L-XWfKSSzVN9EZ3UU@al?`wMFN$S0Ak(izG%#S^C9HH%Z2+D z*L@r(aQfSa&V&sheF2rs`*JVLzlFGUX&=8?$cOI>|0~Xa+B`1CYUqFu>39Jh(iTu|4g~r7 z>bOPVzV`F)1ox%vuZ=#BxA86Z2Mo1WG|1Ug-o1dS+E!Czy$?7I0)<;(_h?Ep$Z$DXik|Lu{_o)-Ssr2e}HbBJulc|>Fp z3HT`iw)une#K8dPu#+;s_GEw<0pUj40Gv}<7LkA-5>Quc<$&=V*b9V)BzU(&b%huwI>hu1Dwe6e|2+Xsh?iX z7YXP&e2||w*5~iS|8b%JmLvZ9h6%(9l|>{_ssyYUAEDjAeVMPj_R9NwHrPt^0dB>9 z09ix=rAh$2r|sVcB!PVSO^(%;T+jv((QN?iyOBjCFjfgL&U~8xX9)Mljqam=2K+QI z7NEIpte;-a6A9=!=-0J|Ij6_9!vAr@f7)YbComQ$A@PB0hQ*2KOd}rpqApK4R-5Cr z5I@iATeoa%J+?kw-^TASj~>fk)Z_3y^?s_2bL>Uni-Y)EQOpB@bvYM~^#wM={qGU} zk1PIPhnN5xat>x$sw06E#>)&q|FSP;n8OyARU_xfZQ1~F+&Pw(aa z-S}Rc0>0%1xsbaA*yqCe8NpRuX0x16wPH@ZR^5NLE4~NfwuiqAd=KFKxc35_Gv_&= z8+a3V7oZ;p=h5Q+tH3kBqrhK);QXQrFf$};4 z+x{72Lij&^Wbkj~i!E73$WmSj^e>oVq!#UI#lr?)EFOkF48D90I0Cp7xDOz|djY?A z#QEXZ0-P7_PT)KMad|>J!mgMUN8JGX0CZ9~W{jmR*g8Kv4eRxQU(YSqDZeaN;d^mD zw(@5F0AHQFO2*PLaau9|Z7f6|8OC8c3-~jz8t4Zqncw5M-%9{(i{tT(D7zacF#MTgvD7?6dkytS;lJ0s?&WvMcErFzj783Mjd|{kRQt3I zAmg2ZuL9&e?ele%#^|f&>e}4#I z0)9Q0T&Mi9n{OV-VOq_oUiG-!}bH( zCcCVeGYx%uA>EhIi#`Z7cWz!m;J19|V}VNBF|{nq@$hV{ud%Hu?{}4h-X);hz;z#- zZqp<0saKZ+Y@Ztsc_H^1sjn^oKHD2@0l!&~(fxcQgo59Y|0e*nC33GL`?V_**4J2X z8}Uu$fHw&YEt+nqLl0p7H&ja_ePE^l*8sI-x3!T*N1)&XJI19<1fi!%a3 zI^X|mK&{(1rO2Tk&*eC6j@Qn7OWE)y0hWjCHz6nb;9~yuv<&CxGMd z&YPj%0R8=F%Y=_nstvwL7XQD3weWv@eS5Y8$N2qZ@h*WB+VRz#PVKV;{!fPd76Fd{ z^~U?$_hI|Mt-#dR51azs2mQykPK*Ci{~v$fpZ&}&{C={yOF*@-9!y_1w(D!3y$0<6 z7zkRwH*K7+!(WL$zc&95$94+H)fuv1yE36)NHf2oEbbDZoQP!mY}WJV0uKQ}&EMqu zZ-CEQ^ZbT8uq|=F##eq=gKst!aL@b!{)NK3Cpyx0ZfkfG$m?W)z7s*^zVp4=E-)Vm z1I61xt&J)Xt#h=7obsxr?KkkvpudIxh16RQd|`%K=)b4^WVeQ_E(fHX%hr7yfAAAv z9pEj0lk=T3Rq~i6$~@ylWiC4%IHSI>^fYCj_7#;pYLQB`H!F<$@Fp9tGA#XfFQDIg zTlQVcGExHc;p<({jB&K=(~o=_dHWWCZQ-@{9c$rv*!S;QHs;C4s{UJkr3RmRObxyI zvKs1swLXD&8+?4F>c8=Nl|12ae5aby0S|!tn+g9%a-TlD$xhh(*0}oJk+=UYy!S!x zwKu8McbBTcr=L(mZ>?5CZ@!_1R=-}~;5*`72Os~ZGGP;-EU5*3&1d+n*%q11_H0>( zCD0qixceC5aFF}4@ZONq1HyeDxDWf+JohX$_~LWH;C-%MqYilHDP^8{a;?+_E;2hY zCKbLMvRD#OO-)AcHcNEhKFWT?*$8wSzklTv+WC^l9jpddK5Uiyx!efKK6Jpq{r9Tm zVV%|10rb_v*w3)>K}WOD9}=KnTkis0=Chw~7vMg?KMn->S}6NdS6mXzaz9tMz0s{w z-|MpaJ*t-{*jB6i{@2Hv0?+?M40BgnZTx8O3x5)_`J-^(C*8+(?*r$mfqU)>cG++1 z0oVZjxBXW4e^fD#aeUXOfWUK~0>C(1$zdi;4I=m^%cT2+|Jm&T)i3{lX10bmVEzy45=Wm0-+%1_9j}Yyd1UOW-{ro2J>h>X z@t-jq76C>A{;fe>%=y!8-`>wd7L0LKU-oA$y^rv}miYe^V%BWOxK%-27`uaW@W8)s zBk=wP;eMHQpYXqy`2YQPXCGknMrQ<-{zhURY#%FTA7fS&KW4p_%GUAlEW-a<;s5){ z?~ROI+1DCO{JivXLFxE&(-Pw z`&+Ut^fAWzNMIh9ATDd?bBqt(-V$rYPnR9g|+x7Uqs~`_4`zt8}DgU!|KxNDS8_?drG4ed(SkDh6|IJn% zyPIYIuD~n8{|f6r;eWOGzY2MMAHcSKJ+IkLhW0|Ef8h)x)yZ}<%>RDSZpP4}J;$96 zNofA-`ak2HG47d^|CN-1@V^@TXZ!Z4uzOkde*$3Hw;vD&S^mwZAWLTWbRM2eI2O$Be*qo`XbbQd`vRyNINptMZftO$$9sTxfad|my}k{&2sj1^ga7}7 z@^lh?h_Fvyp-nwvtX+ck1;oy+wWYWH0Ndu_JV&nq!v9LkK=@w`{`;NJhrk`i41EUp z9dHIP6EQQliqF;aVKP>}j-%6uSUR<`^v(_Gd8+ZOhXI_U#&5aE_1t7C{I3W8=ga5R z2P=Uezz&F_POxQvd!sII?YKJC)&sqB5aVoKXab(`D&c;Wbf56QUit6T35+TB5O6lI zS3DNp5NqvkXSF3($LEk^o$wqS>+=ZUd|uhElstt0LEyiWPpiSTYk+3>9CD1kwh7iR z!q@|hyRGDszBl_o)&S0Dlj1V%;=bn#_p7M; zg#SV3zpV$}01wXtwl@)fGag0Vyv#93;rsU?-0!!-f8l>c^FVFK|F-#9tu@=?7RFmb zldv|{N9P);_NisD1 z|5-kE1IK{-s1I0v#eV4kT(<+DPqUQ6)slhmU-<8y_sG%n;VZN`*61h1ctaoR0=O2( zEpW_(@V{Cz5dI7Qz2!aj(O-)`yKQL)teYP)1~4~oDGRQ58X$9fd6R#6bfoZK_+MQ9 zy9J!xK8|sPYdYa8RKmDITxTgD<9>>hzrT7w_%Hk~KL6c;`8ju>|4t9$m5)^ifcy0Q zk(eLF%ilj8Ap95pk1hY*j`o1@qR;eWn-;r$rf@0a$sHg2e63AB5UC4lqJ1Z3==cUhOt_uP94|Aqg#d7}7z`U@Yz zn8efpUTpxJa{`bA{Lj~NO>Z(4{tN&8;R^lu_fMewPoQ7W%YxrCwlQN9dCRNvJOAY* z{1^WF$E&;G8?+V24TICJDgeJ}0%$waW07fRP+!z5&<>o8mWj0RES2a!qeC75)qV{pSjO`cGZofw>7WPM|m1l-CaELpvdU zcd78diuzCZFZ}nP|15i6fKT9Ou{IJN`F#R(n$-s=K0xL92JSY1@L%{}zPxuyyuE1y zwgu!{()#mUtV6l4sP!S81eQ{mI)At zPKaAE1y2$FS4sZ~|AqhMj%j1{Wt$o4ZXEGoBOL@*T)7Q zeLy7^&sPcPM#+=Dz$hx>ZJ6iew<{N70?YA^n zlE)pSlE)ofANbNCYT(Y_tD$$^QbT-4^4utupKyjueAhIbtL z;Jsm60PjBVzg64NIgIs7q;%e zefL-#c=sKp`uddW?;pm%fKv5_e!P?Yj;WNT2WStF|9`qoB^JyYDXVIHpZd8cV}+f} z_#m8P+`06@{%6}D(vJls9#Eyfc`Ty(ufI|at$Eif6K!4uZ5@y6Izj5Pi=^&fo;>)6 zWLx7#fRp|P`A@qb9Z&d4Y>V!#qzuruXP*95HT3>_RyiLu-rMgB8;9)y$*&w?wRKkV z8wBHCtHAADG}m+d0sAnw=)nA0)C1oV{#RK4f&Zxsms$L`xe&;83hkY5D)U>X3jfQa zkJt~enEW?$_@DLzf(;Pa4e5*}CN@B&WPrNvz#X^hyg#(|ze=$_95nu?Of~f1|7aQX z|9ZJfv^PoqD^LErxG#orzYDW{0a+n1;SZ?h&YuA8pDX;Ykp5%)-@&bF@ShJ_?f>i# zV?7{_Hb7esuVc%cd z{ulrMa`WwiLj0#ukZ4ETK#U8cC#R*e6} zZ|efc?=t?k40*}B9(f2{-qxM}5hIRygn$k4`||vwSDKhw#7@E$Qj!dqZ1aRR-|*dP9*O>FRmXVu`!hwBPM zFFl`a_e=Y~xBTKy{_6&pck{x3tplR)7qrF)?uzps0V?^d^?fh5@}In*Phh=abxzz5 z;eRFb`P<;|9$xvM#QY&e0|{}~I=bN%1u zzP(O@|2W@B&7V#kKs!L{0%O(TUdw;B{~oKLxHD_ZWQe|Ahb5&Fh>Gq+u+)cb>yJMX3Y& z&^LhVF@8AxiYlSM>gOIA{y&yI{@+X9nZGGqMu0OHxruYWlm>%4#s zpv(UUW&D46dGsK7x{Z^|W8F?h5jPY-%n<4T#tr!`Abx^gzaRPk#h4m==>GivaJC)* zF9z=Wn@S#g(D;mvhZu*9>p6(n9(m{e$-L*AYT(|x5&vgS{pfhFd7*N@`(vW5>BD2? zeC~O=O|adXM+9-iKMMYz1AG9;H}oh2bLnYn@VTc8+W_PT?0|tk->#B}by_xn$7{QO z2k0PeS8$FoZbxBb*xP>GgWNxQvF3GVjuV^j&Nb#g8GPz7#6mvN-}m$59qQ{E*QrC7 zj3bj|JGlt#FCcM zIYO=@7Dp2Eahd0ysZu|_Sf#G~p-NqRt};(O9&_*@1|P>AmGX^f-(Y?t&gr3j7@d4~ zZnKVqm|$kt8Ku8hDbE{>a~a>WB)%6qS=R$NX2|jvW}LCh02w>zny6eAu`=|rhAMnacD)s&I6#ACOe!sEEA$aGoZhiz%h{7cwXaAs? zt`ERx=tH$kl5?i$`ary6I{OGd4V(=yzBuP3Ecg44zw4vU&6wZ=cmHX0?y$~` zvBBojZ+I&=i{*Ys2c+-gRR{1sXwMva`32YKAGqTdl{}=)+w)6a@gpzai8i{8;^?!h z)S?!nZy-9;NO0^B+6CTZjM296&cJEFqkswc@ox2V4Yrx1U2fnXu+dp3x4GzC+x+*^ zW=2k)TtvC=ybrhSdwJ0TxL5MTqek!3WPj%0|DuwJ1yXVwqvV}p^8E$mU<#icY`>vpNHr*%NelN|sXM%w`n z9l-OSSgHL0rQEN0S%yBOw3D$n4=#C_xA;k z18x8w1K5WcSii#5`QKDS=#yhvYL)vQ+T`tW-_7R^oMiuB|1YmqsUMuL+xuMm>e24t zO$VSZVA}y0zeFD=^V=TVE5>g*TdQ{IP03hj5>O4Qk9tqeIi}`?j6Ue5;kk%)J%zqR z+dyAU#rkOABH&iwVc=EZzd$cQ+lKv%oZrN@8@T2^=RHmUJ;3__+a6y7YV|vfd@lIu zq%OS>^Mt`a&a=&ra=!@fCl=4s_f38G+qzxRlMcXdUHc!{o(Ubm`aXS}Tz@~FzRUP| zR`TF@#_z~C_vfhOtZ?GcqD97oxMx3Xf`PPMfM?hCK^%Ss&<~Rlmvk!}V?PG%ggF4` zH9r>kDsT$$_4JziM*<6hCSVU>ci_*!NS@W|F_h)>iPv>zx4E%(xlistFtYA#*X7e~ zdb-?)4-oxyGJXW~Mf~nke{}%l%5e_5kH1!BT;I=y@-FmQ+WlsY*#5<;6*IE0p+2{x zWgkF~fxlyb9;>(n=h9{vKm50!)y*HbRPNjN(K^6yJ3#vPtC;6*MElxgawdpNUwcMZ zd;&6fpo-t2d^%@L+=tCi+rs93W{qP->wu+V+h^ogQ)LV5#w_#D?>94u^hdiwBjOh# zj=5DgsK0hZ&3*Lm7iIGo;=UvAiVn!58y)hgO}^(o^Gf9VZOMPLwJC7?XPqaF?H~in zB3C}+dmr3Sp5(!|$8P7(t?#?ZgE|2Hee^Z-)+V?#Z3pDDE9y-4ZnCS5^s|y3;6Rmp zeyXi-=<5)VX{Z$wcgKP(>AO0_#ZH*Jm^{=&g@9g6% zmHS$5V`vi;9Z=2u_6qVl`?_KO)}GH#CHRk6M6CO>-{Ypb;y%U)F-DK}31s>1`(Arh_1}OPVWrgf-QH8{fN$yX2;OwSGVu>^lc_)H98dqH zcxyBIyr&y#_Uu6NKV9~323g!wcl?JBaQ|w>tL?K;*F%YKd<;+UVh%P;-c{3JjB)9rqPD<4jevn{jDZR-Hn zegTYK#5iUhTiDHyxemWqh4SDVxX(2BZW=vH<^+-Y`knjRr=q`8xBD}mK;3bl@%hcJ z|JAWG^S1qI9RR-7nhro;#lRnKMr_d8_4iGxpU*hX^|bz`ITMnIuVK!b7FhmM{{b68 z9*iqge|e34|A-OjI&To;cTxv@UDYw$L-$fp8Wt{!qXfWIRoC?oGY-7X+p&mS=ZnO zg+33E1?L^QzV7)?Jz(pA>#D2+H21%x1|NNJ^nMA{4U#7uF6FZh$$+t;d=4)Dr-)(2jCLE8RG&y$R6djtG? zK5oVG4t9H=Q}HS6Sp3&>9M+}Z&!{@B(mJ3R?xWt{|Fg?5XDR0SES&>Ey#~wupC>t< zoxbf--*?jA=v_S5=6?s|RA1wLy>iCZ0rU@as|(m|f~R4gZ=UD%9{gP~+B6{Kj=Gsa}J>24|TvXMdjss%QspF%vSwg z`UW#P;49v_Sq%4C?w5NkQoVh@k?#{ne*PYy{d?lb;{!9Ltv^@aK|Xf*U!Q)zBlAV! zGTYVxR~O+QaGD1lK<=N4c7C_EKGyd&_gU_H8iV{gzTf`=v~df+SMbu_gFH@2`?Ko& zoty7v-;x02WF$JY4!A(_kli;3JHWFJcvP9A=>X0BEDn=$3XkE4eUAcgzJSRz%h^JyvPK|>_>o~j#f^YUI zv~AIMgL6Nw3h*~%-~R7_JsG>2bM~24p0l?w>uM*3eh_Bcj13^SD+8Q&M(Vw^4oG>i z1M=yBV$1#FxzA^&{l61nm}|a7S;)&D!`g~pi?OV-xJ!U@ zhhnY|&Kdf%faMu?eq?mO<>(i1o9EkM2c%;Sdamz}jr)B5H_@*B8Qr!WwZ?G47T5yE z>Brq2fbYriyMF@0gB>$r??VS-zRRHxZ{nWuVATIknTCZ1dU=_yw>IsK@X6EZ*xR_^xk3 z{b!=QPhu@gaT3sFN2lih<#n1*O3(Yn=m7E>b#49T@syaw+gfE=H-^tXmMQm3=03mGi$DXA^}!j(S^s(r4+Z`PuwQ&U zerNLjQedA%6zx^eafvAX`Lf?VOAxZ-DgpXKbG|Rgb=f%07nRG)SvtU_J;3I>bL}tp z`QDEs|8HA}14)eQ?&*YY7dR5fSa+C!UQdAZMTbsy?)A7dSEv_H>DTe?4se13mlpczO5RF;DBp^lkOBu&>8#v-%0}osGo2 z&;+yRES5&Q(8E?5tExwoIcVL87V_%m=ius@!4)1*}{S@x-mj`Q;V@|%$oNLaQ% zb--Mp2k`T|*6+3Ky1*5eSaXV@?SDj@A9>H?ue=CE99N{41 z`w#r}PGv4TT_rj(hL^wh_ZhnQ?Rpo@8*@Hb5B5yG~ft; zb?_U3dw|D*RRI0$X)n*oN!^Jx8F5B@$0%q`5h#W{zNdEQydTzZ;Ho_M56 zES_Hu-czQunU4evmgjyfx-S@YiFg$4!Duf`&jYQw83!lL`7<}bZ$1LPGOz3mFn;bA zfDq6On|&76VSqY=<;ku<1Fo|r`sXM0&LhutTNB$L5OWe^@}jeJ9In2$*@lYk=f`Wv zHHwq~z7fAM+l1}{>YuOWdPnMkT=-w++uw&}Y$H(Q*Dn6&j1M1g!`yf+s56kaR({dj z+;;=@2>o-^5zQEX-&Fhq$QfmoKoWYmf8iYZ0I+}6&R?>wZCSj8I`XF(yHysEKq(R! zJTTK1bUgU)cUzC>k@Dz~yHO5r!m?Nvkw7UD7+9F;6FLC=|3GYjabW{p+}DZt^$R41 zbt!pY&b1@}&Z8a|VgJt)!vC7*KgahT#BXN8e@hmTK&cX7`)+S*nEsVl3;%1L|J|tj z??(P7n%YYJ^m4vPz))@Q57jn6_$aJdzDT{jc4hF#czbALz))S1c|`)HOJFU=R9L=O zx?Fip_+Qid?;D)2QT${|&-ZeLVF_5iz>Sl^{hNgUHOqg_T{{K9m_BLyAI`n9RjLH6 zm=W5a;~3;G`j<%^p!Q_&C-nJm>Ne)D)Vv_)2U7x;4`_HtaG!qL!vETm0d?{T^rwr< z+_k|ZXqn%-KRVOspReNqi7#Mnai6-F@qTs!g#TscK~OJG{xg389LFKPK((aX1bwP)-S$h`qwT0N^9wKjW~84NzSfFwO?+W4dlu&TlW*770)S zLv!cC2GFsXV#s&ZhzTb;XIST4hZwDs7^hVhkw7IR(9c*8m`eh6PR0dc+$Z5nSLtcD9_+K&pGrr%! z3B>E?JoXChF|vpRsv&{iIkRAU>i$5s1&U8lW!eF*LQL+BtT7o9nvWNt#ErBHGk%SIFyveP>|2qNc4=9fe*w^2h zz}VikGi2_YYUg{oza;^-1-^4+r}jTVo4~%vqtA*C@LdO*km>1(4z{;88h!J`?ic>m zjs%kM2k6JxfL^ODU;*+f%PO%0{FA}eu=_u(+gxRQZ|!7!d6J9-QsBSU7J#{++QMH0 zIOm(_fYN2~N67J$fVQ#Xh{q_4NT3!a!1;ob&;w@s48{sO51`#DI$-QFcmU&ic8kNl zT0gH5as9;Zuf=>X&onFn-7f`yG;7Z0@DIR$i5WaL{{IWI+lTG^YS95QKi+T_ldT$- zfLc6F`=lZ7a^B|6u)bV$K+!f3=h2?3`&SWn!Hh|Je+_4Od9)k}sM)jGAE?Kr^u@Fe zpdBD}0dID|qu~7%`t&E+o*I>L{W;l7cE^DP`r2opy$bUOYX6|frr`g%fW!5*V)%;M^e`qe2~kdh8_d|Es_nK-vVeWkA14&aJQ`=kDljn_vZ)(3j$H?nV#vBRDQL(1P;3FlOZpbD z6=V0nSIS6ozTW-ztLM)y?m*LHy<-tG55s4v<)fqF1L zZ???Sos}zOCrA=V#F~uw;ttjYjNVvy0@nKh*8^*TdeH;4YaRuTg8wf4p>!QcV)g|o zr^~yJCIPk!kQY|_KzJi;&jUEe(0Gn7PToHOoSKM5wzJ~(AXZAJ6+d}2c}SW_AZQX8 zJaD?Peh%Ua+kFJFFnxyDHt=lqmz?_gaAe*AtfADAIg1ML;@m# z(j>rg)TB+o@)X>HO~81gobUc%;8NgWfaPzw`w;1?_dLLI{#4)qwBv1_jIxZk+AmgL zzfk(}O8eY$wn!ka1lG-)W~`mdIfyM?z;bplHfsX<(YL^{Dc~S&1Nze54m<{|1~}%3 zF$lcq2F_zL0I&|vvYlN2J8%tf3NQ<3!1$a=dMX%(hy;9>fEjHv zQuCTn$A%99{AhH4I<|Y@I}dJt2)bcg*b2MDc4!1=7Xe=e&IG;#a6Iy5z~#UXfs25p zz{$Yjz#L#7TxSQ&b-HO{p6;8p%6RG?@IBdz`8N=cN8)k${%PfcB7veLpjxIHYh$y( z$3|m)2Xq2rWYRWZT>(5EfsFm2)AU@%BYvaLLmM9FI(~hB#x;u=eVr)pWo%AS-zEq@ zRyj)-UV2&1F~{xzWir`uAZK$e(13n9aYoi=(n_D0bGvAH6XzRYoSc(W^$ z9vMF9*vcg5mvH9w3cR5H_|`S@W&yW!ojI)Y^9sO`p7#rO4?lli0lB5GaGbx)Ar^bH z%aIY%1FUeKUvm1g5g#!7`sGfKjJSVS*83HcjxU3s7d{^shP(@=>x>a8oW26* zqfjV#K9g~SLh0#z7b%q9jkB?A-lbRezv1^^VI7*>Whd$NaC-XigaYYVv>Coc=KL&L z#OIc7>#suM^_pHt{Py{U(rx|T z?UadQ+b!KL;8!@#ac;V$+vQiG^X>F5=S8!&tveJ>w~V-~Q?hsTEwT?~?P(EY9m&~Y z7Rfo3wcFs5&Ns+9A!mo*Fy~PAu3P#tm-8E3((!=VH_X{{ONRt=&dAwyOJC-4e#9lc zp~UpbF6U1yF@1u|`EKck%lXE#9D(QVx}`^QPsrJC$l1@`Ej4}f+zaOHyQNRg`F-xL zTl&P@6LR(^cI6z%*>y|LF*X*qdkB&^SX0yI=rvbNBP8- znOHavxtW1p(^m{XQr4Db#1)pIo!*so*6@y-ndp|@K>1=BzGC)PgH9cLdc-=v;3r;I zV!CyD!8~q#-ohNPKVP97;+AfIoH;O=ccc)GI8edbJNp&&pdu^dirxk3SB=TW=>pO0o{!RAvi%-wy@5uB0O&|U)nOC$v zX!^ffdM4XtPR}kvN=uY*UZ{XKj5;ggN_~R0rE>%|4iS%;O)~Aia4&A Rv#BMJb1Z8YHy9!O{|~|TP8 \ No newline at end of file diff --git a/next-vote-22nd/public/globe.svg b/next-vote-22nd/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/next-vote-22nd/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-vote-22nd/public/next.svg b/next-vote-22nd/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/next-vote-22nd/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-vote-22nd/public/vercel.svg b/next-vote-22nd/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/next-vote-22nd/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-vote-22nd/public/window.svg b/next-vote-22nd/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/next-vote-22nd/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/next-vote-22nd/src/app/favicon.ico b/next-vote-22nd/src/app/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/next-vote-22nd/src/app/globals.css b/next-vote-22nd/src/app/globals.css deleted file mode 100644 index a2dc41e..0000000 --- a/next-vote-22nd/src/app/globals.css +++ /dev/null @@ -1,26 +0,0 @@ -@import "tailwindcss"; - -:root { - --background: #ffffff; - --foreground: #171717; -} - -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; -} diff --git a/next-vote-22nd/src/app/layout.tsx b/next-vote-22nd/src/app/layout.tsx index f7fa87e..a6642f1 100644 --- a/next-vote-22nd/src/app/layout.tsx +++ b/next-vote-22nd/src/app/layout.tsx @@ -1,34 +1,21 @@ +// app/layout.tsx +import "@/styles/globals.css"; 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", + icons: { + icon: "/favicon.ico", + }, }; export default function RootLayout({ children, -}: Readonly<{ +}: { children: React.ReactNode; -}>) { +}) { return ( - - - {children} - + + {children} ); } diff --git a/next-vote-22nd/src/app/page.tsx b/next-vote-22nd/src/app/page.tsx index 295f8fd..0c651d2 100644 --- a/next-vote-22nd/src/app/page.tsx +++ b/next-vote-22nd/src/app/page.tsx @@ -1,65 +1,8 @@ -import Image from "next/image"; - export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- -
-
+
+ {/* 아이폰 16 레이아웃 */} +
+
); } diff --git a/next-vote-22nd/src/styles/globals.css b/next-vote-22nd/src/styles/globals.css new file mode 100644 index 0000000..932c29c --- /dev/null +++ b/next-vote-22nd/src/styles/globals.css @@ -0,0 +1,41 @@ +@import "tailwindcss"; + +/* --------------------------------------------------- + Color +--------------------------------------------------- */ + +:root { + --background: #ffeef6; + --foreground: #000000; + --color-black: #000a19; + --color-white: #ffffff; + /*-------- main color ---------*/ + --color-main: #ff4093; + --color-main-light: #fdbcd9; + --color-main-extra-light: #ffeef6; + --color-main-dark: #d8016f; + /*-------- gray scale ---------*/ + --color-gray-50: #f8f7f7; + --color-gray-100: #eeeded; + --color-gray-200: #e1e0e0; + --color-gray-300: #cecded; + --color-gray-400: #a9a8a8; + --color-gray-500: #888787; + --color-gray-600: #616060; + --color-gray-700: #4e4d4d; + --color-gray-800: #302f2f; + --color-gray-900: #100f0f; +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/next-vote-22nd/tsconfig.json b/next-vote-22nd/tsconfig.json index 3a13f90..8dbe1b4 100644 --- a/next-vote-22nd/tsconfig.json +++ b/next-vote-22nd/tsconfig.json @@ -18,8 +18,11 @@ "name": "next" } ], + "baseUrl": ".", "paths": { - "@/*": ["./*"] + "@/*": ["./src/*"], + "@/components/*": ["./src/components/*"], + "@/public/*": ["./public/*"] } }, "include": [ From db9000c325721517cdfa8dfe8f75ac6c9bfffea9 Mon Sep 17 00:00:00 2001 From: codus02 Date: Sat, 15 Nov 2025 18:33:58 +0900 Subject: [PATCH 04/20] =?UTF-8?q?=EC=B2=AB=ED=99=94=EB=A9=B4=20=EC=99=84?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-vote-22nd/public/icons/main/vote.svg | 21 ++++++++++++ next-vote-22nd/src/app/layout.tsx | 6 ++-- next-vote-22nd/src/app/page.tsx | 42 +++++++++++++++++++++-- next-vote-22nd/src/app/splash.tsx | 39 +++++++++++++++++++++ 4 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 next-vote-22nd/public/icons/main/vote.svg create mode 100644 next-vote-22nd/src/app/splash.tsx diff --git a/next-vote-22nd/public/icons/main/vote.svg b/next-vote-22nd/public/icons/main/vote.svg new file mode 100644 index 0000000..d31779d --- /dev/null +++ b/next-vote-22nd/public/icons/main/vote.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/next-vote-22nd/src/app/layout.tsx b/next-vote-22nd/src/app/layout.tsx index a6642f1..ee30e4e 100644 --- a/next-vote-22nd/src/app/layout.tsx +++ b/next-vote-22nd/src/app/layout.tsx @@ -1,10 +1,10 @@ // app/layout.tsx -import "@/styles/globals.css"; -import type { Metadata } from "next"; +import '@/styles/globals.css'; +import type { Metadata } from 'next'; export const metadata: Metadata = { icons: { - icon: "/favicon.ico", + icon: '/ceos-favicon-1.ico', }, }; diff --git a/next-vote-22nd/src/app/page.tsx b/next-vote-22nd/src/app/page.tsx index 0c651d2..fe95747 100644 --- a/next-vote-22nd/src/app/page.tsx +++ b/next-vote-22nd/src/app/page.tsx @@ -1,8 +1,46 @@ +// app/page.tsx +import { SplashWrapper } from './splash'; + export default function Home() { return (
- {/* 아이폰 16 레이아웃 */} -
+
+ +
+ Vote icon + +
+ + CEOS +
+ Election +
+
+ +
+ + +

+ Sign up as a member +

+
+
+
+
); } diff --git a/next-vote-22nd/src/app/splash.tsx b/next-vote-22nd/src/app/splash.tsx new file mode 100644 index 0000000..b932cad --- /dev/null +++ b/next-vote-22nd/src/app/splash.tsx @@ -0,0 +1,39 @@ +// app/splash.tsx +'use client'; + +import { useEffect, useState } from 'react'; + +function Splash() { + return ( +
+
+ CEOS favicon +
+
+ ); +} + +export function SplashWrapper({ children }: { children: React.ReactNode }) { + const [showSplash, setShowSplash] = useState(true); + + useEffect(() => { + const timer = setTimeout(() => { + setShowSplash(false); + }, 1500); // 1.5초 + + return () => clearTimeout(timer); + }, []); + + if (showSplash) { + return ; + } + + return <>{children}; +} From ebcfc06476dd2aaee6e1361536797341fd9e2223 Mon Sep 17 00:00:00 2001 From: codus02 Date: Sat, 15 Nov 2025 19:16:43 +0900 Subject: [PATCH 05/20] signup page done --- next-vote-22nd/public/icons/main/back.svg | 3 + next-vote-22nd/src/app/login/page.tsx | 0 next-vote-22nd/src/app/page.tsx | 89 ++++++----- next-vote-22nd/src/app/signup/page.tsx | 173 ++++++++++++++++++++++ 4 files changed, 232 insertions(+), 33 deletions(-) create mode 100644 next-vote-22nd/public/icons/main/back.svg create mode 100644 next-vote-22nd/src/app/login/page.tsx create mode 100644 next-vote-22nd/src/app/signup/page.tsx diff --git a/next-vote-22nd/public/icons/main/back.svg b/next-vote-22nd/public/icons/main/back.svg new file mode 100644 index 0000000..a25a9da --- /dev/null +++ b/next-vote-22nd/public/icons/main/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/next-vote-22nd/src/app/login/page.tsx b/next-vote-22nd/src/app/login/page.tsx new file mode 100644 index 0000000..e69de29 diff --git a/next-vote-22nd/src/app/page.tsx b/next-vote-22nd/src/app/page.tsx index fe95747..49ff02e 100644 --- a/next-vote-22nd/src/app/page.tsx +++ b/next-vote-22nd/src/app/page.tsx @@ -1,46 +1,69 @@ // app/page.tsx +'use client'; + import { SplashWrapper } from './splash'; +import Link from 'next/link'; +import { useSearchParams } from 'next/navigation'; +import { Suspense } from 'react'; + +function HomeContent() { + const searchParams = useSearchParams(); + const skipSplash = searchParams.get('skipSplash') === 'true'; + + const content = ( +
+ Vote icon + +
+ + CEOS +
+ Election +
+
+ +
+ + + + + + Sign up as a member + +
+
+ ); -export default function Home() { return (
- -
- Vote icon - -
- - CEOS -
- Election -
-
- -
- - -

- Sign up as a member -

-
-
-
+ {skipSplash ? content : {content}}
); } + +export default function Home() { + return ( + Loading...}> + + + ); +} diff --git a/next-vote-22nd/src/app/signup/page.tsx b/next-vote-22nd/src/app/signup/page.tsx new file mode 100644 index 0000000..743a573 --- /dev/null +++ b/next-vote-22nd/src/app/signup/page.tsx @@ -0,0 +1,173 @@ +// app/signup/page.tsx +'use client'; + +import { useState, FormEvent, ChangeEvent } from 'react'; +import Link from 'next/link'; + +export default function SignupPage() { + const [formData, setFormData] = useState({ + name: '', + id: '', + password: '', + passwordConfirm: '', + email: '', + team: '', + part: '', + }); + + const handleChange = ( + e: ChangeEvent + ) => { + const { name, value } = e.target; + setFormData((prev) => ({ ...prev, [name]: value })); + }; + + const handleSubmit = (e: FormEvent) => { + e.preventDefault(); + console.log(formData); + }; + + return ( +
+
+
+ {/* Header with Back Button and Register */} +
+ + Back + +

+ Register +

+
+ + {/* Form */} +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + {/* Team / Part - 2개의 드롭다운 */} +
+
+ + +
+ +
+ + +
+
+ + +
+
+
+
+ ); +} From 8bcd3fb4b81576ee9688fcb3cefac0a0cdf5f583 Mon Sep 17 00:00:00 2001 From: codus02 Date: Sat, 15 Nov 2025 22:40:41 +0900 Subject: [PATCH 06/20] signup done --- next-vote-22nd/src/app/login/page.tsx | 148 +++++++++++++++++++++++++ next-vote-22nd/src/app/signup/page.tsx | 2 + 2 files changed, 150 insertions(+) diff --git a/next-vote-22nd/src/app/login/page.tsx b/next-vote-22nd/src/app/login/page.tsx index e69de29..892c4f9 100644 --- a/next-vote-22nd/src/app/login/page.tsx +++ b/next-vote-22nd/src/app/login/page.tsx @@ -0,0 +1,148 @@ +// app/login/page.tsx +'use client'; + +import { useState, FormEvent, ChangeEvent } from 'react'; +import Link from 'next/link'; +import { useRouter } from 'next/navigation'; + +export default function LoginPage() { + const router = useRouter(); + const [showWelcome, setShowWelcome] = useState(false); + const [userName, setUserName] = useState(''); + const [formData, setFormData] = useState({ + id: '', + password: '', + }); + + const handleChange = (e: ChangeEvent) => { + const { name, value } = e.target; + setFormData((prev) => ({ ...prev, [name]: value })); + }; + + const handleSubmit = (e: FormEvent) => { + e.preventDefault(); + console.log(formData); + + setUserName(formData.id); + setShowWelcome(true); + }; + + const handleStart = () => { + router.push('/?skipSplash=true'); + }; + + // Welcome 화면 + if (showWelcome) { + return ( +
+
+
+ {/* Vote Icon */} + Vote icon + + {/* Welcome + Name - 왼쪽 정렬 */} +
+ + Welcome +
+ {userName} +
+
+ + {/* Start Button */} +
+ +
+
+
+
+ ); + } + + // Login 화면 + return ( +
+
+
+
+ + Back + +

+ Login +

+
+ +
+
+ + +
+ +
+ + +
+ + + + + Don't have an account? Sign up + +
+
+
+
+ ); +} diff --git a/next-vote-22nd/src/app/signup/page.tsx b/next-vote-22nd/src/app/signup/page.tsx index 743a573..2035d46 100644 --- a/next-vote-22nd/src/app/signup/page.tsx +++ b/next-vote-22nd/src/app/signup/page.tsx @@ -37,6 +37,8 @@ export default function SignupPage() { {/* Header with Back Button and Register */}
+ {/* splash 페이지가 또 나오지 않도록 */} + Back Date: Sat, 15 Nov 2025 23:58:00 +0900 Subject: [PATCH 07/20] =?UTF-8?q?Feat:=20=ED=88=AC=ED=91=9C=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ceos-favicon-1.ico => favicon.ico} | Bin next-vote-22nd/public/icons/check.svg | 8 +++ .../src/app/electionSelect/page.tsx | 21 ++++++++ next-vote-22nd/src/app/layout.tsx | 1 + next-vote-22nd/src/app/page.tsx | 12 ++++- .../src/components/box/MiddleBox.tsx | 42 ++++++++++++++++ .../src/components/button/Button.tsx | 28 +++++++++++ next-vote-22nd/src/styles/globals.css | 47 +++++++++++++++--- 8 files changed, 150 insertions(+), 9 deletions(-) rename next-vote-22nd/public/{ceos-favicon-1.ico => favicon.ico} (100%) create mode 100644 next-vote-22nd/public/icons/check.svg create mode 100644 next-vote-22nd/src/app/electionSelect/page.tsx create mode 100644 next-vote-22nd/src/components/box/MiddleBox.tsx create mode 100644 next-vote-22nd/src/components/button/Button.tsx diff --git a/next-vote-22nd/public/ceos-favicon-1.ico b/next-vote-22nd/public/favicon.ico similarity index 100% rename from next-vote-22nd/public/ceos-favicon-1.ico rename to next-vote-22nd/public/favicon.ico diff --git a/next-vote-22nd/public/icons/check.svg b/next-vote-22nd/public/icons/check.svg new file mode 100644 index 0000000..ff7edfb --- /dev/null +++ b/next-vote-22nd/public/icons/check.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/next-vote-22nd/src/app/electionSelect/page.tsx b/next-vote-22nd/src/app/electionSelect/page.tsx new file mode 100644 index 0000000..7e4b8f9 --- /dev/null +++ b/next-vote-22nd/src/app/electionSelect/page.tsx @@ -0,0 +1,21 @@ +// src/app/electionSelect/page.tsx +import MiddleBox from "@/components/box/MiddleBox"; + +export default function SelectPage() { + return ( +
+ {/* 아이폰 프레임 */} +
+ {/* 텍스트 + 아이콘 영역 */} +
+

파트장 / 데모데이 투표

+
+
+ + +
+
+
+
+ ); +} diff --git a/next-vote-22nd/src/app/layout.tsx b/next-vote-22nd/src/app/layout.tsx index a6642f1..bb4af24 100644 --- a/next-vote-22nd/src/app/layout.tsx +++ b/next-vote-22nd/src/app/layout.tsx @@ -1,4 +1,5 @@ // app/layout.tsx + import "@/styles/globals.css"; import type { Metadata } from "next"; diff --git a/next-vote-22nd/src/app/page.tsx b/next-vote-22nd/src/app/page.tsx index 0c651d2..8d97ac1 100644 --- a/next-vote-22nd/src/app/page.tsx +++ b/next-vote-22nd/src/app/page.tsx @@ -1,8 +1,18 @@ +// src/app/page.tsx +import Link from "next/link"; + export default function Home() { return (
{/* 아이폰 16 레이아웃 */} -
+
+ + Start + +
); } diff --git a/next-vote-22nd/src/components/box/MiddleBox.tsx b/next-vote-22nd/src/components/box/MiddleBox.tsx new file mode 100644 index 0000000..ae86d0c --- /dev/null +++ b/next-vote-22nd/src/components/box/MiddleBox.tsx @@ -0,0 +1,42 @@ +// src/components/box/MiddleBox.tsx +import React from "react"; +import CheckIcon from "@/public/icons/check.svg"; + +interface MiddleBoxProps { + label: string; // 박스 안에 들어갈 텍스트 + selected?: boolean; // 선택(hover/active) 상태인지 + onClick?: () => void; // 클릭했을 때 실행할 함수 +} + +const MiddleBox: React.FC = ({ + label, + selected = false, + onClick, +}) => { + return ( + + ); +}; + +export default MiddleBox; diff --git a/next-vote-22nd/src/components/button/Button.tsx b/next-vote-22nd/src/components/button/Button.tsx new file mode 100644 index 0000000..406b211 --- /dev/null +++ b/next-vote-22nd/src/components/button/Button.tsx @@ -0,0 +1,28 @@ +// src/components/StartButton.tsx +import React from "react"; + +interface ButtonProps { + label?: string; + onClick?: () => void; +} + +const InitButton: React.FC = ({ label = "Start", onClick }) => { + return ( + + ); +}; + +export default InitButton; diff --git a/next-vote-22nd/src/styles/globals.css b/next-vote-22nd/src/styles/globals.css index 932c29c..fd91d41 100644 --- a/next-vote-22nd/src/styles/globals.css +++ b/next-vote-22nd/src/styles/globals.css @@ -1,3 +1,5 @@ +/* src/styles/globals.css */ + @import "tailwindcss"; /* --------------------------------------------------- @@ -7,6 +9,9 @@ :root { --background: #ffeef6; --foreground: #000000; +} + +@theme { --color-black: #000a19; --color-white: #ffffff; /*-------- main color ---------*/ @@ -25,17 +30,43 @@ --color-gray-700: #4e4d4d; --color-gray-800: #302f2f; --color-gray-900: #100f0f; -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } + /*------ 폰트 -------*/ + --font-sans: InterVariable, sans-serif; + --font-sans--font-feature-settings: "cv02", "cv03", "cv04", "cv11"; } body { background: var(--background); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-sans); +} +@layer components { + .frame-iphone-16 { + aspect-ratio: 9 / 19.5; + width: 100%; + max-width: 20rem; + border-radius: 48px; + background-color: var(--color-white); + box-shadow: 8px 8px 16px var(--color-gray-400); + } +} + +@media (min-width: 640px) { + .frame-iphone-16 { + max-width: 24rem; /* 384px */ + } +} + +.text-headline-01 { + font-weight: 700; + font-size: 28px; + line-height: 20px; + text-align: center; +} + +.text-headline-02 { + font-weight: 700; + font-size: 24px; + line-height: 20px; + text-align: center; } From c18a35bcca42ab3d0e2253d725227e13461b0cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Mon, 17 Nov 2025 18:20:40 +0900 Subject: [PATCH 08/20] fix --- next-vote-22nd/src/app/partleader/step2/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/next-vote-22nd/src/app/partleader/step2/page.tsx b/next-vote-22nd/src/app/partleader/step2/page.tsx index e27643c..bb914da 100644 --- a/next-vote-22nd/src/app/partleader/step2/page.tsx +++ b/next-vote-22nd/src/app/partleader/step2/page.tsx @@ -63,7 +63,7 @@ export default function PartLeaderStep2Page() {
← From 3493a5a1795bc3f5aa9141a86037f1a7ad3a7972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Mon, 17 Nov 2025 18:37:52 +0900 Subject: [PATCH 09/20] fix --- next-vote-22nd/src/app/partleader/step2/page.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/next-vote-22nd/src/app/partleader/step2/page.tsx b/next-vote-22nd/src/app/partleader/step2/page.tsx index bb914da..2419caf 100644 --- a/next-vote-22nd/src/app/partleader/step2/page.tsx +++ b/next-vote-22nd/src/app/partleader/step2/page.tsx @@ -1,5 +1,4 @@ "use client"; - import Link from "next/link"; import SmallBox from "@/components/box/SmallBox"; import { useState } from "react"; From 7be605cb7868c51f9b13c42d75d8823e6bff0392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Mon, 17 Nov 2025 18:38:53 +0900 Subject: [PATCH 10/20] . --- next-vote-22nd/src/app/partleader/step2/page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/next-vote-22nd/src/app/partleader/step2/page.tsx b/next-vote-22nd/src/app/partleader/step2/page.tsx index 2419caf..bb914da 100644 --- a/next-vote-22nd/src/app/partleader/step2/page.tsx +++ b/next-vote-22nd/src/app/partleader/step2/page.tsx @@ -1,4 +1,5 @@ "use client"; + import Link from "next/link"; import SmallBox from "@/components/box/SmallBox"; import { useState } from "react"; From 73ecc28cac41c6e8870b099658ae4b877c3524f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Mon, 17 Nov 2025 18:51:14 +0900 Subject: [PATCH 11/20] fix: suspense --- next-vote-22nd/src/app/demoday/step2/page.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/next-vote-22nd/src/app/demoday/step2/page.tsx b/next-vote-22nd/src/app/demoday/step2/page.tsx index 673e528..f4b50cc 100644 --- a/next-vote-22nd/src/app/demoday/step2/page.tsx +++ b/next-vote-22nd/src/app/demoday/step2/page.tsx @@ -2,7 +2,7 @@ import Link from "next/link"; import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; +import { Suspense, useState } from "react"; import { useSearchParams } from "next/navigation"; const steps = [1, 2, 3]; @@ -22,7 +22,7 @@ const initialCandidates: Candidate[] = [ { team: "GroomEasy", name: "GroomEasy", isSelect: false }, ]; -export default function DemoDayStep2Page() { +const DemoDayStep2Content = () => { const searchParams = useSearchParams(); const pageTitle = searchParams.get("title") ?? "-"; const [candidates, setCandidates] = useState(initialCandidates); @@ -87,4 +87,12 @@ export default function DemoDayStep2Page() {
); +}; + +export default function DemoDayStep2Page() { + return ( + }> + + + ); } From 5b74495b8ecab19393004c00b5c729ec94938c80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Fri, 21 Nov 2025 17:35:42 +0900 Subject: [PATCH 12/20] =?UTF-8?q?fix:=20=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20client,=20server=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-vote-22nd/src/app/demoday/step2/page.tsx | 100 ++------------- .../src/app/demoday/step2/step2Client.tsx | 94 ++++++++++++++ next-vote-22nd/src/app/demoday/step3/page.tsx | 96 ++------------- .../src/app/demoday/step3/step3Client.tsx | 94 ++++++++++++++ next-vote-22nd/src/app/page.tsx | 7 -- .../src/app/partleader/step2/page.tsx | 103 ++-------------- .../src/app/partleader/step2/step2Client.tsx | 99 +++++++++++++++ .../src/app/partleader/step3/page.tsx | 116 ++---------------- .../src/app/partleader/step3/step3Client.tsx | 98 +++++++++++++++ next-vote-22nd/tsconfig.json | 1 - 10 files changed, 420 insertions(+), 388 deletions(-) create mode 100644 next-vote-22nd/src/app/demoday/step2/step2Client.tsx create mode 100644 next-vote-22nd/src/app/demoday/step3/step3Client.tsx create mode 100644 next-vote-22nd/src/app/partleader/step2/step2Client.tsx create mode 100644 next-vote-22nd/src/app/partleader/step3/step3Client.tsx diff --git a/next-vote-22nd/src/app/demoday/step2/page.tsx b/next-vote-22nd/src/app/demoday/step2/page.tsx index f4b50cc..f21d04a 100644 --- a/next-vote-22nd/src/app/demoday/step2/page.tsx +++ b/next-vote-22nd/src/app/demoday/step2/page.tsx @@ -1,98 +1,14 @@ -"use client"; - -import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { Suspense, useState } from "react"; -import { useSearchParams } from "next/navigation"; - -const steps = [1, 2, 3]; -const currentStep = 2; - -interface Candidate { - team: string; - name: string; - isSelect: boolean; -} - -const initialCandidates: Candidate[] = [ - { team: "STORIX", name: "STORIX", isSelect: false }, - { team: "DiggIndie", name: "DiggIndie", isSelect: false }, - { team: "CatchUp", name: "CatchUp", isSelect: false }, - { team: "Modelly", name: "Modelly", isSelect: false }, - { team: "GroomEasy", name: "GroomEasy", isSelect: false }, -]; - -const DemoDayStep2Content = () => { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "-"; - const [candidates, setCandidates] = useState(initialCandidates); - - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((c, i) => - i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } - ) - ); - }; - - const hasSelection = candidates.some((c) => c.isSelect); - - return ( -
-
-
- {steps.map((step) => ( - - {step} - - ))} -
- -
- - ← - -

{pageTitle}

-
- -
- {candidates.map((candidate, index) => ( - handleSelect(index)} /> - ))} -
-
- - -
-
- ); -}; +import { Suspense } from "react"; +import DemoDayStep2Client from "./step2Client"; export default function DemoDayStep2Page() { return ( - }> - + + } + > + ); } diff --git a/next-vote-22nd/src/app/demoday/step2/step2Client.tsx b/next-vote-22nd/src/app/demoday/step2/step2Client.tsx new file mode 100644 index 0000000..c4bead5 --- /dev/null +++ b/next-vote-22nd/src/app/demoday/step2/step2Client.tsx @@ -0,0 +1,94 @@ +"use client"; + +import Link from "next/link"; +import SmallBox from "@/components/box/SmallBox"; +import { useState } from "react"; +import { useSearchParams } from "next/navigation"; + +const steps = [1, 2, 3]; +const currentStep = 2; + +interface Candidate { + team: string; + name: string; + isSelect: boolean; +} + +const initialCandidates: Candidate[] = [ + { team: "STORIX", name: "STORIX", isSelect: false }, + { team: "DiggIndie", name: "DiggIndie", isSelect: false }, + { team: "CatchUp", name: "CatchUp", isSelect: false }, + { team: "Modelly", name: "Modelly", isSelect: false }, + { team: "GroomEasy", name: "GroomEasy", isSelect: false }, +]; + +export default function DemoDayStep2Client() { + const searchParams = useSearchParams(); + const pageTitle = searchParams.get("title") ?? "-"; + const [candidates, setCandidates] = useState(initialCandidates); + + const handleSelect = (index: number) => { + setCandidates((prev) => + prev.map((c, i) => + i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } + ) + ); + }; + + const hasSelection = candidates.some((c) => c.isSelect); + + return ( +
+
+
+ {steps.map((step) => ( + + {step} + + ))} +
+ +
+ + ← + +

{pageTitle}

+
+ +
+ {candidates.map((candidate, index) => ( + handleSelect(index)} + /> + ))} +
+
+ + +
+
+ ); +} diff --git a/next-vote-22nd/src/app/demoday/step3/page.tsx b/next-vote-22nd/src/app/demoday/step3/page.tsx index 86e46fb..949d0dd 100644 --- a/next-vote-22nd/src/app/demoday/step3/page.tsx +++ b/next-vote-22nd/src/app/demoday/step3/page.tsx @@ -1,90 +1,14 @@ -"use client"; - -import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; - -const steps = [1, 2, 3]; -const currentStep = 2; - -interface Candidate { - team: string; - name: string; - isSelect: boolean; -} - -const initialCandidates: Candidate[] = [ - { team: "STORIX", name: "STORIX", isSelect: false }, - { team: "DiggIndie", name: "DiggIndie", isSelect: false }, - { team: "CatchUp", name: "CatchUp", isSelect: false }, - { team: "Modelly", name: "Modelly", isSelect: false }, - { team: "GroomEasy", name: "GroomEasy", isSelect: false }, -]; - -export default function DemoDayStep2Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "-"; - const [candidates, setCandidates] = useState(initialCandidates); - - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((c, i) => - i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } - ) - ); - }; - - const hasSelection = candidates.some((c) => c.isSelect); +import { Suspense } from "react"; +import DemoDayStep3Content from "./step3Client"; +export default function DemoDayStep3Page() { return ( -
-
-
- {steps.map((step) => ( - - {step} - - ))} -
- -
- - ← - -

{pageTitle} 결과

-
- -
- {candidates.map((candidate, index) => ( - handleSelect(index)} /> - ))} -
-
- - -
-
+ + } + > + + ); } diff --git a/next-vote-22nd/src/app/demoday/step3/step3Client.tsx b/next-vote-22nd/src/app/demoday/step3/step3Client.tsx new file mode 100644 index 0000000..40ed302 --- /dev/null +++ b/next-vote-22nd/src/app/demoday/step3/step3Client.tsx @@ -0,0 +1,94 @@ +"use client"; + +import Link from "next/link"; +import SmallBox from "@/components/box/SmallBox"; +import { useState } from "react"; +import { useSearchParams } from "next/navigation"; + +const steps = [1, 2, 3]; +const currentStep = 2; + +interface Candidate { + team: string; + name: string; + isSelect: boolean; +} + +const initialCandidates: Candidate[] = [ + { team: "STORIX", name: "STORIX", isSelect: false }, + { team: "DiggIndie", name: "DiggIndie", isSelect: false }, + { team: "CatchUp", name: "CatchUp", isSelect: false }, + { team: "Modelly", name: "Modelly", isSelect: false }, + { team: "GroomEasy", name: "GroomEasy", isSelect: false }, +]; + +export default function DemoDayStep3Content() { + const searchParams = useSearchParams(); + const pageTitle = searchParams.get("title") ?? "-"; + const [candidates, setCandidates] = useState(initialCandidates); + + const handleSelect = (index: number) => { + setCandidates((prev) => + prev.map((c, i) => + i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } + ) + ); + }; + + const hasSelection = candidates.some((c) => c.isSelect); + + return ( +
+
+
+ {steps.map((step) => ( + + {step} + + ))} +
+ +
+ + ← + +

{pageTitle} 결과

+
+ +
+ {candidates.map((candidate, index) => ( + handleSelect(index)} + /> + ))} +
+
+ + +
+
+ ); +} diff --git a/next-vote-22nd/src/app/page.tsx b/next-vote-22nd/src/app/page.tsx index 8db0ce3..a757ea0 100644 --- a/next-vote-22nd/src/app/page.tsx +++ b/next-vote-22nd/src/app/page.tsx @@ -44,13 +44,6 @@ function HomeContent() { > Sign up as a member - {/* 테스트용 라우팅, 로그인 구현 후 삭제 */} - - Test -
); diff --git a/next-vote-22nd/src/app/partleader/step2/page.tsx b/next-vote-22nd/src/app/partleader/step2/page.tsx index bb914da..889702f 100644 --- a/next-vote-22nd/src/app/partleader/step2/page.tsx +++ b/next-vote-22nd/src/app/partleader/step2/page.tsx @@ -1,99 +1,14 @@ -"use client"; - -import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; -import { - PartleaderCandidate, - partleaderCandidates, -} from "@/data/partleaderCandidates"; - -const steps = [1, 2, 3]; -const currentStep = 2; - -interface Candidate extends PartleaderCandidate { - isSelect: boolean; -} - -const buildInitialCandidates = (): Candidate[] => - partleaderCandidates.map((candidate) => ({ - ...candidate, - isSelect: false, - })); +import { Suspense } from "react"; +import PartLeaderStep2Client from "./step2Client"; export default function PartLeaderStep2Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; - const [candidates, setCandidates] = useState( - buildInitialCandidates() - ); - - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((candidate, candidateIndex) => - candidateIndex === index - ? { ...candidate, isSelect: true } - : { ...candidate, isSelect: false } - ) - ); - }; - - const hasSelection = candidates.some((candidate) => candidate.isSelect); - return ( -
-
-
- {steps.map((step) => ( - - {step} - - ))} -
- -
-
- - ← - -

{pageTitle}

-
- -
-
- {candidates.map((candidate, index) => ( - handleSelect(index)} - /> - ))} -
-
- - - 제출하기 - -
-
+ + } + > + + ); } diff --git a/next-vote-22nd/src/app/partleader/step2/step2Client.tsx b/next-vote-22nd/src/app/partleader/step2/step2Client.tsx new file mode 100644 index 0000000..38d76e8 --- /dev/null +++ b/next-vote-22nd/src/app/partleader/step2/step2Client.tsx @@ -0,0 +1,99 @@ +"use client"; + +import Link from "next/link"; +import SmallBox from "@/components/box/SmallBox"; +import { useState } from "react"; +import { useSearchParams } from "next/navigation"; +import { + PartleaderCandidate, + partleaderCandidates, +} from "@/data/partleaderCandidates"; + +const steps = [1, 2, 3]; +const currentStep = 2; + +interface Candidate extends PartleaderCandidate { + isSelect: boolean; +} + +const buildInitialCandidates = (): Candidate[] => + partleaderCandidates.map((candidate) => ({ + ...candidate, + isSelect: false, + })); + +export default function PartLeaderStep2Client() { + const searchParams = useSearchParams(); + const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; + const [candidates, setCandidates] = useState( + buildInitialCandidates() + ); + + const handleSelect = (index: number) => { + setCandidates((prev) => + prev.map((candidate, candidateIndex) => + candidateIndex === index + ? { ...candidate, isSelect: true } + : { ...candidate, isSelect: false } + ) + ); + }; + + const hasSelection = candidates.some((candidate) => candidate.isSelect); + + return ( +
+
+
+ {steps.map((step) => ( + + {step} + + ))} +
+ +
+
+ + ← + +

{pageTitle}

+
+ +
+
+ {candidates.map((candidate, index) => ( + handleSelect(index)} + /> + ))} +
+
+ + + 제출하기 + +
+
+ ); +} diff --git a/next-vote-22nd/src/app/partleader/step3/page.tsx b/next-vote-22nd/src/app/partleader/step3/page.tsx index e41b75a..30d7f12 100644 --- a/next-vote-22nd/src/app/partleader/step3/page.tsx +++ b/next-vote-22nd/src/app/partleader/step3/page.tsx @@ -1,114 +1,14 @@ -"use client"; - -import Link from "next/link"; -import ResultBox from "@/components/box/ResultBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; -import { - PartleaderCandidate, - partleaderCandidates, -} from "@/data/partleaderCandidates"; -import LogoutModal from "@/components/common/LogoutModal"; - -const steps = [1, 2, 3]; -const currentStep = 3; - -interface Candidate extends PartleaderCandidate { - isSelect: boolean; -} - -const buildInitialCandidates = (): Candidate[] => - partleaderCandidates.map((candidate) => ({ - ...candidate, - isSelect: false, - })); +import { Suspense } from "react"; +import PartLeaderStep3Client from "./step3Client"; export default function PartLeaderStep3Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; - const [candidates, setCandidates] = useState( - buildInitialCandidates() - ); - - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((candidate, candidateIndex) => - candidateIndex === index - ? { ...candidate, isSelect: true } - : { ...candidate, isSelect: false } - ) - ); - }; - - const hasSelection = candidates.some((candidate) => candidate.isSelect); - const [isLogoutOpen, setIsLogoutOpen] = useState(false); - return ( -
setIsLogoutOpen(true)} + + } > - setIsLogoutOpen(false)} - /> -
-
- {steps.map((step) => ( - - {step} - - ))} -
- -
-
- - ← - -

{pageTitle}

-
- -
-
- {candidates.map((candidate, index) => ( - - ))} -
-
- - - 돌아가기 - -
-
+ + ); } diff --git a/next-vote-22nd/src/app/partleader/step3/step3Client.tsx b/next-vote-22nd/src/app/partleader/step3/step3Client.tsx new file mode 100644 index 0000000..d12171a --- /dev/null +++ b/next-vote-22nd/src/app/partleader/step3/step3Client.tsx @@ -0,0 +1,98 @@ +"use client"; + +import Link from "next/link"; +import ResultBox from "@/components/box/ResultBox"; +import { useState } from "react"; +import { useSearchParams } from "next/navigation"; +import { + PartleaderCandidate, + partleaderCandidates, +} from "@/data/partleaderCandidates"; +import LogoutModal from "@/components/common/LogoutModal"; + +const steps = [1, 2, 3]; +const currentStep = 3; + +interface Candidate extends PartleaderCandidate { + isSelect: boolean; +} + +const buildInitialCandidates = (): Candidate[] => + partleaderCandidates.map((candidate) => ({ + ...candidate, + isSelect: false, + })); + +export default function PartLeaderStep3Client() { + const searchParams = useSearchParams(); + const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; + const [candidates] = useState(buildInitialCandidates()); + const hasSelection = candidates.some((candidate) => candidate.isSelect); + const [isLogoutOpen, setIsLogoutOpen] = useState(false); + + return ( +
setIsLogoutOpen(true)} + > + setIsLogoutOpen(false)} + /> +
+
+ {steps.map((step) => ( + + {step} + + ))} +
+ +
+
+ + ← + +

{pageTitle}

+
+ +
+
+ {candidates.map((candidate) => ( + + ))} +
+
+ + + 돌아가기 + +
+
+ ); +} diff --git a/next-vote-22nd/tsconfig.json b/next-vote-22nd/tsconfig.json index 8dbe1b4..9612c48 100644 --- a/next-vote-22nd/tsconfig.json +++ b/next-vote-22nd/tsconfig.json @@ -21,7 +21,6 @@ "baseUrl": ".", "paths": { "@/*": ["./src/*"], - "@/components/*": ["./src/components/*"], "@/public/*": ["./public/*"] } }, From 03efe1de7978f96e4c5b3753080dfd5cd397f0d8 Mon Sep 17 00:00:00 2001 From: codus02 Date: Sat, 20 Dec 2025 22:48:36 +0900 Subject: [PATCH 13/20] almost done.. --- next-vote-22nd/package-lock.json | 187 ++++++++++++++++-- next-vote-22nd/package.json | 14 +- next-vote-22nd/src/app/demoday/step1/page.tsx | 29 +-- next-vote-22nd/src/app/demoday/step2/page.tsx | 93 +++++---- next-vote-22nd/src/app/demoday/step3/page.tsx | 88 ++++----- next-vote-22nd/src/app/layout.tsx | 14 +- next-vote-22nd/src/app/login/page.tsx | 65 ++++-- next-vote-22nd/src/app/page.tsx | 21 +- .../src/app/partleader/step1/page.tsx | 37 ++-- .../src/app/partleader/step2/page.tsx | 73 ++++--- .../src/app/partleader/step3/page.tsx | 95 +++------ next-vote-22nd/src/app/signup/page.tsx | 90 +++++++-- .../src/components/box/LargeBox.tsx | 47 ++--- .../src/components/box/ResultBox.tsx | 56 +++--- .../src/components/common/LogoutModal.tsx | 52 +++-- next-vote-22nd/src/data/demodayCandidates.ts | 17 ++ .../src/data/partleaderCandidates.ts | 46 ++++- .../src/features/auth/api/auth.repository.ts | 86 ++++++++ .../src/features/auth/hooks/use-auth.ts | 60 ++++++ .../src/features/auth/schemas/auth.schema.ts | 30 +++ .../src/features/auth/stores/auth-store.ts | 43 ++++ .../src/features/vote/api/vote.repository.ts | 69 +++++++ .../src/features/vote/hooks/use-vote.ts | 44 +++++ .../src/features/vote/schemas/vote.schema.ts | 24 +++ next-vote-22nd/src/lib/axios.ts | 77 ++++++++ next-vote-22nd/src/lib/react-query.tsx | 28 +++ 26 files changed, 1109 insertions(+), 376 deletions(-) create mode 100644 next-vote-22nd/src/data/demodayCandidates.ts create mode 100644 next-vote-22nd/src/features/auth/api/auth.repository.ts create mode 100644 next-vote-22nd/src/features/auth/hooks/use-auth.ts create mode 100644 next-vote-22nd/src/features/auth/schemas/auth.schema.ts create mode 100644 next-vote-22nd/src/features/auth/stores/auth-store.ts create mode 100644 next-vote-22nd/src/features/vote/api/vote.repository.ts create mode 100644 next-vote-22nd/src/features/vote/hooks/use-vote.ts create mode 100644 next-vote-22nd/src/features/vote/schemas/vote.schema.ts create mode 100644 next-vote-22nd/src/lib/axios.ts create mode 100644 next-vote-22nd/src/lib/react-query.tsx diff --git a/next-vote-22nd/package-lock.json b/next-vote-22nd/package-lock.json index 76b7bc6..a0b55ee 100644 --- a/next-vote-22nd/package-lock.json +++ b/next-vote-22nd/package-lock.json @@ -8,9 +8,13 @@ "name": "next-vote-22nd", "version": "0.1.0", "dependencies": { + "@tanstack/react-query": "^5.90.12", + "axios": "^1.13.2", "next": "16.0.1", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "zod": "^4.2.1", + "zustand": "^5.0.9" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -1513,6 +1517,32 @@ "tailwindcss": "4.1.17" } }, + "node_modules/@tanstack/query-core": { + "version": "5.90.12", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.12.tgz", + "integrity": "sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.90.12", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.12.tgz", + "integrity": "sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.90.12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -1559,7 +1589,7 @@ "version": "19.2.3", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.3.tgz", "integrity": "sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -2395,6 +2425,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", @@ -2421,6 +2457,17 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "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", @@ -2529,7 +2576,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", @@ -2629,6 +2675,18 @@ "dev": true, "license": "MIT" }, + "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", @@ -2662,7 +2720,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -2787,6 +2845,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/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2814,7 +2881,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", @@ -2926,7 +2992,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" @@ -2936,7 +3001,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" @@ -2974,7 +3038,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" @@ -2987,7 +3050,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", @@ -3602,6 +3664,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "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", @@ -3618,11 +3700,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "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" @@ -3683,7 +3780,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", @@ -3708,7 +3804,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", @@ -3796,7 +3891,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" @@ -3875,7 +3969,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" @@ -3888,7 +3981,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" @@ -3904,7 +3996,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" @@ -4887,7 +4978,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" @@ -4917,6 +5007,27 @@ "node": ">=8.6" } }, + "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/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/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5386,6 +5497,12 @@ "react-is": "^16.13.1" } }, + "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", @@ -6551,10 +6668,9 @@ } }, "node_modules/zod": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", - "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", - "dev": true, + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.2.1.tgz", + "integrity": "sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -6572,6 +6688,35 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } + }, + "node_modules/zustand": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", + "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/next-vote-22nd/package.json b/next-vote-22nd/package.json index 65f8a1f..95e0369 100644 --- a/next-vote-22nd/package.json +++ b/next-vote-22nd/package.json @@ -9,18 +9,22 @@ "lint": "eslint" }, "dependencies": { + "@tanstack/react-query": "^5.90.12", + "axios": "^1.13.2", + "next": "16.0.1", "react": "19.2.0", "react-dom": "19.2.0", - "next": "16.0.1" + "zod": "^4.2.1", + "zustand": "^5.0.9" }, "devDependencies": { - "typescript": "^5", + "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", - "tailwindcss": "^4", "eslint": "^9", - "eslint-config-next": "16.0.1" + "eslint-config-next": "16.0.1", + "tailwindcss": "^4", + "typescript": "^5" } } diff --git a/next-vote-22nd/src/app/demoday/step1/page.tsx b/next-vote-22nd/src/app/demoday/step1/page.tsx index 201878c..69a8064 100644 --- a/next-vote-22nd/src/app/demoday/step1/page.tsx +++ b/next-vote-22nd/src/app/demoday/step1/page.tsx @@ -1,5 +1,5 @@ -import LargeBox from "@/components/box/LargeBox"; -import Link from "next/link"; +// src/app/demoday/step1/page.tsx +import LargeBox from '@/components/box/LargeBox'; const steps = [1, 2, 3]; const currentStep = 1; @@ -7,15 +7,15 @@ const currentStep = 1; export default function DemoDayStep1Page() { return (
-
+
{steps.map((step) => ( {step} @@ -24,18 +24,19 @@ export default function DemoDayStep1Page() {
- - ← - +
+

데모데이 투표

+
-

데모데이 투표

- +
+ +
diff --git a/next-vote-22nd/src/app/demoday/step2/page.tsx b/next-vote-22nd/src/app/demoday/step2/page.tsx index 673e528..49b05c7 100644 --- a/next-vote-22nd/src/app/demoday/step2/page.tsx +++ b/next-vote-22nd/src/app/demoday/step2/page.tsx @@ -1,41 +1,42 @@ -"use client"; +// src/app/demoday/step2/page.tsx +'use client'; -import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; +import Link from 'next/link'; +import SmallBox from '@/components/box/SmallBox'; +import { Suspense, useState } from 'react'; +import { demodayCandidates, DemodayCandidate } from '@/data/demodayCandidates'; const steps = [1, 2, 3]; const currentStep = 2; -interface Candidate { - team: string; - name: string; +interface CandidateWithSelection extends DemodayCandidate { isSelect: boolean; } -const initialCandidates: Candidate[] = [ - { team: "STORIX", name: "STORIX", isSelect: false }, - { team: "DiggIndie", name: "DiggIndie", isSelect: false }, - { team: "CatchUp", name: "CatchUp", isSelect: false }, - { team: "Modelly", name: "Modelly", isSelect: false }, - { team: "GroomEasy", name: "GroomEasy", isSelect: false }, -]; - -export default function DemoDayStep2Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "-"; - const [candidates, setCandidates] = useState(initialCandidates); +function DemoDayContent() { + const [candidates, setCandidates] = useState( + demodayCandidates.map((c) => ({ ...c, isSelect: false })) + ); const handleSelect = (index: number) => { setCandidates((prev) => - prev.map((c, i) => - i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } + prev.map((candidate, candidateIndex) => + candidateIndex === index + ? { ...candidate, isSelect: true } + : { ...candidate, isSelect: false } ) ); }; - const hasSelection = candidates.some((c) => c.isSelect); + const handleSubmit = () => { + const selectedCandidate = candidates.find((c) => c.isSelect); + if (!selectedCandidate) return; + + alert(`${selectedCandidate.team}에 투표했습니다!`); + window.location.href = '/demoday/step3'; + }; + + const hasSelection = candidates.some((candidate) => candidate.isSelect); return (
@@ -46,8 +47,8 @@ export default function DemoDayStep2Page() { key={step} className={`flex h-8 w-8 items-center justify-center rounded-full border-2 border-black text-label-01 ${ step === currentStep - ? "bg-black text-white" - : "bg-white text-black" + ? 'bg-black text-white' + : 'bg-white text-black' }`} > {step} @@ -56,30 +57,40 @@ export default function DemoDayStep2Page() {
- - ← - -

{pageTitle}

+
+ + ← + +

데모데이 투표

+
+
-
+
{candidates.map((candidate, index) => ( - handleSelect(index)} /> + handleSelect(index)} + /> ))}
); } + +export default function DemoDayStep2Page() { + return ( + Loading...}> + + + ); +} diff --git a/next-vote-22nd/src/app/demoday/step3/page.tsx b/next-vote-22nd/src/app/demoday/step3/page.tsx index 86e46fb..fcd7fcc 100644 --- a/next-vote-22nd/src/app/demoday/step3/page.tsx +++ b/next-vote-22nd/src/app/demoday/step3/page.tsx @@ -1,41 +1,22 @@ -"use client"; +// src/app/demoday/step3/page.tsx +'use client'; -import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; +import Link from 'next/link'; +import ResultBox from '@/components/box/ResultBox'; +import { useEffect, useState } from 'react'; +import { demodayCandidates, DemodayCandidate } from '@/data/demodayCandidates'; const steps = [1, 2, 3]; -const currentStep = 2; +const currentStep = 3; -interface Candidate { - team: string; - name: string; - isSelect: boolean; -} - -const initialCandidates: Candidate[] = [ - { team: "STORIX", name: "STORIX", isSelect: false }, - { team: "DiggIndie", name: "DiggIndie", isSelect: false }, - { team: "CatchUp", name: "CatchUp", isSelect: false }, - { team: "Modelly", name: "Modelly", isSelect: false }, - { team: "GroomEasy", name: "GroomEasy", isSelect: false }, -]; - -export default function DemoDayStep2Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "-"; - const [candidates, setCandidates] = useState(initialCandidates); +export default function DemoDayStep3Page() { + const [candidates, setCandidates] = useState([]); - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((c, i) => - i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } - ) - ); - }; - - const hasSelection = candidates.some((c) => c.isSelect); + useEffect(() => { + // 득표순으로 정렬 (내림차순) + const sorted = [...demodayCandidates].sort((a, b) => b.votes - a.votes); + setCandidates(sorted); + }, []); return (
@@ -46,8 +27,8 @@ export default function DemoDayStep2Page() { key={step} className={`flex h-8 w-8 items-center justify-center rounded-full border-2 border-black text-label-01 ${ step === currentStep - ? "bg-black text-white" - : "bg-white text-black" + ? 'bg-black text-white' + : 'bg-white text-black' }`} > {step} @@ -56,34 +37,31 @@ export default function DemoDayStep2Page() {
- - ← - -

{pageTitle} 결과

+
+

데모데이 결과

+
+
-
+
{candidates.map((candidate, index) => ( - handleSelect(index)} /> + ))}
- + 투표 홈으로 +
); diff --git a/next-vote-22nd/src/app/layout.tsx b/next-vote-22nd/src/app/layout.tsx index bb4af24..fb0b6a3 100644 --- a/next-vote-22nd/src/app/layout.tsx +++ b/next-vote-22nd/src/app/layout.tsx @@ -1,11 +1,11 @@ -// app/layout.tsx - -import "@/styles/globals.css"; -import type { Metadata } from "next"; +// src/app/layout.tsx +import '@/styles/globals.css'; +import type { Metadata } from 'next'; +import { ReactQueryProvider } from '@/lib/react-query'; export const metadata: Metadata = { icons: { - icon: "/favicon.ico", + icon: '/favicon.ico', }, }; @@ -16,7 +16,9 @@ export default function RootLayout({ }) { return ( - {children} + + {children} + ); } diff --git a/next-vote-22nd/src/app/login/page.tsx b/next-vote-22nd/src/app/login/page.tsx index 9dbd7d3..4fb39a2 100644 --- a/next-vote-22nd/src/app/login/page.tsx +++ b/next-vote-22nd/src/app/login/page.tsx @@ -1,34 +1,47 @@ -// app/login/page.tsx -"use client"; +// src/app/login/page.tsx +'use client'; -import { useState, FormEvent, ChangeEvent } from "react"; -import Link from "next/link"; -import { useRouter } from "next/navigation"; +import { useState, FormEvent, ChangeEvent } from 'react'; +import Link from 'next/link'; +import { useRouter } from 'next/navigation'; +import { useLogin } from '@/features/auth/hooks/use-auth'; export default function LoginPage() { const router = useRouter(); const [showWelcome, setShowWelcome] = useState(false); - const [userName, setUserName] = useState(""); + const [userName, setUserName] = useState(''); const [formData, setFormData] = useState({ - id: "", - password: "", + id: '', + password: '', }); + // API Hook 사용 + const loginMutation = useLogin(); + const handleChange = (e: ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); }; - const handleSubmit = (e: FormEvent) => { + const handleSubmit = async (e: FormEvent) => { e.preventDefault(); - console.log(formData); - setUserName(formData.id); - setShowWelcome(true); + loginMutation.mutate( + { + loginId: formData.id, + password: formData.password, + }, + { + onSuccess: () => { + setUserName(formData.id); + setShowWelcome(true); + }, + } + ); }; const handleStart = () => { - router.push("/electionSelect"); + router.push('/electionSelect'); }; // Welcome 화면 @@ -47,14 +60,14 @@ export default function LoginPage() { className="absolute top-[360px] right-[40px] w-[140px] h-[140px]" style={{ filter: - "brightness(0) saturate(100%) invert(65%) sepia(0%) saturate(0%) hue-rotate(202deg) brightness(96%) contrast(92%)", + 'brightness(0) saturate(100%) invert(65%) sepia(0%) saturate(0%) hue-rotate(202deg) brightness(96%) contrast(92%)', }} /> {/* Welcome + Name - 왼쪽 정렬 */}
Welcome @@ -102,6 +115,14 @@ export default function LoginPage() {
+ {/* 에러 메시지 */} + {loginMutation.isError && ( +
+ {(loginMutation.error as any)?.response?.data?.message || + '아이디 또는 비밀번호가 올바르지 않습니다.'} +
+ )} +
@@ -125,13 +147,18 @@ export default function LoginPage() { name="password" value={formData.password} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none" + disabled={loginMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none disabled:opacity-50" required /> - @@ -20,7 +20,7 @@ function HomeContent() {
CEOS @@ -44,13 +44,6 @@ function HomeContent() { > Sign up as a member - {/* 테스트용 라우팅, 로그인 구현 후 삭제 */} - - Test -
); diff --git a/next-vote-22nd/src/app/partleader/step1/page.tsx b/next-vote-22nd/src/app/partleader/step1/page.tsx index 296d05d..b9b82b0 100644 --- a/next-vote-22nd/src/app/partleader/step1/page.tsx +++ b/next-vote-22nd/src/app/partleader/step1/page.tsx @@ -1,5 +1,7 @@ -import LargeBox from "@/components/box/LargeBox"; -import Link from "next/link"; +// src/app/partleader/step1/page.tsx +'use client'; + +import LargeBox from '@/components/box/LargeBox'; const steps = [1, 2, 3]; const currentStep = 1; @@ -7,15 +9,15 @@ const currentStep = 1; export default function PartLeaderStep1Page() { return (
-
+
{steps.map((step) => ( {step} @@ -24,19 +26,24 @@ export default function PartLeaderStep1Page() {
-
- - ← - +

파트장 투표

+
- - + +
+ + +
diff --git a/next-vote-22nd/src/app/partleader/step2/page.tsx b/next-vote-22nd/src/app/partleader/step2/page.tsx index e27643c..b3255e8 100644 --- a/next-vote-22nd/src/app/partleader/step2/page.tsx +++ b/next-vote-22nd/src/app/partleader/step2/page.tsx @@ -1,33 +1,35 @@ -"use client"; +// src/app/partleader/step2/page.tsx +'use client'; -import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; +import Link from 'next/link'; +import SmallBox from '@/components/box/SmallBox'; +import { useState, useEffect } from 'react'; +import { useSearchParams } from 'next/navigation'; import { + feCandidates, + beCandidates, PartleaderCandidate, - partleaderCandidates, -} from "@/data/partleaderCandidates"; +} from '@/data/partleaderCandidates'; const steps = [1, 2, 3]; const currentStep = 2; -interface Candidate extends PartleaderCandidate { +interface CandidateWithSelection extends PartleaderCandidate { isSelect: boolean; } -const buildInitialCandidates = (): Candidate[] => - partleaderCandidates.map((candidate) => ({ - ...candidate, - isSelect: false, - })); - export default function PartLeaderStep2Page() { const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; - const [candidates, setCandidates] = useState( - buildInitialCandidates() - ); + const pageTitle = searchParams.get('title') ?? 'FE 파트장 투표'; + + const [candidates, setCandidates] = useState([]); + + useEffect(() => { + const isFE = pageTitle.includes('FE'); + const candidateList = isFE ? feCandidates : beCandidates; + + setCandidates(candidateList.map((c) => ({ ...c, isSelect: false }))); + }, [pageTitle]); const handleSelect = (index: number) => { setCandidates((prev) => @@ -39,6 +41,16 @@ export default function PartLeaderStep2Page() { ); }; + const handleSubmit = () => { + const selectedCandidate = candidates.find((c) => c.isSelect); + if (!selectedCandidate) return; + + alert(`${selectedCandidate.name}님에게 투표했습니다!`); + window.location.href = `/partleader/step3?title=${encodeURIComponent( + pageTitle.replace('투표', '투표 결과') + )}`; + }; + const hasSelection = candidates.some((candidate) => candidate.isSelect); return ( @@ -50,8 +62,8 @@ export default function PartLeaderStep2Page() { key={step} className={`flex h-8 w-8 items-center justify-center rounded-full border-2 border-black text-label-01 ${ step === currentStep - ? "bg-black text-white" - : "bg-white text-black" + ? 'bg-black text-white' + : 'bg-white text-black' }`} > {step} @@ -63,7 +75,7 @@ export default function PartLeaderStep2Page() {
← @@ -72,27 +84,32 @@ export default function PartLeaderStep2Page() {
+
{candidates.map((candidate, index) => ( handleSelect(index)} /> ))}
- 제출하기 - + ); diff --git a/next-vote-22nd/src/app/partleader/step3/page.tsx b/next-vote-22nd/src/app/partleader/step3/page.tsx index e41b75a..ed025cf 100644 --- a/next-vote-22nd/src/app/partleader/step3/page.tsx +++ b/next-vote-22nd/src/app/partleader/step3/page.tsx @@ -1,57 +1,38 @@ -"use client"; +// src/app/partleader/step3/page.tsx +'use client'; -import Link from "next/link"; -import ResultBox from "@/components/box/ResultBox"; -import { useState } from "react"; -import { useSearchParams } from "next/navigation"; +import Link from 'next/link'; +import ResultBox from '@/components/box/ResultBox'; +import { useSearchParams } from 'next/navigation'; +import { useEffect, useState } from 'react'; import { + feCandidates, + beCandidates, PartleaderCandidate, - partleaderCandidates, -} from "@/data/partleaderCandidates"; -import LogoutModal from "@/components/common/LogoutModal"; +} from '@/data/partleaderCandidates'; const steps = [1, 2, 3]; const currentStep = 3; -interface Candidate extends PartleaderCandidate { - isSelect: boolean; -} - -const buildInitialCandidates = (): Candidate[] => - partleaderCandidates.map((candidate) => ({ - ...candidate, - isSelect: false, - })); - export default function PartLeaderStep3Page() { const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; - const [candidates, setCandidates] = useState( - buildInitialCandidates() - ); + const pageTitle = searchParams.get('title') ?? 'FE 파트장 투표 결과'; - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((candidate, candidateIndex) => - candidateIndex === index - ? { ...candidate, isSelect: true } - : { ...candidate, isSelect: false } - ) - ); - }; + const [candidates, setCandidates] = useState([]); - const hasSelection = candidates.some((candidate) => candidate.isSelect); - const [isLogoutOpen, setIsLogoutOpen] = useState(false); + useEffect(() => { + // title에서 FE/BE 판단 + const isFE = pageTitle.includes('FE'); + const candidateList = isFE ? feCandidates : beCandidates; + + // 득표순으로 정렬 (내림차순) + const sorted = [...candidateList].sort((a, b) => b.votes - a.votes); + + setCandidates(sorted); + }, [pageTitle]); return ( -
setIsLogoutOpen(true)} - > - setIsLogoutOpen(false)} - /> +
{steps.map((step) => ( @@ -59,8 +40,8 @@ export default function PartLeaderStep3Page() { key={step} className={`flex h-8 w-8 items-center justify-center rounded-full border-2 border-black text-label-01 ${ step === currentStep - ? "bg-black text-white" - : "bg-white text-black" + ? 'bg-black text-white' + : 'bg-white text-black' }`} > {step} @@ -69,44 +50,30 @@ export default function PartLeaderStep3Page() {
-
- - ← - +

{pageTitle}

+
{candidates.map((candidate, index) => ( ))}
- 돌아가기 + 투표 홈으로
diff --git a/next-vote-22nd/src/app/signup/page.tsx b/next-vote-22nd/src/app/signup/page.tsx index 2035d46..43c9c12 100644 --- a/next-vote-22nd/src/app/signup/page.tsx +++ b/next-vote-22nd/src/app/signup/page.tsx @@ -1,10 +1,13 @@ -// app/signup/page.tsx +// src/app/signup/page.tsx 'use client'; import { useState, FormEvent, ChangeEvent } from 'react'; import Link from 'next/link'; +import { useRouter } from 'next/navigation'; +import { useSignup } from '@/features/auth/hooks/use-auth'; export default function SignupPage() { + const router = useRouter(); const [formData, setFormData] = useState({ name: '', id: '', @@ -14,17 +17,46 @@ export default function SignupPage() { team: '', part: '', }); + const [passwordError, setPasswordError] = useState(''); + + // API Hook 사용 + const signupMutation = useSignup(); const handleChange = ( e: ChangeEvent ) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); + if (name === 'password' || name === 'passwordConfirm') { + setPasswordError(''); + } }; - const handleSubmit = (e: FormEvent) => { + const handleSubmit = async (e: FormEvent) => { e.preventDefault(); - console.log(formData); + + // 비밀번호 확인 검증 + if (formData.password !== formData.passwordConfirm) { + setPasswordError('비밀번호가 일치하지 않습니다.'); + return; + } + + signupMutation.mutate( + { + loginId: formData.id, + password: formData.password, + email: formData.email, + part: formData.part as 'FE' | 'BE', + name: formData.name, + team: formData.team as any, + }, + { + onSuccess: () => { + alert('회원가입이 완료되었습니다!'); + router.push('/login'); + }, + } + ); }; return ( @@ -33,12 +65,10 @@ export default function SignupPage() { className="relative rounded-[48px] bg-[var(--color-white)] shadow-[8px_8px_16px_var(--color-gray-400)] overflow-hidden" style={{ width: 393, height: 852 }} > -
+
{/* Header with Back Button and Register */}
- {/* splash 페이지가 또 나오지 않도록 */} - Back + {/* 에러 메시지 */} + {(signupMutation.isError || passwordError) && ( +
+ {passwordError || + (signupMutation.error as any)?.response?.data?.message || + '회원가입에 실패했습니다. 다시 시도해주세요.'} +
+ )} +
@@ -75,7 +115,8 @@ export default function SignupPage() { name="id" value={formData.id} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none" + disabled={signupMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none disabled:opacity-50" required />
@@ -89,7 +130,8 @@ export default function SignupPage() { name="password" value={formData.password} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none" + disabled={signupMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none disabled:opacity-50" required />
@@ -103,7 +145,8 @@ export default function SignupPage() { name="passwordConfirm" value={formData.passwordConfirm} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none" + disabled={signupMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none disabled:opacity-50" required />
@@ -117,7 +160,8 @@ export default function SignupPage() { name="email" value={formData.email} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none" + disabled={signupMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none disabled:opacity-50" required /> @@ -132,15 +176,16 @@ export default function SignupPage() { name="team" value={formData.team} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none cursor-pointer" + disabled={signupMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none cursor-pointer disabled:opacity-50" required > - + + + + - - - @@ -152,20 +197,23 @@ export default function SignupPage() { name="part" value={formData.part} onChange={handleChange} - className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none cursor-pointer" + disabled={signupMutation.isPending} + className="w-full h-[45px] px-2 bg-transparent border-b border-[var(--color-gray-400)] text-[var(--color-black)] focus:border-[var(--color-main)] focus:outline-none cursor-pointer disabled:opacity-50" required > - - - diff --git a/next-vote-22nd/src/components/box/LargeBox.tsx b/next-vote-22nd/src/components/box/LargeBox.tsx index 7bd667a..a5f0ad4 100644 --- a/next-vote-22nd/src/components/box/LargeBox.tsx +++ b/next-vote-22nd/src/components/box/LargeBox.tsx @@ -1,31 +1,32 @@ // src/components/box/LargeBox.tsx -import Link from "next/link"; +'use client'; + +import React from 'react'; +import Link from 'next/link'; interface LargeBoxProps { title: string; - buttonLabel: string; + voteLink: string; + resultLink: string; } -const LargeBox = ({ title, buttonLabel }: LargeBoxProps) => { - const label = - title === "FE 파트장 투표" || title === "BE 파트장 투표" - ? "partleader" - : "demoday"; - +export default function LargeBox({ + title, + voteLink, + resultLink, +}: LargeBoxProps) { return ( - -
- {title} - -
-
- {buttonLabel} -
- +
+ +

{title}

+ + e.stopPropagation()} + > + 결과 보기 + +
); -}; - -export default LargeBox; +} diff --git a/next-vote-22nd/src/components/box/ResultBox.tsx b/next-vote-22nd/src/components/box/ResultBox.tsx index e2ab6d8..967a5d6 100644 --- a/next-vote-22nd/src/components/box/ResultBox.tsx +++ b/next-vote-22nd/src/components/box/ResultBox.tsx @@ -1,41 +1,39 @@ -import SmallBox from "./SmallBox"; -import CrownIcon from "@/public/icons/Crown.svg"; +// src/components/box/ResultBox.tsx +import React from 'react'; interface ResultBoxProps { + rank: number; name: string; team: string; votes: number; - isSelected?: boolean; } -const ResultBox = ({ name, team, votes, isSelected }: ResultBoxProps) => { +export default function ResultBox({ rank, name, team, votes }: ResultBoxProps) { + const isFirst = rank === 1; + return ( - // 전체를 relative로 -
- {/* 왕관 */} - {isSelected && ( - - - - )} +
+ {/* 팀명 - SmallBox와 동일 */} + + {team} + + + {/* 이름 - SmallBox와 동일 */} + {name} - {/* 안쪽 상자 */} - + {/* 1등 왕관 - 왼쪽 상단 */} + {isFirst && 👑} - {/* 오른쪽에 겹치는 동그라미 */} -
- {votes} -
+ {/* 득표수 - 오른쪽 상단 (체크 아이콘 위치와 동일) */} + + {votes} +
); -}; - -export default ResultBox; +} diff --git a/next-vote-22nd/src/components/common/LogoutModal.tsx b/next-vote-22nd/src/components/common/LogoutModal.tsx index 8486c89..9754423 100644 --- a/next-vote-22nd/src/components/common/LogoutModal.tsx +++ b/next-vote-22nd/src/components/common/LogoutModal.tsx @@ -1,8 +1,10 @@ // src/components/common/LogoutModal.tsx -"use client"; +'use client'; -import { useRouter } from "next/navigation"; -import { useEffect, useState, MouseEvent } from "react"; +import { useRouter } from 'next/navigation'; +import { useEffect, useState, MouseEvent } from 'react'; +import { useLogout } from '@/features/auth/hooks/use-auth'; +import { useAuthStore } from '@/features/auth/stores/auth-store'; interface LogoutModalProps { isOpen: boolean; @@ -11,16 +13,27 @@ interface LogoutModalProps { export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { const router = useRouter(); - const [userId, setUserId] = useState(""); + const [userId, setUserId] = useState(''); - // 모달이 열릴 때 localStorage에서 id 읽기 + // API Hook 사용 + const logoutMutation = useLogout(); + const authUserId = useAuthStore( + (state: { userId: string | null }) => state.userId + ); + + // 모달이 열릴 때 userId 읽기 useEffect(() => { if (!isOpen) return; - if (typeof window === "undefined") return; - const stored = localStorage.getItem("userId"); - if (stored) setUserId(stored); - }, [isOpen]); + // Zustand store에서 먼저 확인 + if (authUserId) { + setUserId(authUserId); + } else if (typeof window !== 'undefined') { + // localStorage에서 fallback + const stored = localStorage.getItem('userId'); + if (stored) setUserId(stored); + } + }, [isOpen, authUserId]); if (!isOpen) return null; @@ -34,11 +47,19 @@ export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { }; const handleLogout = () => { - if (typeof window !== "undefined") { - localStorage.removeItem("userId"); + const refreshToken = + typeof window !== 'undefined' + ? sessionStorage.getItem('refreshToken') + : null; + + if (refreshToken) { + logoutMutation.mutate(refreshToken); + } else { + // refreshToken이 없어도 로그아웃 처리 + useAuthStore.getState().logout(); + router.push('/login'); } onClose(); - router.push("/login"); // 가장 처음 화면으로 이동 }; return ( @@ -52,15 +73,16 @@ export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { onClick={handleCardClick} >

- {userId || "User"} + {userId || 'User'}

diff --git a/next-vote-22nd/src/data/demodayCandidates.ts b/next-vote-22nd/src/data/demodayCandidates.ts new file mode 100644 index 0000000..39734fd --- /dev/null +++ b/next-vote-22nd/src/data/demodayCandidates.ts @@ -0,0 +1,17 @@ +// src/data/demodayCandidates.ts + +export interface DemodayCandidate { + id: number; + team: string; + name: string; + votes: number; +} + +// 데모데이 후보 (팀 단위) +export const demodayCandidates: DemodayCandidate[] = [ + { id: 101, team: 'STORIX', name: 'STORIX', votes: 0 }, + { id: 102, team: 'DiggIndie', name: 'DiggIndie', votes: 0 }, + { id: 103, team: 'CatchUp', name: 'CatchUp', votes: 0 }, + { id: 104, team: 'Modelly', name: 'Modelly', votes: 0 }, + { id: 105, team: 'Menual', name: 'Menual', votes: 0 }, +]; diff --git a/next-vote-22nd/src/data/partleaderCandidates.ts b/next-vote-22nd/src/data/partleaderCandidates.ts index 86e83d2..3bbf4ae 100644 --- a/next-vote-22nd/src/data/partleaderCandidates.ts +++ b/next-vote-22nd/src/data/partleaderCandidates.ts @@ -1,17 +1,43 @@ +// src/data/partleaderCandidates.ts + export interface PartleaderCandidate { + id: number; team: string; name: string; + part: 'FE' | 'BE'; + votes: number; } +// 프론트엔드 후보자들 +export const feCandidates: PartleaderCandidate[] = [ + { id: 1, team: 'STORIX', name: '김윤성', part: 'FE', votes: 0 }, + { id: 2, team: 'STORIX', name: '이채연', part: 'FE', votes: 0 }, + { id: 3, team: 'DiggIndie', name: '백승선', part: 'FE', votes: 0 }, + { id: 4, team: 'DiggIndie', name: '조성아', part: 'FE', votes: 0 }, + { id: 5, team: 'CatchUp', name: '장자윤', part: 'FE', votes: 0 }, + { id: 6, team: 'CatchUp', name: '정성훈', part: 'FE', votes: 0 }, + { id: 7, team: 'Modelly', name: '손주완', part: 'FE', votes: 0 }, + { id: 8, team: 'Modelly', name: '정윤지', part: 'FE', votes: 0 }, + { id: 9, team: 'Menual', name: '신용섭', part: 'FE', votes: 0 }, + { id: 10, team: 'Menual', name: '최무현', part: 'FE', votes: 0 }, +]; + +// 백엔드 후보자들 +export const beCandidates: PartleaderCandidate[] = [ + { id: 11, team: 'STORIX', name: '서가영', part: 'BE', votes: 0 }, + { id: 12, team: 'STORIX', name: '이수아', part: 'BE', votes: 0 }, + { id: 13, team: 'DiggIndie', name: '변호영', part: 'BE', votes: 0 }, + { id: 14, team: 'DiggIndie', name: '이윤지', part: 'BE', votes: 0 }, + { id: 15, team: 'CatchUp', name: '배승식', part: 'BE', votes: 0 }, + { id: 16, team: 'CatchUp', name: '신혁', part: 'BE', votes: 0 }, + { id: 17, team: 'Modelly', name: '이연호', part: 'BE', votes: 0 }, + { id: 18, team: 'Modelly', name: '이준영', part: 'BE', votes: 0 }, + { id: 19, team: 'Menual', name: '이지원', part: 'BE', votes: 0 }, + { id: 20, team: 'Menual', name: '변하영', part: 'BE', votes: 0 }, +]; + +// 전체 파트장 후보자들 export const partleaderCandidates: PartleaderCandidate[] = [ - { team: "STORIX", name: "김윤성" }, - { team: "STORIX", name: "이채연" }, - { team: "DiggIndie", name: "백승선" }, - { team: "DiggIndie", name: "조성아" }, - { team: "CatchUp", name: "장자윤" }, - { team: "CatchUp", name: "정성훈" }, - { team: "Modelly", name: "손주완" }, - { team: "Modelly", name: "정윤지" }, - { team: "GroomEasy", name: "신용섭" }, - { team: "GroomEasy", name: "최무현" }, + ...feCandidates, + ...beCandidates, ]; diff --git a/next-vote-22nd/src/features/auth/api/auth.repository.ts b/next-vote-22nd/src/features/auth/api/auth.repository.ts new file mode 100644 index 0000000..7d0ae1d --- /dev/null +++ b/next-vote-22nd/src/features/auth/api/auth.repository.ts @@ -0,0 +1,86 @@ +// src/features/auth/api/auth.repository.ts +import { apiClient } from '@/lib/axios'; +import { + LoginInput, + SignupInput, + LoginResponse, + loginResponseSchema, +} from '../schemas/auth.schema'; + +export const authRepository = { + // 로그인 + async login(data: LoginInput): Promise { + const response = await apiClient.post('/api/v1/auth/user/login', data); + + // 🔍 디버깅: 실제 응답 데이터 확인 + console.log('🔍 Login Response Data:', response.data); + + // 백엔드 응답 구조: { isSuccess, code, message, result, timestamp } + const { result } = response.data; + + if (!result) { + console.error('🔴 No result in response:', response.data); + throw new Error('Invalid login response format'); + } + + const loginData: LoginResponse = { + accessToken: result.accessToken, + refreshToken: result.refreshToken, + }; + + console.log('✅ Extracted Login Data:', loginData); + + if (!loginData.accessToken || !loginData.refreshToken) { + console.error('🔴 Missing tokens:', loginData); + throw new Error('Missing tokens in login response'); + } + + return loginData; + }, + + // 회원가입 + async signup(data: SignupInput): Promise { + const response = await apiClient.post('/api/v1/auth/user/signup', data); + return response.data?.message || 'Signup successful'; + }, + + // 로그아웃 + async logout(refreshToken: string): Promise { + const response = await apiClient.post('/api/v1/auth/user/logout', { + refreshToken, + }); + return response.data?.message || 'Logout successful'; + }, + + // 토큰 갱신 + async refreshToken(refreshToken: string): Promise { + const response = await apiClient.post('/api/v1/auth/refresh_token', { + refreshToken, + }); + + console.log('🔍 Refresh Token Response:', response.data); + + const { result } = response.data; + + const tokenData: LoginResponse = { + accessToken: result.accessToken, + refreshToken: result.refreshToken, + }; + + return tokenData; + }, + + // 팀 목록 조회 + async getTeams(): Promise { + const response = await apiClient.get('/api/v1/auth/user/team'); + // result가 배열이면 그대로, 아니면 response.data + return response.data?.result || response.data; + }, + + // 파트 목록 조회 + async getParts(): Promise { + const response = await apiClient.get('/api/v1/auth/user/part'); + // result가 배열이면 그대로, 아니면 response.data + return response.data?.result || response.data; + }, +}; diff --git a/next-vote-22nd/src/features/auth/hooks/use-auth.ts b/next-vote-22nd/src/features/auth/hooks/use-auth.ts new file mode 100644 index 0000000..41df715 --- /dev/null +++ b/next-vote-22nd/src/features/auth/hooks/use-auth.ts @@ -0,0 +1,60 @@ +// src/features/auth/hooks/use-auth.ts +import { useMutation } from '@tanstack/react-query'; +import { useRouter } from 'next/navigation'; +import { authRepository } from '../api/auth.repository'; +import { useAuthStore } from '../stores/auth-store'; +import { LoginInput, SignupInput } from '../schemas/auth.schema'; + +// 로그인 Hook +export function useLogin() { + const router = useRouter(); + const { setTokens, setUserId } = useAuthStore(); + + return useMutation({ + mutationFn: (data: LoginInput) => authRepository.login(data), + onSuccess: (response, variables) => { + // 토큰 저장 (AccessToken은 Zustand, RefreshToken은 sessionStorage) + setTokens(response.accessToken, response.refreshToken); + // 사용자 ID 저장 + setUserId(variables.loginId); + }, + onError: (error: any) => { + console.error('Login failed:', error); + }, + }); +} + +// 회원가입 Hook +export function useSignup() { + const router = useRouter(); + + return useMutation({ + mutationFn: (data: SignupInput) => authRepository.signup(data), + onSuccess: () => { + // 회원가입 성공 후 로그인 페이지로 이동은 컴포넌트에서 처리 + }, + onError: (error: any) => { + console.error('Signup failed:', error); + }, + }); +} + +// 로그아웃 Hook +export function useLogout() { + const router = useRouter(); + const { logout } = useAuthStore(); + + return useMutation({ + mutationFn: (refreshToken: string) => authRepository.logout(refreshToken), + onSuccess: () => { + logout(); + router.push('/login'); + }, + onError: (error: any) => { + console.error('Logout failed:', error); + // 로그아웃 실패해도 로컬 토큰은 삭제 + logout(); + router.push('/login'); + }, + }); +} diff --git a/next-vote-22nd/src/features/auth/schemas/auth.schema.ts b/next-vote-22nd/src/features/auth/schemas/auth.schema.ts new file mode 100644 index 0000000..bb1e799 --- /dev/null +++ b/next-vote-22nd/src/features/auth/schemas/auth.schema.ts @@ -0,0 +1,30 @@ +// src/features/auth/schemas/auth.schema.ts +import { z } from 'zod'; + +// 로그인 스키마 +export const loginSchema = z.object({ + loginId: z.string().min(1, '아이디를 입력해주세요'), + password: z.string().min(1, '비밀번호를 입력해주세요'), +}); + +export type LoginInput = z.infer; + +// 회원가입 스키마 +export const signupSchema = z.object({ + loginId: z.string().min(3, '아이디는 최소 3자 이상이어야 합니다'), + password: z.string().min(6, '비밀번호는 최소 6자 이상이어야 합니다'), + email: z.string().email('올바른 이메일 형식이 아닙니다'), + part: z.enum(['FE', 'BE']), + name: z.string().min(1, '이름을 입력해주세요'), + team: z.enum(['DIGGINDIE', 'MODELLY', 'CATCHUP', 'GROOMEASY', 'STORIX']), +}); + +export type SignupInput = z.infer; + +// 로그인 응답 스키마 +export const loginResponseSchema = z.object({ + accessToken: z.string(), + refreshToken: z.string(), +}); + +export type LoginResponse = z.infer; diff --git a/next-vote-22nd/src/features/auth/stores/auth-store.ts b/next-vote-22nd/src/features/auth/stores/auth-store.ts new file mode 100644 index 0000000..0fc8ba0 --- /dev/null +++ b/next-vote-22nd/src/features/auth/stores/auth-store.ts @@ -0,0 +1,43 @@ +// src/features/auth/stores/auth-store.ts +import { create } from 'zustand'; + +interface AuthState { + accessToken: string | null; + userId: string | null; + setTokens: (accessToken: string, refreshToken: string) => void; + setUserId: (userId: string) => void; + logout: () => void; + isAuthenticated: () => boolean; +} + +export const useAuthStore = create((set, get) => ({ + accessToken: null, + userId: null, + + setTokens: (accessToken: string, refreshToken: string) => { + set({ accessToken }); + // RefreshToken은 sessionStorage에 저장 + if (typeof window !== 'undefined') { + sessionStorage.setItem('refreshToken', refreshToken); + } + }, + + setUserId: (userId: string) => { + set({ userId }); + if (typeof window !== 'undefined') { + localStorage.setItem('userId', userId); + } + }, + + logout: () => { + set({ accessToken: null, userId: null }); + if (typeof window !== 'undefined') { + sessionStorage.removeItem('refreshToken'); + localStorage.removeItem('userId'); + } + }, + + isAuthenticated: () => { + return !!get().accessToken; + }, +})); diff --git a/next-vote-22nd/src/features/vote/api/vote.repository.ts b/next-vote-22nd/src/features/vote/api/vote.repository.ts new file mode 100644 index 0000000..66d29ba --- /dev/null +++ b/next-vote-22nd/src/features/vote/api/vote.repository.ts @@ -0,0 +1,69 @@ +// src/features/vote/api/vote.repository.ts +import { apiClient } from '@/lib/axios'; +import { Candidate, candidatesResponseSchema } from '../schemas/vote.schema'; + +export const voteRepository = { + // 투표하기 + async vote(candidateId: number): Promise { + console.log('🔍 Vote Request - candidateId:', candidateId); + console.log('🔍 Vote Request - type:', typeof candidateId); + + const requestData = { candidateId }; + console.log('🔍 Vote Request - data:', requestData); + + const response = await apiClient.post('/api/v1/votes', requestData); + + // 백엔드 응답이 { isSuccess, code, message, result, timestamp } 형식 + console.log('🔍 Vote Response:', response.data); + return response.data?.message || 'Vote successful'; + }, + + // 파트장 후보 목록 조회 (득표순 정렬) + async getPartLeaderCandidates(): Promise { + const response = await apiClient.get('/api/v1/votes/part-leader'); + + console.log('🔍 Part Leader Response:', response.data); + + const { result } = response.data; + + if (!result || !Array.isArray(result)) { + console.error('🔴 Invalid result format:', response.data); + return []; + } + + // 백엔드 키 이름을 프론트엔드 형식으로 변환 + const candidates = result.map((item: any) => ({ + id: item.id, + name: item.name, + team: item.description, // description이 실제로는 파트 정보 + votes: item.voteCount, + })); + + console.log('✅ Mapped Part Leader Candidates:', candidates); + return candidates; + }, + + // 데모데이 후보 목록 조회 (득표순 정렬) + async getDemoDayCandidates(): Promise { + const response = await apiClient.get('/api/v1/votes/demo-day'); + + console.log('🔍 Demo Day Response:', response.data); + + const { result } = response.data; + + if (!result || !Array.isArray(result)) { + console.error('🔴 Invalid result format:', response.data); + return []; + } + + const candidates = result.map((item: any) => ({ + id: item.id, + name: item.name, + team: item.team || item.teamName || item.description, + votes: item.voteCount || item.votes || 0, + })); + + console.log('✅ Mapped Demo Day Candidates:', candidates); + return candidates; + }, +}; diff --git a/next-vote-22nd/src/features/vote/hooks/use-vote.ts b/next-vote-22nd/src/features/vote/hooks/use-vote.ts new file mode 100644 index 0000000..4c64934 --- /dev/null +++ b/next-vote-22nd/src/features/vote/hooks/use-vote.ts @@ -0,0 +1,44 @@ +// src/features/vote/hooks/use-vote.ts +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { voteRepository } from '../api/vote.repository'; + +// Query Keys +export const voteKeys = { + all: ['votes'] as const, + partLeader: () => [...voteKeys.all, 'part-leader'] as const, + demoDay: () => [...voteKeys.all, 'demo-day'] as const, +}; + +// 투표하기 Hook +export function useVote() { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: (candidateId: number) => voteRepository.vote(candidateId), + onSuccess: () => { + // 투표 후 후보자 목록 다시 가져오기 + queryClient.invalidateQueries({ queryKey: voteKeys.all }); + }, + onError: (error: any) => { + console.error('Vote failed:', error); + }, + }); +} + +// 파트장 후보 목록 조회 Hook +export function usePartLeaderCandidates() { + return useQuery({ + queryKey: voteKeys.partLeader(), + queryFn: () => voteRepository.getPartLeaderCandidates(), + staleTime: 30 * 1000, // 30초 + }); +} + +// 데모데이 후보 목록 조회 Hook +export function useDemoDayCandidates() { + return useQuery({ + queryKey: voteKeys.demoDay(), + queryFn: () => voteRepository.getDemoDayCandidates(), + staleTime: 30 * 1000, // 30초 + }); +} diff --git a/next-vote-22nd/src/features/vote/schemas/vote.schema.ts b/next-vote-22nd/src/features/vote/schemas/vote.schema.ts new file mode 100644 index 0000000..0f98393 --- /dev/null +++ b/next-vote-22nd/src/features/vote/schemas/vote.schema.ts @@ -0,0 +1,24 @@ +// src/features/vote/schemas/vote.schema.ts +import { z } from 'zod'; + +// 투표 요청 스키마 +export const voteRequestSchema = z.object({ + candidateId: z.number().positive('후보자를 선택해주세요'), +}); + +export type VoteRequest = z.infer; + +// 후보자 스키마 +export const candidateSchema = z.object({ + id: z.number(), + name: z.string(), + team: z.string(), + votes: z.number(), +}); + +export type Candidate = z.infer; + +// 후보자 목록 응답 스키마 +export const candidatesResponseSchema = z.array(candidateSchema); + +export type CandidatesResponse = z.infer; diff --git a/next-vote-22nd/src/lib/axios.ts b/next-vote-22nd/src/lib/axios.ts new file mode 100644 index 0000000..a846b53 --- /dev/null +++ b/next-vote-22nd/src/lib/axios.ts @@ -0,0 +1,77 @@ +// src/lib/axios.ts +import axios, { AxiosError, InternalAxiosRequestConfig } from 'axios'; +import { useAuthStore } from '@/features/auth/stores/auth-store'; + +const API_BASE_URL = + process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:8080'; + +export const apiClient = axios.create({ + baseURL: API_BASE_URL, + headers: { + 'Content-Type': 'application/json', + }, + timeout: 10000, +}); + +// Request Interceptor: AccessToken 자동 첨부 +apiClient.interceptors.request.use( + (config: InternalAxiosRequestConfig) => { + const token = useAuthStore.getState().accessToken; + if (token && config.headers) { + config.headers.Authorization = `Bearer ${token}`; + } + return config; + }, + (error) => Promise.reject(error) +); + +// Response Interceptor: 토큰 갱신 및 에러 처리 +apiClient.interceptors.response.use( + (response) => response, + async (error: AxiosError) => { + const originalRequest = error.config as InternalAxiosRequestConfig & { + _retry?: boolean; + }; + + // 401 에러이고 재시도하지 않은 요청인 경우 + if (error.response?.status === 401 && !originalRequest._retry) { + originalRequest._retry = true; + + try { + const refreshToken = sessionStorage.getItem('refreshToken'); + if (!refreshToken) { + throw new Error('No refresh token available'); + } + + // 토큰 갱신 요청 + const response = await axios.post( + `${API_BASE_URL}/api/v1/auth/refresh_token`, + { + refreshToken, + } + ); + + const { accessToken, refreshToken: newRefreshToken } = response.data; + + // 새 토큰 저장 + useAuthStore.getState().setTokens(accessToken, newRefreshToken); + sessionStorage.setItem('refreshToken', newRefreshToken); + + // 원래 요청 재시도 + if (originalRequest.headers) { + originalRequest.headers.Authorization = `Bearer ${accessToken}`; + } + return apiClient(originalRequest); + } catch (refreshError) { + // 토큰 갱신 실패 시 로그아웃 처리 + useAuthStore.getState().logout(); + if (typeof window !== 'undefined') { + window.location.href = '/login'; + } + return Promise.reject(refreshError); + } + } + + return Promise.reject(error); + } +); diff --git a/next-vote-22nd/src/lib/react-query.tsx b/next-vote-22nd/src/lib/react-query.tsx new file mode 100644 index 0000000..ff7cb83 --- /dev/null +++ b/next-vote-22nd/src/lib/react-query.tsx @@ -0,0 +1,28 @@ +// src/lib/react-query.tsx +'use client'; + +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { useState, ReactNode } from 'react'; + +export function ReactQueryProvider({ children }: { children: ReactNode }) { + const [queryClient] = useState( + () => + new QueryClient({ + defaultOptions: { + queries: { + staleTime: 60 * 1000, // 1분 + gcTime: 5 * 60 * 1000, // 5분 (이전 cacheTime) + retry: 1, + refetchOnWindowFocus: false, + }, + mutations: { + retry: false, + }, + }, + }) + ); + + return ( + {children} + ); +} From 679741a41411aca816a22020f85d61e4a2cb2edd Mon Sep 17 00:00:00 2001 From: codus02 Date: Sat, 20 Dec 2025 23:17:36 +0900 Subject: [PATCH 14/20] chore: trigger vercel deploy From a739ae23641c83230a60d56b54d7a1f83e9e476c Mon Sep 17 00:00:00 2001 From: codus02 Date: Sun, 21 Dec 2025 00:02:39 +0900 Subject: [PATCH 15/20] suspense --- next-vote-22nd/src/app/demoday/step2/page.tsx | 24 ++- next-vote-22nd/src/app/demoday/step3/page.tsx | 30 +++- .../src/app/partleader/step2/Step2Client.tsx | 143 ++++++++++++++++++ .../src/app/partleader/step2/page.tsx | 115 +------------- .../src/app/partleader/step3/Step3Client.tsx | 106 +++++++++++++ .../src/app/partleader/step3/page.tsx | 80 +--------- .../src/features/vote/api/vote.repository.ts | 102 ++++++++----- 7 files changed, 366 insertions(+), 234 deletions(-) create mode 100644 next-vote-22nd/src/app/partleader/step2/Step2Client.tsx create mode 100644 next-vote-22nd/src/app/partleader/step3/Step3Client.tsx diff --git a/next-vote-22nd/src/app/demoday/step2/page.tsx b/next-vote-22nd/src/app/demoday/step2/page.tsx index 49b05c7..bac06a3 100644 --- a/next-vote-22nd/src/app/demoday/step2/page.tsx +++ b/next-vote-22nd/src/app/demoday/step2/page.tsx @@ -5,6 +5,7 @@ import Link from 'next/link'; import SmallBox from '@/components/box/SmallBox'; import { Suspense, useState } from 'react'; import { demodayCandidates, DemodayCandidate } from '@/data/demodayCandidates'; +import { useVote } from '@/features/vote/hooks/use-vote'; const steps = [1, 2, 3]; const currentStep = 2; @@ -18,6 +19,8 @@ function DemoDayContent() { demodayCandidates.map((c) => ({ ...c, isSelect: false })) ); + const voteMutation = useVote(); + const handleSelect = (index: number) => { setCandidates((prev) => prev.map((candidate, candidateIndex) => @@ -32,8 +35,19 @@ function DemoDayContent() { const selectedCandidate = candidates.find((c) => c.isSelect); if (!selectedCandidate) return; - alert(`${selectedCandidate.team}에 투표했습니다!`); - window.location.href = '/demoday/step3'; + console.log('🔍 투표 시도 - candidateId:', selectedCandidate.id); + + // 실제 API 호출 + voteMutation.mutate(selectedCandidate.id, { + onSuccess: () => { + alert(`${selectedCandidate.team}에 투표했습니다!`); + window.location.href = '/demoday/step3'; + }, + onError: (error) => { + console.error('❌ 투표 실패:', error); + alert('투표에 실패했습니다. 다시 시도해주세요.'); + }, + }); }; const hasSelection = candidates.some((candidate) => candidate.isSelect); @@ -86,14 +100,14 @@ function DemoDayContent() {
diff --git a/next-vote-22nd/src/app/demoday/step3/page.tsx b/next-vote-22nd/src/app/demoday/step3/page.tsx index fcd7fcc..c97b8c5 100644 --- a/next-vote-22nd/src/app/demoday/step3/page.tsx +++ b/next-vote-22nd/src/app/demoday/step3/page.tsx @@ -5,6 +5,8 @@ import Link from 'next/link'; import ResultBox from '@/components/box/ResultBox'; import { useEffect, useState } from 'react'; import { demodayCandidates, DemodayCandidate } from '@/data/demodayCandidates'; +import { useQuery } from '@tanstack/react-query'; +import { voteRepository } from '@/features/vote/api/vote.repository'; const steps = [1, 2, 3]; const currentStep = 3; @@ -12,11 +14,35 @@ const currentStep = 3; export default function DemoDayStep3Page() { const [candidates, setCandidates] = useState([]); + // API에서 실제 득표 데이터 가져오기 + const { data: apiCandidates } = useQuery({ + queryKey: ['demoday-results'], + queryFn: () => voteRepository.getDemoDayCandidates(), + retry: 1, + }); + useEffect(() => { + let finalCandidates: DemodayCandidate[]; + + if (apiCandidates && apiCandidates.length > 0) { + // API 데이터가 있으면 사용 + console.log('✅ API 데이터 사용:', apiCandidates); + finalCandidates = apiCandidates.map((c) => ({ + id: c.id, + team: c.team, + name: c.name, + votes: c.votes, + })); + } else { + // API 데이터가 없으면 로컬 데이터 사용 + console.log('⚠️ 로컬 데이터 사용 (API 데이터 없음)'); + finalCandidates = demodayCandidates; + } + // 득표순으로 정렬 (내림차순) - const sorted = [...demodayCandidates].sort((a, b) => b.votes - a.votes); + const sorted = [...finalCandidates].sort((a, b) => b.votes - a.votes); setCandidates(sorted); - }, []); + }, [apiCandidates]); return (
diff --git a/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx b/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx new file mode 100644 index 0000000..74a2a70 --- /dev/null +++ b/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx @@ -0,0 +1,143 @@ +// src/app/partleader/step2/Step2Client.tsx +'use client'; + +import Link from 'next/link'; +import SmallBox from '@/components/box/SmallBox'; +import { useState, useEffect } from 'react'; +import { useSearchParams } from 'next/navigation'; +import { + feCandidates, + beCandidates, + PartleaderCandidate, +} from '@/data/partleaderCandidates'; +import { useVote } from '@/features/vote/hooks/use-vote'; + +const steps = [1, 2, 3]; +const currentStep = 2; + +interface CandidateWithSelection extends PartleaderCandidate { + isSelect: boolean; +} + +export default function Step2Client() { + const searchParams = useSearchParams(); + const pageTitle = searchParams.get('title') ?? 'FE 파트장 투표'; + + const [candidates, setCandidates] = useState([]); + const voteMutation = useVote(); + + useEffect(() => { + const isFE = pageTitle.includes('FE'); + const candidateList = isFE ? feCandidates : beCandidates; + + setCandidates(candidateList.map((c) => ({ ...c, isSelect: false }))); + }, [pageTitle]); + + const handleSelect = (index: number) => { + setCandidates((prev) => + prev.map((candidate, candidateIndex) => + candidateIndex === index + ? { ...candidate, isSelect: true } + : { ...candidate, isSelect: false } + ) + ); + }; + + const handleSubmit = () => { + const selectedCandidate = candidates.find((c) => c.isSelect); + if (!selectedCandidate) return; + + console.log('🔍 투표 시도 - candidateId:', selectedCandidate.id); + console.log('🔍 투표 시도 - candidate:', selectedCandidate); + + voteMutation.mutate(selectedCandidate.id, { + onSuccess: (data) => { + console.log('✅ 투표 성공:', data); + alert(`${selectedCandidate.name}님에게 투표했습니다!`); + + window.location.href = `/partleader/step3?title=${encodeURIComponent( + pageTitle.replace('투표', '투표 결과') + )}`; + }, + onError: (error: any) => { + console.error('❌ 투표 실패 - Full Error:', error); + console.error('❌ 투표 실패 - Response:', error.response?.data); + console.error('❌ 투표 실패 - Status:', error.response?.status); + console.error('❌ 투표 실패 - Message:', error.message); + + const errorMsg = + error.response?.data?.message || + error.response?.data?.error || + error.message || + '알 수 없는 오류'; + + alert( + `투표에 실패했습니다.\n에러: ${errorMsg}\n\n브라우저 콘솔을 확인해주세요.` + ); + }, + }); + }; + + const hasSelection = candidates.some((candidate) => candidate.isSelect); + + return ( +
+
+
+ {steps.map((step) => ( + + {step} + + ))} +
+ +
+
+ + ← + +

{pageTitle}

+
+ +
+ +
+ {candidates.map((candidate, index) => ( + handleSelect(index)} + /> + ))} +
+
+ + +
+
+ ); +} diff --git a/next-vote-22nd/src/app/partleader/step2/page.tsx b/next-vote-22nd/src/app/partleader/step2/page.tsx index b3255e8..732b125 100644 --- a/next-vote-22nd/src/app/partleader/step2/page.tsx +++ b/next-vote-22nd/src/app/partleader/step2/page.tsx @@ -1,116 +1,11 @@ // src/app/partleader/step2/page.tsx -'use client'; - -import Link from 'next/link'; -import SmallBox from '@/components/box/SmallBox'; -import { useState, useEffect } from 'react'; -import { useSearchParams } from 'next/navigation'; -import { - feCandidates, - beCandidates, - PartleaderCandidate, -} from '@/data/partleaderCandidates'; - -const steps = [1, 2, 3]; -const currentStep = 2; - -interface CandidateWithSelection extends PartleaderCandidate { - isSelect: boolean; -} +import { Suspense } from 'react'; +import Step2Client from './Step2Client'; export default function PartLeaderStep2Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get('title') ?? 'FE 파트장 투표'; - - const [candidates, setCandidates] = useState([]); - - useEffect(() => { - const isFE = pageTitle.includes('FE'); - const candidateList = isFE ? feCandidates : beCandidates; - - setCandidates(candidateList.map((c) => ({ ...c, isSelect: false }))); - }, [pageTitle]); - - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((candidate, candidateIndex) => - candidateIndex === index - ? { ...candidate, isSelect: true } - : { ...candidate, isSelect: false } - ) - ); - }; - - const handleSubmit = () => { - const selectedCandidate = candidates.find((c) => c.isSelect); - if (!selectedCandidate) return; - - alert(`${selectedCandidate.name}님에게 투표했습니다!`); - window.location.href = `/partleader/step3?title=${encodeURIComponent( - pageTitle.replace('투표', '투표 결과') - )}`; - }; - - const hasSelection = candidates.some((candidate) => candidate.isSelect); - return ( -
-
-
- {steps.map((step) => ( - - {step} - - ))} -
- -
-
- - ← - -

{pageTitle}

-
- -
- -
- {candidates.map((candidate, index) => ( - handleSelect(index)} - /> - ))} -
-
- - -
-
+ + + ); } diff --git a/next-vote-22nd/src/app/partleader/step3/Step3Client.tsx b/next-vote-22nd/src/app/partleader/step3/Step3Client.tsx new file mode 100644 index 0000000..ac15562 --- /dev/null +++ b/next-vote-22nd/src/app/partleader/step3/Step3Client.tsx @@ -0,0 +1,106 @@ +// src/app/partleader/step3/Step3Client.tsx +'use client'; + +import Link from 'next/link'; +import ResultBox from '@/components/box/ResultBox'; +import { useSearchParams } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { + feCandidates, + beCandidates, + PartleaderCandidate, +} from '@/data/partleaderCandidates'; +import { useQuery } from '@tanstack/react-query'; +import { voteRepository } from '@/features/vote/api/vote.repository'; + +const steps = [1, 2, 3]; +const currentStep = 3; + +export default function Step3Client() { + const searchParams = useSearchParams(); + const pageTitle = searchParams.get('title') ?? 'FE 파트장 투표 결과'; + + const [candidates, setCandidates] = useState([]); + + const { data: apiCandidates } = useQuery({ + queryKey: ['partleader-results'], + queryFn: () => voteRepository.getPartLeaderCandidates(), + retry: 1, + }); + + useEffect(() => { + const isFE = pageTitle.includes('FE'); + const localCandidates = isFE ? feCandidates : beCandidates; + + let finalCandidates: PartleaderCandidate[]; + + if (apiCandidates && apiCandidates.length > 0) { + console.log('✅ API 데이터 사용:', apiCandidates); + + const converted: PartleaderCandidate[] = apiCandidates.map((c) => ({ + id: c.id, + team: c.team, + name: c.name, + part: c.team.includes('프론트') || c.team.includes('FE') ? 'FE' : 'BE', + votes: c.votes, + })); + + const filtered = converted.filter((c) => c.part === (isFE ? 'FE' : 'BE')); + finalCandidates = filtered; + } else { + console.log('⚠️ 로컬 데이터 사용 (API 데이터 없음)'); + finalCandidates = localCandidates; + } + + const sorted = [...finalCandidates].sort((a, b) => b.votes - a.votes); + setCandidates(sorted); + }, [pageTitle, apiCandidates]); + + return ( +
+
+
+ {steps.map((step) => ( + + {step} + + ))} +
+ +
+
+

{pageTitle}

+
+ +
+ +
+ {candidates.map((candidate, index) => ( + + ))} +
+
+ + + 투표 홈으로 + +
+
+ ); +} diff --git a/next-vote-22nd/src/app/partleader/step3/page.tsx b/next-vote-22nd/src/app/partleader/step3/page.tsx index ed025cf..b0e471f 100644 --- a/next-vote-22nd/src/app/partleader/step3/page.tsx +++ b/next-vote-22nd/src/app/partleader/step3/page.tsx @@ -1,81 +1,11 @@ // src/app/partleader/step3/page.tsx -'use client'; - -import Link from 'next/link'; -import ResultBox from '@/components/box/ResultBox'; -import { useSearchParams } from 'next/navigation'; -import { useEffect, useState } from 'react'; -import { - feCandidates, - beCandidates, - PartleaderCandidate, -} from '@/data/partleaderCandidates'; - -const steps = [1, 2, 3]; -const currentStep = 3; +import { Suspense } from 'react'; +import Step3Client from './Step3Client'; export default function PartLeaderStep3Page() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get('title') ?? 'FE 파트장 투표 결과'; - - const [candidates, setCandidates] = useState([]); - - useEffect(() => { - // title에서 FE/BE 판단 - const isFE = pageTitle.includes('FE'); - const candidateList = isFE ? feCandidates : beCandidates; - - // 득표순으로 정렬 (내림차순) - const sorted = [...candidateList].sort((a, b) => b.votes - a.votes); - - setCandidates(sorted); - }, [pageTitle]); - return ( -
-
-
- {steps.map((step) => ( - - {step} - - ))} -
- -
-
-

{pageTitle}

-
- -
- -
- {candidates.map((candidate, index) => ( - - ))} -
-
- - - 투표 홈으로 - -
-
+ + + ); } diff --git a/next-vote-22nd/src/features/vote/api/vote.repository.ts b/next-vote-22nd/src/features/vote/api/vote.repository.ts index 66d29ba..fe11f05 100644 --- a/next-vote-22nd/src/features/vote/api/vote.repository.ts +++ b/next-vote-22nd/src/features/vote/api/vote.repository.ts @@ -11,59 +11,77 @@ export const voteRepository = { const requestData = { candidateId }; console.log('🔍 Vote Request - data:', requestData); - const response = await apiClient.post('/api/v1/votes', requestData); - - // 백엔드 응답이 { isSuccess, code, message, result, timestamp } 형식 - console.log('🔍 Vote Response:', response.data); - return response.data?.message || 'Vote successful'; + try { + const response = await apiClient.post('/api/v1/votes', requestData); + + console.log('✅ Vote Response:', response.data); + return response.data?.message || 'Vote successful'; + } catch (error: any) { + console.error('❌ Vote Error - Full:', error); + console.error('❌ Vote Error - Response:', error.response?.data); + console.error('❌ Vote Error - Status:', error.response?.status); + console.error('❌ Vote Error - Headers:', error.response?.headers); + throw error; + } }, // 파트장 후보 목록 조회 (득표순 정렬) async getPartLeaderCandidates(): Promise { - const response = await apiClient.get('/api/v1/votes/part-leader'); - - console.log('🔍 Part Leader Response:', response.data); - - const { result } = response.data; - - if (!result || !Array.isArray(result)) { - console.error('🔴 Invalid result format:', response.data); + try { + const response = await apiClient.get('/api/v1/votes/part-leader'); + + console.log('🔍 Part Leader Response:', response.data); + + const { result } = response.data; + + if (!result || !Array.isArray(result)) { + console.error('🔴 Invalid result format:', response.data); + return []; + } + + // 백엔드 키 이름을 프론트엔드 형식으로 변환 + const candidates = result.map((item: any) => ({ + id: item.id, + name: item.name, + team: item.description, // description이 실제로는 파트 정보 + votes: item.voteCount, + })); + + console.log('✅ Mapped Part Leader Candidates:', candidates); + return candidates; + } catch (error) { + console.error('❌ Part Leader Error:', error); return []; } - - // 백엔드 키 이름을 프론트엔드 형식으로 변환 - const candidates = result.map((item: any) => ({ - id: item.id, - name: item.name, - team: item.description, // description이 실제로는 파트 정보 - votes: item.voteCount, - })); - - console.log('✅ Mapped Part Leader Candidates:', candidates); - return candidates; }, // 데모데이 후보 목록 조회 (득표순 정렬) async getDemoDayCandidates(): Promise { - const response = await apiClient.get('/api/v1/votes/demo-day'); - - console.log('🔍 Demo Day Response:', response.data); - - const { result } = response.data; - - if (!result || !Array.isArray(result)) { - console.error('🔴 Invalid result format:', response.data); + try { + const response = await apiClient.get('/api/v1/votes/demo-day'); + + console.log('🔍 Demo Day Response:', response.data); + + const { result } = response.data; + + if (!result || !Array.isArray(result)) { + console.error('🔴 Invalid result format:', response.data); + return []; + } + + // 데모데이는 팀 정보가 있을 것으로 예상 + const candidates = result.map((item: any) => ({ + id: item.id, + name: item.name, + team: item.team || item.teamName || item.description, + votes: item.voteCount || item.votes || 0, + })); + + console.log('✅ Mapped Demo Day Candidates:', candidates); + return candidates; + } catch (error) { + console.error('❌ Demo Day Error:', error); return []; } - - const candidates = result.map((item: any) => ({ - id: item.id, - name: item.name, - team: item.team || item.teamName || item.description, - votes: item.voteCount || item.votes || 0, - })); - - console.log('✅ Mapped Demo Day Candidates:', candidates); - return candidates; }, }; From f41b0b7bfcf098f0e566f09bcf67ec4e8ab7875d Mon Sep 17 00:00:00 2001 From: codus02 Date: Sun, 21 Dec 2025 00:16:07 +0900 Subject: [PATCH 16/20] next version.. --- next-vote-22nd/package-lock.json | 100 +++++++++++++++---------------- next-vote-22nd/package.json | 6 +- 2 files changed, 53 insertions(+), 53 deletions(-) diff --git a/next-vote-22nd/package-lock.json b/next-vote-22nd/package-lock.json index a0b55ee..f0f62d2 100644 --- a/next-vote-22nd/package-lock.json +++ b/next-vote-22nd/package-lock.json @@ -10,9 +10,9 @@ "dependencies": { "@tanstack/react-query": "^5.90.12", "axios": "^1.13.2", - "next": "16.0.1", - "react": "19.2.0", - "react-dom": "19.2.0", + "next": "^16.1.0", + "react": "^19.2.3", + "react-dom": "^19.2.3", "zod": "^4.2.1", "zustand": "^5.0.9" }, @@ -1039,9 +1039,9 @@ } }, "node_modules/@next/env": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.1.tgz", - "integrity": "sha512-LFvlK0TG2L3fEOX77OC35KowL8D7DlFF45C0OvKMC4hy8c/md1RC4UMNDlUGJqfCoCS2VWrZ4dSE6OjaX5+8mw==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.0.tgz", + "integrity": "sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { @@ -1055,9 +1055,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.1.tgz", - "integrity": "sha512-R0YxRp6/4W7yG1nKbfu41bp3d96a0EalonQXiMe+1H9GTHfKxGNCGFNWUho18avRBPsO8T3RmdWuzmfurlQPbg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.0.tgz", + "integrity": "sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==", "cpu": [ "arm64" ], @@ -1071,9 +1071,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.1.tgz", - "integrity": "sha512-kETZBocRux3xITiZtOtVoVvXyQLB7VBxN7L6EPqgI5paZiUlnsgYv4q8diTNYeHmF9EiehydOBo20lTttCbHAg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.0.tgz", + "integrity": "sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==", "cpu": [ "x64" ], @@ -1087,9 +1087,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.1.tgz", - "integrity": "sha512-hWg3BtsxQuSKhfe0LunJoqxjO4NEpBmKkE+P2Sroos7yB//OOX3jD5ISP2wv8QdUwtRehMdwYz6VB50mY6hqAg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.0.tgz", + "integrity": "sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==", "cpu": [ "arm64" ], @@ -1103,9 +1103,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.1.tgz", - "integrity": "sha512-UPnOvYg+fjAhP3b1iQStcYPWeBFRLrugEyK/lDKGk7kLNua8t5/DvDbAEFotfV1YfcOY6bru76qN9qnjLoyHCQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.0.tgz", + "integrity": "sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==", "cpu": [ "arm64" ], @@ -1119,9 +1119,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.1.tgz", - "integrity": "sha512-Et81SdWkcRqAJziIgFtsFyJizHoWne4fzJkvjd6V4wEkWTB4MX6J0uByUb0peiJQ4WeAt6GGmMszE5KrXK6WKg==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.0.tgz", + "integrity": "sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==", "cpu": [ "x64" ], @@ -1135,9 +1135,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.1.tgz", - "integrity": "sha512-qBbgYEBRrC1egcG03FZaVfVxrJm8wBl7vr8UFKplnxNRprctdP26xEv9nJ07Ggq4y1adwa0nz2mz83CELY7N6Q==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.0.tgz", + "integrity": "sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==", "cpu": [ "x64" ], @@ -1151,9 +1151,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.1.tgz", - "integrity": "sha512-cPuBjYP6I699/RdbHJonb3BiRNEDm5CKEBuJ6SD8k3oLam2fDRMKAvmrli4QMDgT2ixyRJ0+DTkiODbIQhRkeQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.0.tgz", + "integrity": "sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==", "cpu": [ "arm64" ], @@ -1167,9 +1167,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.1.tgz", - "integrity": "sha512-XeEUJsE4JYtfrXe/LaJn3z1pD19fK0Q6Er8Qoufi+HqvdO4LEPyCxLUt4rxA+4RfYo6S9gMlmzCMU2F+AatFqQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.0.tgz", + "integrity": "sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==", "cpu": [ "x64" ], @@ -2489,7 +2489,6 @@ "version": "2.8.26", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.26.tgz", "integrity": "sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==", - "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -5100,13 +5099,14 @@ "license": "MIT" }, "node_modules/next": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/next/-/next-16.0.1.tgz", - "integrity": "sha512-e9RLSssZwd35p7/vOa+hoDFggUZIUbZhIUSLZuETCwrCVvxOs87NamoUzT+vbcNAL8Ld9GobBnWOA6SbV/arOw==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/next/-/next-16.1.0.tgz", + "integrity": "sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==", "license": "MIT", "dependencies": { - "@next/env": "16.0.1", + "@next/env": "16.1.0", "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -5118,14 +5118,14 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.0.1", - "@next/swc-darwin-x64": "16.0.1", - "@next/swc-linux-arm64-gnu": "16.0.1", - "@next/swc-linux-arm64-musl": "16.0.1", - "@next/swc-linux-x64-gnu": "16.0.1", - "@next/swc-linux-x64-musl": "16.0.1", - "@next/swc-win32-arm64-msvc": "16.0.1", - "@next/swc-win32-x64-msvc": "16.0.1", + "@next/swc-darwin-arm64": "16.1.0", + "@next/swc-darwin-x64": "16.1.0", + "@next/swc-linux-arm64-gnu": "16.1.0", + "@next/swc-linux-arm64-musl": "16.1.0", + "@next/swc-linux-x64-gnu": "16.1.0", + "@next/swc-linux-x64-musl": "16.1.0", + "@next/swc-win32-arm64-msvc": "16.1.0", + "@next/swc-win32-x64-msvc": "16.1.0", "sharp": "^0.34.4" }, "peerDependencies": { @@ -5535,24 +5535,24 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.0" + "react": "^19.2.3" } }, "node_modules/react-is": { diff --git a/next-vote-22nd/package.json b/next-vote-22nd/package.json index 95e0369..f7d6901 100644 --- a/next-vote-22nd/package.json +++ b/next-vote-22nd/package.json @@ -11,9 +11,9 @@ "dependencies": { "@tanstack/react-query": "^5.90.12", "axios": "^1.13.2", - "next": "16.0.1", - "react": "19.2.0", - "react-dom": "19.2.0", + "next": "^16.1.0", + "react": "^19.2.3", + "react-dom": "^19.2.3", "zod": "^4.2.1", "zustand": "^5.0.9" }, From abd0fa0412e8ec5607b3521f916d5e563f147d5d Mon Sep 17 00:00:00 2001 From: codus02 Date: Sun, 21 Dec 2025 03:29:51 +0900 Subject: [PATCH 17/20] =?UTF-8?q?=EB=93=9D=ED=91=9C=EC=88=98=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-vote-22nd/src/app/demoday/step1/page.tsx | 12 +- next-vote-22nd/src/app/login/page.tsx | 19 ++-- .../src/app/partleader/step1/page.tsx | 10 +- .../src/features/auth/api/auth.repository.ts | 58 ++++------ .../src/features/auth/hooks/use-auth.ts | 76 +++++++++++-- .../src/features/auth/schemas/auth.schema.ts | 31 ++++- .../src/features/auth/stores/auth-store.ts | 11 +- .../src/features/vote/api/vote.repository.ts | 106 ++++++++---------- .../src/features/vote/schemas/vote.schema.ts | 31 ++++- next-vote-22nd/src/lib/axios.ts | 38 +++++-- 10 files changed, 254 insertions(+), 138 deletions(-) diff --git a/next-vote-22nd/src/app/demoday/step1/page.tsx b/next-vote-22nd/src/app/demoday/step1/page.tsx index 69a8064..fd37031 100644 --- a/next-vote-22nd/src/app/demoday/step1/page.tsx +++ b/next-vote-22nd/src/app/demoday/step1/page.tsx @@ -1,5 +1,8 @@ // src/app/demoday/step1/page.tsx +'use client'; + import LargeBox from '@/components/box/LargeBox'; +import Link from 'next/link'; const steps = [1, 2, 3]; const currentStep = 1; @@ -24,7 +27,14 @@ export default function DemoDayStep1Page() {
-
+
+ + ← +

데모데이 투표

diff --git a/next-vote-22nd/src/app/login/page.tsx b/next-vote-22nd/src/app/login/page.tsx index 4fb39a2..9ddb873 100644 --- a/next-vote-22nd/src/app/login/page.tsx +++ b/next-vote-22nd/src/app/login/page.tsx @@ -5,6 +5,7 @@ import { useState, FormEvent, ChangeEvent } from 'react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { useLogin } from '@/features/auth/hooks/use-auth'; +import { useAuthStore } from '@/features/auth/stores/auth-store'; export default function LoginPage() { const router = useRouter(); @@ -15,8 +16,8 @@ export default function LoginPage() { password: '', }); - // API Hook 사용 const loginMutation = useLogin(); + const setTokens = useAuthStore((state) => state.setTokens); // ✅ setTokens (복수형) const handleChange = (e: ChangeEvent) => { const { name, value } = e.target; @@ -32,7 +33,15 @@ export default function LoginPage() { password: formData.password, }, { - onSuccess: () => { + onSuccess: (data) => { + console.log('✅ 로그인 성공:', data); + + // ✅ accessToken과 refreshToken 모두 저장 + if (data.accessToken) { + setTokens(data.accessToken, data.refreshToken); + console.log('✅ 토큰 저장 완료'); + } + setUserName(formData.id); setShowWelcome(true); }, @@ -53,7 +62,6 @@ export default function LoginPage() { style={{ width: 393, height: 852 }} >
- {/* Vote Icon */} Vote icon - - {/* Welcome + Name - 왼쪽 정렬 */}
- - {/* Start Button */}
); diff --git a/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx b/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx index 74a2a70..414861d 100644 --- a/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx +++ b/next-vote-22nd/src/app/partleader/step2/Step2Client.tsx @@ -71,9 +71,7 @@ export default function Step2Client() { error.message || '알 수 없는 오류'; - alert( - `투표에 실패했습니다.\n에러: ${errorMsg}\n\n브라우저 콘솔을 확인해주세요.` - ); + alert(`에러: ${errorMsg}`); }, }); }; From 354c3dfbf43a976078d60b7bfff895698a7ee4ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Sun, 21 Dec 2025 04:14:01 +0900 Subject: [PATCH 19/20] =?UTF-8?q?style:=20step2&3=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next-vote-22nd/public/icons/CheckIcon.svg | 9 ++ next-vote-22nd/public/icons/check.svg | 8 -- .../src/app/demoday/step2/step2Client.tsx | 33 ++++--- .../src/app/demoday/step3/step3Client.tsx | 96 +++++++++---------- .../src/app/partleader/step2/step2Client.tsx | 2 +- .../src/app/partleader/step3/step3Client.tsx | 45 +++------ .../src/components/box/ResultBox.tsx | 4 +- .../src/components/box/SmallBox.tsx | 27 ++++-- .../src/components/common/LogoutModal.tsx | 34 ++++--- .../src/data/partleaderCandidates.ts | 2 +- next-vote-22nd/src/styles/globals.css | 14 +++ 11 files changed, 146 insertions(+), 128 deletions(-) create mode 100644 next-vote-22nd/public/icons/CheckIcon.svg delete mode 100644 next-vote-22nd/public/icons/check.svg diff --git a/next-vote-22nd/public/icons/CheckIcon.svg b/next-vote-22nd/public/icons/CheckIcon.svg new file mode 100644 index 0000000..1e364a2 --- /dev/null +++ b/next-vote-22nd/public/icons/CheckIcon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/next-vote-22nd/public/icons/check.svg b/next-vote-22nd/public/icons/check.svg deleted file mode 100644 index ff7edfb..0000000 --- a/next-vote-22nd/public/icons/check.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/next-vote-22nd/src/app/demoday/step2/step2Client.tsx b/next-vote-22nd/src/app/demoday/step2/step2Client.tsx index c4bead5..330a8b9 100644 --- a/next-vote-22nd/src/app/demoday/step2/step2Client.tsx +++ b/next-vote-22nd/src/app/demoday/step2/step2Client.tsx @@ -56,14 +56,20 @@ export default function DemoDayStep2Client() {
- - ← - -

{pageTitle}

+
+ + ← + +

{pageTitle}

+
+
@@ -77,17 +83,16 @@ export default function DemoDayStep2Client() {
- +
); diff --git a/next-vote-22nd/src/app/demoday/step3/step3Client.tsx b/next-vote-22nd/src/app/demoday/step3/step3Client.tsx index 40ed302..4c02c75 100644 --- a/next-vote-22nd/src/app/demoday/step3/step3Client.tsx +++ b/next-vote-22nd/src/app/demoday/step3/step3Client.tsx @@ -1,44 +1,39 @@ "use client"; import Link from "next/link"; -import SmallBox from "@/components/box/SmallBox"; -import { useState } from "react"; import { useSearchParams } from "next/navigation"; +import { useState } from "react"; +import ResultBox from "@/components/box/ResultBox"; +import LogoutModal from "@/components/common/LogoutModal"; const steps = [1, 2, 3]; -const currentStep = 2; +const currentStep = 3; -interface Candidate { - team: string; - name: string; - isSelect: boolean; -} - -const initialCandidates: Candidate[] = [ - { team: "STORIX", name: "STORIX", isSelect: false }, - { team: "DiggIndie", name: "DiggIndie", isSelect: false }, - { team: "CatchUp", name: "CatchUp", isSelect: false }, - { team: "Modelly", name: "Modelly", isSelect: false }, - { team: "GroomEasy", name: "GroomEasy", isSelect: false }, +const demodayCandidates = [ + { team: "STORIX", name: "STORIX" }, + { team: "DiggIndie", name: "DiggIndie" }, + { team: "CatchUp", name: "CatchUp" }, + { team: "Modelly", name: "Modelly" }, + { team: "GroomEasy", name: "GroomEasy" }, ]; export default function DemoDayStep3Content() { const searchParams = useSearchParams(); const pageTitle = searchParams.get("title") ?? "-"; - const [candidates, setCandidates] = useState(initialCandidates); - - const handleSelect = (index: number) => { - setCandidates((prev) => - prev.map((c, i) => - i === index ? { ...c, isSelect: true } : { ...c, isSelect: false } - ) - ); - }; - - const hasSelection = candidates.some((c) => c.isSelect); + const [isLogoutOpen, setIsLogoutOpen] = useState(false); return ( -
+
{ + if (e.target !== e.currentTarget) return; + setIsLogoutOpen(true); + }} + > + setIsLogoutOpen(false)} + />
{steps.map((step) => ( @@ -56,38 +51,39 @@ export default function DemoDayStep3Content() {
- - ← - -

{pageTitle} 결과

-
+
+ + ← + +

{pageTitle}

+
+
- {candidates.map((candidate, index) => ( - ( + handleSelect(index)} + name={candidate.name} + team={candidate.team} + votes={0} /> ))}
- + 돌아가기 +
); diff --git a/next-vote-22nd/src/app/partleader/step2/step2Client.tsx b/next-vote-22nd/src/app/partleader/step2/step2Client.tsx index 38d76e8..0fb842c 100644 --- a/next-vote-22nd/src/app/partleader/step2/step2Client.tsx +++ b/next-vote-22nd/src/app/partleader/step2/step2Client.tsx @@ -72,7 +72,7 @@ export default function PartLeaderStep2Client() {
-
+
{candidates.map((candidate, index) => ( - partleaderCandidates.map((candidate) => ({ - ...candidate, - isSelect: false, - })); - -export default function PartLeaderStep3Client() { +export default function PartLeaderStep3Page() { const searchParams = useSearchParams(); const pageTitle = searchParams.get("title") ?? "FE 파트장 투표"; - const [candidates] = useState(buildInitialCandidates()); - const hasSelection = candidates.some((candidate) => candidate.isSelect); const [isLogoutOpen, setIsLogoutOpen] = useState(false); return (
setIsLogoutOpen(true)} + onClick={(e) => { + if (e.target !== e.currentTarget) return; + setIsLogoutOpen(true); + }} >
@@ -68,27 +59,21 @@ export default function PartLeaderStep3Client() {
-
- {candidates.map((candidate) => ( +
+ {partleaderCandidates.map((candidate) => ( ))}
돌아가기 diff --git a/next-vote-22nd/src/components/box/ResultBox.tsx b/next-vote-22nd/src/components/box/ResultBox.tsx index e2ab6d8..a43fbca 100644 --- a/next-vote-22nd/src/components/box/ResultBox.tsx +++ b/next-vote-22nd/src/components/box/ResultBox.tsx @@ -25,11 +25,11 @@ const ResultBox = ({ name, team, votes, isSelected }: ResultBoxProps) => { {/* 오른쪽에 겹치는 동그라미 */}
{votes} diff --git a/next-vote-22nd/src/components/box/SmallBox.tsx b/next-vote-22nd/src/components/box/SmallBox.tsx index 278e6c5..9220d38 100644 --- a/next-vote-22nd/src/components/box/SmallBox.tsx +++ b/next-vote-22nd/src/components/box/SmallBox.tsx @@ -28,20 +28,31 @@ const SmallBox = ({ return ( - - {team} - - {name} +
+ + {team} + + {name} +
{isSelect && ( - - 선택됨 + + 선택됨 )}
diff --git a/next-vote-22nd/src/components/common/LogoutModal.tsx b/next-vote-22nd/src/components/common/LogoutModal.tsx index 8486c89..b168be6 100644 --- a/next-vote-22nd/src/components/common/LogoutModal.tsx +++ b/next-vote-22nd/src/components/common/LogoutModal.tsx @@ -2,7 +2,7 @@ "use client"; import { useRouter } from "next/navigation"; -import { useEffect, useState, MouseEvent } from "react"; +import { MouseEvent } from "react"; interface LogoutModalProps { isOpen: boolean; @@ -11,20 +11,15 @@ interface LogoutModalProps { export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { const router = useRouter(); - const [userId, setUserId] = useState(""); - - // 모달이 열릴 때 localStorage에서 id 읽기 - useEffect(() => { - if (!isOpen) return; - if (typeof window === "undefined") return; - - const stored = localStorage.getItem("userId"); - if (stored) setUserId(stored); - }, [isOpen]); if (!isOpen) return null; - const handleBackdropClick = () => { + // 모달이 열릴 때 localStorage에서 id 읽기 + const userId = + typeof window !== "undefined" ? localStorage.getItem("userId") ?? "" : ""; + + const handleBackdropClick = (e: MouseEvent) => { + if (e.target !== e.currentTarget) return; // 카드/내부 클릭이면 무시 onClose(); }; @@ -38,7 +33,7 @@ export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { localStorage.removeItem("userId"); } onClose(); - router.push("/login"); // 가장 처음 화면으로 이동 + router.push("/login"); // 로그인 화면으로 이동 }; return ( @@ -48,9 +43,20 @@ export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { > {/* 핑크 박스 */}
+

{userId || "User"}

diff --git a/next-vote-22nd/src/data/partleaderCandidates.ts b/next-vote-22nd/src/data/partleaderCandidates.ts index 86e83d2..cf72feb 100644 --- a/next-vote-22nd/src/data/partleaderCandidates.ts +++ b/next-vote-22nd/src/data/partleaderCandidates.ts @@ -13,5 +13,5 @@ export const partleaderCandidates: PartleaderCandidate[] = [ { team: "Modelly", name: "손주완" }, { team: "Modelly", name: "정윤지" }, { team: "GroomEasy", name: "신용섭" }, - { team: "GroomEasy", name: "최무현" }, + { team: "GroomEasy", name: "최무헌" }, ]; diff --git a/next-vote-22nd/src/styles/globals.css b/next-vote-22nd/src/styles/globals.css index fd91d41..8572bb5 100644 --- a/next-vote-22nd/src/styles/globals.css +++ b/next-vote-22nd/src/styles/globals.css @@ -70,3 +70,17 @@ body { line-height: 20px; text-align: center; } + +.text-body-01 { + font-weight: 700; + font-size: 16px; + line-height: 140%; + text-align: center; +} + +.text-body-02 { + font-weight: 700; + font-size: 24px; + line-height: 140%; + text-align: center; +} From 3e2cb14a2a90dc7eeb7c85f333faccc74003f1b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=9C=A4=EC=84=B1?= Date: Sun, 21 Dec 2025 05:59:25 +0900 Subject: [PATCH 20/20] =?UTF-8?q?fix:=20merge=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/app/demoday/step3/step3Client.tsx | 92 ++++++++++--------- .../src/components/common/LogoutModal.tsx | 20 +--- next-vote-22nd/src/lib/axios.ts | 34 +++---- next-vote-22nd/tmp.txt | 21 ----- 4 files changed, 67 insertions(+), 100 deletions(-) delete mode 100644 next-vote-22nd/tmp.txt diff --git a/next-vote-22nd/src/app/demoday/step3/step3Client.tsx b/next-vote-22nd/src/app/demoday/step3/step3Client.tsx index 4c02c75..db92c35 100644 --- a/next-vote-22nd/src/app/demoday/step3/step3Client.tsx +++ b/next-vote-22nd/src/app/demoday/step3/step3Client.tsx @@ -1,39 +1,51 @@ +// src/app/demoday/step3/page.tsx "use client"; import Link from "next/link"; -import { useSearchParams } from "next/navigation"; -import { useState } from "react"; import ResultBox from "@/components/box/ResultBox"; -import LogoutModal from "@/components/common/LogoutModal"; +import { useEffect, useState } from "react"; +import { demodayCandidates, DemodayCandidate } from "@/data/demodayCandidates"; +import { useQuery } from "@tanstack/react-query"; +import { voteRepository } from "@/features/vote/api/vote.repository"; const steps = [1, 2, 3]; const currentStep = 3; -const demodayCandidates = [ - { team: "STORIX", name: "STORIX" }, - { team: "DiggIndie", name: "DiggIndie" }, - { team: "CatchUp", name: "CatchUp" }, - { team: "Modelly", name: "Modelly" }, - { team: "GroomEasy", name: "GroomEasy" }, -]; +export default function DemoDayStep3Page() { + const [candidates, setCandidates] = useState([]); -export default function DemoDayStep3Content() { - const searchParams = useSearchParams(); - const pageTitle = searchParams.get("title") ?? "-"; - const [isLogoutOpen, setIsLogoutOpen] = useState(false); + // API에서 실제 득표 데이터 가져오기 + const { data: apiCandidates } = useQuery({ + queryKey: ["demoday-results"], + queryFn: () => voteRepository.getDemoDayCandidates(), + retry: 1, + }); + + useEffect(() => { + let finalCandidates: DemodayCandidate[]; + + if (apiCandidates && apiCandidates.length > 0) { + // API 데이터가 있으면 사용 + console.log("✅ API 데이터 사용:", apiCandidates); + finalCandidates = apiCandidates.map((c) => ({ + id: c.id, + team: c.team, + name: c.name, + votes: c.votes, + })); + } else { + // API 데이터가 없으면 로컬 데이터 사용 + console.log("⚠️ 로컬 데이터 사용 (API 데이터 없음)"); + finalCandidates = demodayCandidates; + } + + // 득표순으로 정렬 (내림차순) + const sorted = [...finalCandidates].sort((a, b) => b.votes - a.votes); + setCandidates(sorted); + }, [apiCandidates]); return ( -
{ - if (e.target !== e.currentTarget) return; - setIsLogoutOpen(true); - }} - > - setIsLogoutOpen(false)} - /> +
{steps.map((step) => ( @@ -51,38 +63,30 @@ export default function DemoDayStep3Content() {
-
- - ← - -

{pageTitle}

+
+

데모데이 결과

-
- {demodayCandidates.map((candidate) => ( + +
+ {candidates.map((candidate, index) => ( ))}
- 돌아가기 + 투표 홈으로
diff --git a/next-vote-22nd/src/components/common/LogoutModal.tsx b/next-vote-22nd/src/components/common/LogoutModal.tsx index 2c1d79d..a762a22 100644 --- a/next-vote-22nd/src/components/common/LogoutModal.tsx +++ b/next-vote-22nd/src/components/common/LogoutModal.tsx @@ -37,12 +37,7 @@ export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { if (!isOpen) return null; - // 모달이 열릴 때 localStorage에서 id 읽기 - const userId = - typeof window !== "undefined" ? localStorage.getItem("userId") ?? "" : ""; - - const handleBackdropClick = (e: MouseEvent) => { - if (e.target !== e.currentTarget) return; // 카드/내부 클릭이면 무시 + const handleBackdropClick = () => { onClose(); }; @@ -74,20 +69,9 @@ export default function LogoutModal({ isOpen, onClose }: LogoutModalProps) { > {/* 핑크 박스 */}
-

{userId || "User"}

diff --git a/next-vote-22nd/src/lib/axios.ts b/next-vote-22nd/src/lib/axios.ts index e89a570..225da2b 100644 --- a/next-vote-22nd/src/lib/axios.ts +++ b/next-vote-22nd/src/lib/axios.ts @@ -1,14 +1,14 @@ // src/lib/axios.ts -import axios, { AxiosError, InternalAxiosRequestConfig } from 'axios'; -import { useAuthStore } from '@/features/auth/stores/auth-store'; +import axios, { AxiosError, InternalAxiosRequestConfig } from "axios"; +import { useAuthStore } from "@/features/auth/stores/auth-store"; const API_BASE_URL = - process.env.NEXT_PUBLIC_API_BASE_URL || 'http://localhost:8080'; + process.env.NEXT_PUBLIC_API_BASE_URL || "http://localhost:8080"; export const apiClient = axios.create({ baseURL: API_BASE_URL, headers: { - 'Content-Type': 'application/json', + "Content-Type": "application/json", }, timeout: 10000, }); @@ -20,24 +20,24 @@ apiClient.interceptors.request.use( // 2) store에 없으면 sessionStorage fallback (클라이언트에서만) const sessionToken = - typeof window !== 'undefined' - ? sessionStorage.getItem('accessToken') + typeof window !== "undefined" + ? sessionStorage.getItem("accessToken") : null; const token = storeToken || sessionToken; - console.log('🔍 Request URL:', config.url); - console.log('🔍 Current Token from Store:', storeToken); - console.log('🔍 Current Token from Session:', sessionToken); + console.log("🔍 Request URL:", config.url); + console.log("🔍 Current Token from Store:", storeToken); + console.log("🔍 Current Token from Session:", sessionToken); if (token && config.headers) { config.headers.Authorization = `Bearer ${token}`; console.log( - '✅ Authorization Header Added:', + "✅ Authorization Header Added:", config.headers.Authorization ); } else { - console.warn('⚠️ No token available or headers missing'); + console.warn("⚠️ No token available or headers missing"); } return config; @@ -57,9 +57,9 @@ apiClient.interceptors.response.use( originalRequest._retry = true; try { - const refreshToken = sessionStorage.getItem('refreshToken'); + const refreshToken = sessionStorage.getItem("refreshToken"); if (!refreshToken) { - throw new Error('No refresh token available'); + throw new Error("No refresh token available"); } const response = await axios.post( @@ -72,8 +72,8 @@ apiClient.interceptors.response.use( useAuthStore.getState().setTokens(accessToken, newRefreshToken); // ✅ 여기에도 accessToken 저장 추가 (중요) - sessionStorage.setItem('accessToken', accessToken); - sessionStorage.setItem('refreshToken', newRefreshToken); + sessionStorage.setItem("accessToken", accessToken); + sessionStorage.setItem("refreshToken", newRefreshToken); if (originalRequest.headers) { originalRequest.headers.Authorization = `Bearer ${accessToken}`; @@ -81,8 +81,8 @@ apiClient.interceptors.response.use( return apiClient(originalRequest); } catch (refreshError) { useAuthStore.getState().logout(); - if (typeof window !== 'undefined') { - window.location.href = '/login'; + if (typeof window !== "undefined") { + window.location.href = "/login"; } return Promise.reject(refreshError); } diff --git a/next-vote-22nd/tmp.txt b/next-vote-22nd/tmp.txt deleted file mode 100644 index 4be6e81..0000000 --- a/next-vote-22nd/tmp.txt +++ /dev/null @@ -1,21 +0,0 @@ -// src/app/electionSelect/page.tsx -import MiddleBox from "@/components/box/MiddleBox"; - -export default function SelectPage() { - return ( -
- {/* ?이???레??*/} -
- {/* ?스??+ ?이??역 */} -
-

?모?이 ?표

-
-
- - -
-
-
-
- ); -}